2022-10-12 07:14:59 -03:00
/*
* Copyright ( c ) 2022 , Florent Castelli < florent . castelli @ gmail . com >
* Copyright ( c ) 2022 , Sam Atkins < atkinssj @ serenityos . org >
2022-10-15 09:08:07 -03:00
* Copyright ( c ) 2022 , Tobias Christiansen < tobyase @ serenityos . org >
2022-10-18 17:19:03 -03:00
* Copyright ( c ) 2022 , Linus Groh < linusg @ serenityos . org >
2025-02-05 18:05:25 -03:00
* Copyright ( c ) 2022 - 2025 , Tim Flynn < trflynn89 @ ladybird . org >
2022-10-12 07:14:59 -03:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <AK/Debug.h>
2022-11-11 15:58:20 -03:00
# include <AK/JsonObject.h>
# include <AK/JsonValue.h>
2026-06-13 11:06:49 -03:00
# include <AK/ScopeGuard.h>
2024-10-21 10:42:23 -03:00
# include <LibCore/EventLoop.h>
# include <LibCore/Timer.h>
2022-11-17 14:57:14 -03:00
# include <LibWeb/WebDriver/Capabilities.h>
2025-02-07 11:04:45 -03:00
# include <LibWeb/WebDriver/Error.h>
2025-02-05 18:05:25 -03:00
# include <LibWeb/WebDriver/UserPrompt.h>
2022-10-19 12:46:31 -03:00
# include <WebDriver/Client.h>
2025-02-07 11:04:45 -03:00
# include <WebDriver/Session.h>
2022-10-12 07:14:59 -03:00
namespace WebDriver {
2026-06-13 11:06:49 -03:00
template < typename StartTraversal >
static Web : : WebDriver : : Response perform_history_traversal ( Session & session , StartTraversal start_traversal , bool & wait_for_navigation_completion )
{
Optional < Web : : WebDriver : : Response > response ;
RefPtr < WebContentConnection > connection { & session . web_content_connection ( ) } ;
ScopeGuard guard { [ & ] ( ) { connection - > on_driver_execution_complete = nullptr ; } } ;
connection - > on_driver_execution_complete = [ & ] ( auto result ) { response = move ( result ) ; } ;
auto traversal_response = start_traversal ( * connection ) ;
auto immediate_response = TRY ( traversal_response . take_response ( ) ) ;
wait_for_navigation_completion = traversal_response . wait_for_navigation_completion ( ) ;
if ( traversal_response . will_replace_web_content_process ( ) )
session . mark_current_window_as_awaiting_replacement ( * connection ) ;
if ( ! traversal_response . wait_for_driver_execution_complete ( ) )
return immediate_response ;
Core : : EventLoop : : current ( ) . spin_until ( [ & ] ( ) {
return response . has_value ( ) ;
} ) ;
return TRY ( response . release_value ( ) ) ;
}
static ErrorOr < NonnullRefPtr < Session > , Web : : WebDriver : : Error >
find_session_with_ladybird_test_hooks ( Web : : WebDriver : : Parameters const & parameters )
{
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
if ( ! session - > test_hooks_enabled ( ) )
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : UnknownCommand ,
" Ladybird test hooks are not enabled for this session " sv ) ;
return session ;
}
2025-08-10 11:34:51 -03:00
ErrorOr < NonnullRefPtr < Client > > Client : : try_create ( NonnullOwnPtr < Core : : BufferedTCPSocket > socket , LaunchBrowserCallback launch_browser_callback )
2022-10-12 07:14:59 -03:00
{
2025-06-06 16:42:12 -03:00
if ( ! launch_browser_callback )
return Error : : from_string_literal ( " The callback to launch the browser must be provided " ) ;
2022-12-15 10:46:01 -03:00
2022-11-13 01:37:58 -03:00
TRY ( socket - > set_blocking ( true ) ) ;
2025-08-10 11:34:51 -03:00
return adopt_nonnull_ref_or_enomem ( new ( nothrow ) Client ( move ( socket ) , move ( launch_browser_callback ) ) ) ;
2022-10-12 07:14:59 -03:00
}
2025-08-10 11:34:51 -03:00
Client : : Client ( NonnullOwnPtr < Core : : BufferedTCPSocket > socket , LaunchBrowserCallback launch_browser_callback )
: Web : : WebDriver : : Client ( move ( socket ) )
2025-06-06 16:42:12 -03:00
, m_launch_browser_callback ( move ( launch_browser_callback ) )
2022-10-12 07:14:59 -03:00
{
}
2022-11-13 01:37:58 -03:00
Client : : ~ Client ( ) = default ;
2022-10-12 07:14:59 -03:00
2022-10-17 11:12:20 -03:00
// 8.1 New Session, https://w3c.github.io/webdriver/#dfn-new-sessions
// POST /session
2022-11-17 14:57:14 -03:00
Web : : WebDriver : : Response Client : : new_session ( Web : : WebDriver : : Parameters , JsonValue payload )
2022-10-12 07:14:59 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session " ) ;
2025-02-07 11:16:20 -03:00
// 1. If the implementation is an endpoint node, and the list of active HTTP sessions is not empty, or otherwise if
// the implementation is unable to start an additional session, return error with error code session not created.
if ( Session : : session_count ( Web : : WebDriver : : SessionFlags : : Http ) > 0 )
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : SessionNotCreated , " There is already an active HTTP session " sv ) ;
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// FIXME: 2. If the remote end is an intermediary node, take implementation-defined steps that either result in returning
// an error with error code session not created, or in returning a success with data that is isomorphic to that
// returned by remote ends according to the rest of this algorithm. If an error is not returned, the intermediary
// node must retain a reference to the session created on the upstream node as the associated session such that
// commands may be forwarded to this associated session on subsequent commands.
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// 3. Let flags be a set containing "http".
2025-02-07 13:09:28 -03:00
static constexpr auto flags = Web : : WebDriver : : SessionFlags : : Http ;
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// 4. Let capabilities be the result of trying to process capabilities with parameters and flags.
auto capabilities = TRY ( Web : : WebDriver : : process_capabilities ( payload , flags ) ) ;
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// 5. If capabilities's is null, return error with error code session not created.
2022-11-17 14:57:14 -03:00
if ( capabilities . is_null ( ) )
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : SessionNotCreated , " Could not match capabilities " sv ) ;
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// 6. Let session be the result of create a session, with capabilities, and flags.
auto maybe_session = Session : : create ( * this , capabilities . as_object ( ) , flags ) ;
if ( maybe_session . is_error ( ) )
2025-02-17 15:58:21 -03:00
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : SessionNotCreated , MUST ( String : : formatted ( " Failed to start session: {} " , maybe_session . error ( ) ) ) ) ;
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
auto session = maybe_session . release_value ( ) ;
2022-11-22 09:38:07 -03:00
2025-02-05 18:05:25 -03:00
// 7. Let body be a JSON Object initialized with:
2022-10-12 07:14:59 -03:00
JsonObject body ;
2022-10-18 17:29:18 -03:00
// "sessionId"
2025-02-05 18:05:25 -03:00
// session's session ID.
2025-02-17 14:18:27 -03:00
body . set ( " sessionId " sv , JsonValue { session - > session_id ( ) } ) ;
2022-10-18 17:29:18 -03:00
// "capabilities"
// capabilities
2025-02-17 14:18:27 -03:00
body . set ( " capabilities " sv , move ( capabilities ) ) ;
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// 8. Set session' current top-level browsing context to one of the endpoint node's top-level browsing contexts,
// preferring the top-level browsing context that has system focus, or otherwise preferring any top-level
// browsing context whose visibility state is visible.
// NOTE: This happens in the WebContent process.
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// FIXME: 9. Set the request queue to a new queue.
2022-10-12 07:14:59 -03:00
2025-02-05 18:05:25 -03:00
// 10. Return success with data body.
2022-11-13 02:52:44 -03:00
return JsonValue { move ( body ) } ;
2022-10-12 07:14:59 -03:00
}
2022-10-17 11:12:20 -03:00
// 8.2 Delete Session, https://w3c.github.io/webdriver/#dfn-delete-session
// DELETE /session/{session id}
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : delete_session ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-12 07:14:59 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling DELETE /session/<session_id> " ) ;
2025-02-07 11:16:20 -03:00
// 1. If session is an active HTTP session, try to close the session with session.
if ( auto session = Session : : find_session ( parameters [ 0 ] , Web : : WebDriver : : SessionFlags : : Http , Session : : AllowInvalidWindowHandle : : Yes ) ; ! session . is_error ( ) )
2025-02-07 11:04:45 -03:00
session . value ( ) - > close ( ) ;
2022-10-12 07:14:59 -03:00
// 2. Return success with data null.
2022-11-13 02:52:44 -03:00
return JsonValue { } ;
2022-10-12 07:14:59 -03:00
}
2025-02-17 11:10:30 -03:00
// https://w3c.github.io/webdriver/#dfn-readiness-state
static bool readiness_state ( )
{
// The readiness state of a remote end indicates whether it is free to accept new connections. It must be false if
// the implementation is an endpoint node and the list of active HTTP sessions is not empty, or otherwise if the
// remote end is known to be in a state in which attempting to create new sessions would fail. In all other cases it
// must be true.
return Session : : session_count ( Web : : WebDriver : : SessionFlags : : Http ) = = 0 ;
}
2022-10-17 11:12:20 -03:00
// 8.3 Status, https://w3c.github.io/webdriver/#dfn-status
// GET /status
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_status ( Web : : WebDriver : : Parameters , JsonValue )
2022-10-12 07:14:59 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /status " ) ;
2025-02-17 11:10:30 -03:00
auto readiness_state = WebDriver : : readiness_state ( ) ;
2022-10-07 13:17:21 -03:00
// 1. Let body be a new JSON Object with the following properties:
// "ready"
2025-02-17 11:10:30 -03:00
// The remote end's readiness state.
2022-10-07 13:17:21 -03:00
// "message"
2025-02-17 11:10:30 -03:00
// An implementation-defined string explaining the remote end's readiness state.
2022-10-07 13:17:21 -03:00
JsonObject body ;
2025-02-17 14:18:27 -03:00
body . set ( " ready " sv , readiness_state ) ;
2025-02-17 15:21:07 -03:00
body . set ( " message " sv , MUST ( String : : formatted ( " {} to accept a new session " , readiness_state ? " Ready " sv : " Not ready " sv ) ) ) ;
2022-10-07 13:17:21 -03:00
// 2. Return success with data body.
2022-11-08 11:42:36 -03:00
return JsonValue { body } ;
2022-10-12 07:14:59 -03:00
}
2022-10-19 12:46:31 -03:00
// 9.1 Get Timeouts, https://w3c.github.io/webdriver/#dfn-get-timeouts
// GET /session/{session id}/timeouts
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_timeouts ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-19 12:46:31 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session id>/timeouts " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2022-11-11 16:28:57 -03:00
return session - > web_content_connection ( ) . get_timeouts ( ) ;
2022-10-19 12:46:31 -03:00
}
2022-10-19 13:07:30 -03:00
// 9.2 Set Timeouts, https://w3c.github.io/webdriver/#dfn-set-timeouts
// POST /session/{session id}/timeouts
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : set_timeouts ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-19 13:07:30 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session id>/timeouts " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-04 10:37:16 -03:00
return session - > set_timeouts ( move ( payload ) ) ;
2022-10-19 13:07:30 -03:00
}
2022-10-17 11:12:20 -03:00
// 10.1 Navigate To, https://w3c.github.io/webdriver/#dfn-navigate-to
// POST /session/{session id}/url
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : navigate_to ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-12 07:14:59 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/url " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
2026-06-13 11:06:49 -03:00
auto response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
auto navigate_response = connection . navigate_to ( move ( payload ) ) ;
return navigate_response . response ( ) ;
} ,
Session : : WebContentReplacement : : Allow ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
return response ;
2022-10-12 07:14:59 -03:00
}
2022-10-17 11:12:20 -03:00
// 10.2 Get Current URL, https://w3c.github.io/webdriver/#dfn-get-current-url
// GET /session/{session id}/url
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_current_url ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-12 07:14:59 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/url " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_current_url ( ) ;
} ) ;
2022-10-12 07:14:59 -03:00
}
2022-10-17 11:19:45 -03:00
// 10.3 Back, https://w3c.github.io/webdriver/#dfn-back
// POST /session/{session id}/back
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : back ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-12 07:14:59 -03:00
{
2022-10-17 11:19:45 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/back " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
2026-06-13 11:06:49 -03:00
bool wait_for_navigation_completion = true ;
auto response = TRY ( perform_history_traversal ( * session , [ & ] ( auto & connection ) { return connection . back ( ) ; } , wait_for_navigation_completion ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
if ( wait_for_navigation_completion ) {
response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
}
return response ;
2022-10-12 07:14:59 -03:00
}
2022-10-17 11:19:45 -03:00
// 10.4 Forward, https://w3c.github.io/webdriver/#dfn-forward
// POST /session/{session id}/forward
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : forward ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-12 07:14:59 -03:00
{
2022-10-17 11:19:45 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/forward " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
2026-06-13 11:06:49 -03:00
bool wait_for_navigation_completion = true ;
auto response = TRY ( perform_history_traversal ( * session , [ & ] ( auto & connection ) { return connection . forward ( ) ; } , wait_for_navigation_completion ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
if ( wait_for_navigation_completion ) {
response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
}
return response ;
2022-10-12 07:14:59 -03:00
}
2022-10-17 11:12:20 -03:00
// 10.5 Refresh, https://w3c.github.io/webdriver/#dfn-refresh
// POST /session/{session id}/refresh
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : refresh ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-14 13:09:33 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/refresh " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
2026-06-13 11:06:49 -03:00
auto response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
2024-11-03 11:39:18 -03:00
return connection . refresh ( ) ;
2026-06-13 11:06:49 -03:00
} ) ) ;
if ( TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) )
response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ) ;
return response ;
2022-10-14 13:09:33 -03:00
}
2022-10-17 11:19:45 -03:00
// 10.6 Get Title, https://w3c.github.io/webdriver/#dfn-get-title
// GET /session/{session id}/title
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_title ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-15 14:15:38 -03:00
{
2022-10-17 11:19:45 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/title " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_title ( ) ;
} ) ;
2022-10-15 14:15:38 -03:00
}
2026-06-13 11:06:49 -03:00
// Extension: POST /session/{session id}/ladybird/crash-current-page
Web : : WebDriver : : Response Client : : crash_current_page ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/ladybird/crash-current-page " ) ;
auto session = TRY ( find_session_with_ladybird_test_hooks ( parameters ) ) ;
RefPtr connection { & session - > web_content_connection ( ) } ;
session - > mark_current_window_as_awaiting_replacement ( * connection ) ;
connection - > async_crash_current_page ( ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ;
}
// Extension: POST /session/{session id}/ladybird/load-url-from-ui
Web : : WebDriver : : Response Client : : load_url_from_ui ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/ladybird/load-url-from-ui " ) ;
auto session = TRY ( find_session_with_ladybird_test_hooks ( parameters ) ) ;
RefPtr previous_connection { & session - > web_content_connection ( ) } ;
2026-06-22 01:27:26 -03:00
auto response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) - > Web : : WebDriver : : Response {
auto reply = connection . template send_sync_but_allow_failure < Messages : : WebDriverClient : : LoadUrlFromUi > ( move ( payload ) ) ;
if ( ! reply )
return JsonValue { } ;
return reply - > take_response ( ) ;
2026-06-13 11:06:49 -03:00
} ) ) ;
if ( response . is_object ( ) & & response . as_object ( ) . get_bool ( " willReplaceWebContentProcess " sv ) . value_or ( false ) )
session - > mark_current_window_as_awaiting_replacement ( * previous_connection ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
return response ;
}
// Extension: POST /session/{session id}/ladybird/traverse-history-from-ui
Web : : WebDriver : : Response Client : : traverse_history_from_ui ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/ladybird/traverse-history-from-ui " ) ;
auto session = TRY ( find_session_with_ladybird_test_hooks ( parameters ) ) ;
auto wait_for_navigation_completion = true ;
if ( payload . is_object ( ) )
wait_for_navigation_completion = payload . as_object ( ) . get_bool ( " waitForNavigationCompletion " sv ) . value_or ( true ) ;
RefPtr previous_connection { & session - > web_content_connection ( ) } ;
auto response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . traverse_history_from_ui ( move ( payload ) ) ;
} ) ) ;
if ( response . is_object ( ) & & response . as_object ( ) . get_bool ( " willReplaceWebContentProcess " sv ) . value_or ( false ) )
session - > mark_current_window_as_awaiting_replacement ( * previous_connection ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
if ( ! wait_for_navigation_completion )
return JsonValue { } ;
response = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . wait_for_navigation_completion ( ) ;
} ) ) ;
TRY ( session - > wait_for_current_window_to_have_web_content_connection ( ) ) ;
return response ;
}
// Extension: POST /session/{session id}/ladybird/mark-web-content-session-history-stale
Web : : WebDriver : : Response Client : : mark_web_content_session_history_stale ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/ladybird/mark-web-content-session-history-stale " ) ;
auto session = TRY ( find_session_with_ladybird_test_hooks ( parameters ) ) ;
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . mark_web_content_session_history_stale ( ) ;
} ) ;
}
// Extension: GET /session/{session id}/ladybird/session-history
Web : : WebDriver : : Response Client : : get_session_history ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/ladybird/session-history " ) ;
auto session = TRY ( find_session_with_ladybird_test_hooks ( parameters ) ) ;
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_session_history ( ) ;
} ) ;
}
2022-10-18 17:19:03 -03:00
// 11.1 Get Window Handle, https://w3c.github.io/webdriver/#get-window-handle
// GET /session/{session id}/window
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_window_handle ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-18 17:19:03 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/window " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2023-03-05 19:57:36 -03:00
2023-03-07 13:29:14 -03:00
// 1. If the current top-level browsing context is no longer open, return error with error code no such window.
TRY ( session - > web_content_connection ( ) . ensure_top_level_browsing_context_is_open ( ) ) ;
2023-03-05 19:57:36 -03:00
// 2. Return success with data being the window handle associated with the current top-level browsing context.
return JsonValue { session - > current_window_handle ( ) } ;
2022-10-18 17:19:03 -03:00
}
2022-10-17 11:19:45 -03:00
// 11.2 Close Window, https://w3c.github.io/webdriver/#dfn-close-window
// DELETE /session/{session id}/window
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : close_window ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-15 14:18:35 -03:00
{
2022-10-17 11:19:45 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling DELETE /session/<session_id>/window " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2023-03-05 19:57:36 -03:00
return session - > close_window ( ) ;
2022-10-15 14:18:35 -03:00
}
2022-11-24 23:32:53 -03:00
// 11.3 Switch to Window, https://w3c.github.io/webdriver/#dfn-switch-to-window
// POST /session/{session id}/window
Web : : WebDriver : : Response Client : : switch_to_window ( Web : : WebDriver : : Parameters parameters , AK : : JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window " ) ;
2025-02-07 11:16:20 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] , Web : : WebDriver : : SessionFlags : : Default , Session : : AllowInvalidWindowHandle : : Yes ) ) ;
2023-03-05 19:57:36 -03:00
if ( ! payload . is_object ( ) )
2025-02-17 15:58:21 -03:00
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : InvalidArgument , " Payload is not a JSON object " sv ) ;
2023-03-05 19:57:36 -03:00
// 1. Let handle be the result of getting the property "handle" from the parameters argument.
auto handle = payload . as_object ( ) . get ( " handle " sv ) ;
// 2. If handle is undefined, return error with error code invalid argument.
if ( ! handle . has_value ( ) )
2025-02-17 15:58:21 -03:00
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : InvalidArgument , " No property called 'handle' present " sv ) ;
2023-03-05 19:57:36 -03:00
2024-01-06 17:49:17 -03:00
return session - > switch_to_window ( handle - > as_string ( ) ) ;
2022-11-24 23:32:53 -03:00
}
2022-10-19 16:41:09 -03:00
// 11.4 Get Window Handles, https://w3c.github.io/webdriver/#dfn-get-window-handles
// GET /session/{session id}/window/handles
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_window_handles ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-19 16:41:09 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/window/handles " ) ;
2025-02-07 11:16:20 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] , Web : : WebDriver : : SessionFlags : : Default , Session : : AllowInvalidWindowHandle : : Yes ) ) ;
2023-03-05 19:57:36 -03:00
return session - > get_window_handles ( ) ;
2022-10-19 16:41:09 -03:00
}
2023-03-14 08:09:50 -03:00
// 11.5 New Window, https://w3c.github.io/webdriver/#dfn-new-window
// POST /session/{session id}/window/new
Web : : WebDriver : : Response Client : : new_window ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window/new " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-10-21 10:42:23 -03:00
2024-11-03 11:39:18 -03:00
auto handle = TRY ( session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . new_window ( move ( payload ) ) ;
} ) ) ;
static constexpr u32 CONNECTION_TIMEOUT_MS = 5000 ;
2024-10-21 10:42:23 -03:00
auto timeout_fired = false ;
auto timer = Core : : Timer : : create_single_shot ( CONNECTION_TIMEOUT_MS , [ & timeout_fired ] { timeout_fired = true ; } ) ;
timer - > start ( ) ;
Core : : EventLoop : : current ( ) . spin_until ( [ & session , & timeout_fired , handle = handle . as_object ( ) . get ( " handle " sv ) - > as_string ( ) ] ( ) {
return session - > has_window_handle ( handle ) | | timeout_fired ;
} ) ;
if ( timeout_fired )
2025-02-17 15:58:21 -03:00
return Web : : WebDriver : : Error : : from_code ( Web : : WebDriver : : ErrorCode : : Timeout , " Timed out waiting for window handle " sv ) ;
2024-10-21 10:42:23 -03:00
return handle ;
2023-03-14 08:09:50 -03:00
}
2024-09-07 16:41:54 -03:00
// 11.6 Switch To Frame, https://w3c.github.io/webdriver/#dfn-switch-to-frame
// POST /session/{session id}/frame
Web : : WebDriver : : Response Client : : switch_to_frame ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
2024-09-08 09:14:52 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/frame " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . switch_to_frame ( move ( payload ) ) ;
} ) ;
2024-09-07 16:41:54 -03:00
}
// 11.7 Switch To Parent Frame, https://w3c.github.io/webdriver/#dfn-switch-to-parent-frame
// POST /session/{session id}/frame/parent
Web : : WebDriver : : Response Client : : switch_to_parent_frame ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
2024-09-08 09:14:52 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/frame/parent " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . switch_to_parent_frame ( move ( payload ) ) ;
} ) ;
2024-09-07 16:41:54 -03:00
}
2022-11-02 11:19:58 -03:00
// 11.8.1 Get Window Rect, https://w3c.github.io/webdriver/#dfn-get-window-rect
// GET /session/{session id}/window/rect
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_window_rect ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-02 11:19:58 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/window/rect " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_window_rect ( ) ;
} ) ;
2022-11-02 11:19:58 -03:00
}
2022-11-02 10:33:24 -03:00
// 11.8.2 Set Window Rect, https://w3c.github.io/webdriver/#dfn-set-window-rect
// POST /session/{session id}/window/rect
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : set_window_rect ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-11-02 10:33:24 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window/rect " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . set_window_rect ( move ( payload ) ) ;
} ) ;
2022-11-02 10:33:24 -03:00
}
2022-11-02 10:44:43 -03:00
// 11.8.3 Maximize Window, https://w3c.github.io/webdriver/#dfn-maximize-window
// POST /session/{session id}/window/maximize
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : maximize_window ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-02 10:44:43 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window/maximize " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . maximize_window ( ) ;
} ) ;
2022-11-02 10:44:43 -03:00
}
2022-11-02 11:01:51 -03:00
// 11.8.4 Minimize Window, https://w3c.github.io/webdriver/#minimize-window
// POST /session/{session id}/window/minimize
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : minimize_window ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-02 11:01:51 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window/minimize " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . minimize_window ( ) ;
} ) ;
2022-11-02 11:01:51 -03:00
}
2022-11-09 15:09:17 -03:00
// 11.8.5 Fullscreen Window, https://w3c.github.io/webdriver/#dfn-fullscreen-window
// POST /session/{session id}/window/fullscreen
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : fullscreen_window ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-09 15:09:17 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window/fullscreen " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . fullscreen_window ( ) ;
} ) ;
2022-11-09 15:09:17 -03:00
}
2024-05-29 14:14:42 -03:00
// Extension: Consume User Activation, https://html.spec.whatwg.org/multipage/interaction.html#user-activation-user-agent-automation
// POST /session/{session id}/window/consume-user-activation
Web : : WebDriver : : Response Client : : consume_user_activation ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/window/consume-user-activation " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-05-29 14:14:42 -03:00
return session - > web_content_connection ( ) . consume_user_activation ( ) ;
}
2022-10-18 07:47:19 -03:00
// 12.3.2 Find Element, https://w3c.github.io/webdriver/#dfn-find-element
// POST /session/{session id}/element
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : find_element ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-18 07:47:19 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/element " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . find_element ( move ( payload ) ) ;
} ) ;
2022-10-18 07:47:19 -03:00
}
2022-10-19 08:21:38 -03:00
// 12.3.3 Find Elements, https://w3c.github.io/webdriver/#dfn-find-elements
// POST /session/{session id}/elements
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : find_elements ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-19 08:21:38 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/elements " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . find_elements ( move ( payload ) ) ;
} ) ;
2022-10-19 08:21:38 -03:00
}
2022-10-19 08:51:34 -03:00
// 12.3.4 Find Element From Element, https://w3c.github.io/webdriver/#dfn-find-element-from-element
2022-11-02 11:19:45 -03:00
// POST /session/{session id}/element/{element id}/element
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : find_element_from_element ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-19 08:51:34 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/element/<element_id>/element " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . find_element_from_element ( move ( payload ) , move ( parameters [ 1 ] ) ) ;
} ) ;
2022-10-19 08:51:34 -03:00
}
2022-10-19 08:52:17 -03:00
// 12.3.5 Find Elements From Element, https://w3c.github.io/webdriver/#dfn-find-elements-from-element
// POST /session/{session id}/element/{element id}/elements
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : find_elements_from_element ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-19 08:52:17 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/element/<element_id>/elements " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . find_elements_from_element ( move ( payload ) , move ( parameters [ 1 ] ) ) ;
} ) ;
2022-10-19 08:52:17 -03:00
}
2022-11-14 21:48:48 -03:00
// 12.3.6 Find Element From Shadow Root, https://w3c.github.io/webdriver/#find-element-from-shadow-root
// POST /session/{session id}/shadow/{shadow id}/element
Web : : WebDriver : : Response Client : : find_element_from_shadow_root ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/shadow/<shadow_id>/element " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . find_element_from_shadow_root ( move ( payload ) , move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-14 21:48:48 -03:00
}
2022-11-14 21:54:17 -03:00
// 12.3.7 Find Elements From Shadow Root, https://w3c.github.io/webdriver/#find-elements-from-shadow-root
// POST /session/{session id}/shadow/{shadow id}/elements
Web : : WebDriver : : Response Client : : find_elements_from_shadow_root ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/shadow/<shadow_id>/elements " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . find_elements_from_shadow_root ( move ( payload ) , move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-14 21:54:17 -03:00
}
2022-11-14 21:02:23 -03:00
// 12.3.8 Get Active Element, https://w3c.github.io/webdriver/#get-active-element
// GET /session/{session id}/element/active
Web : : WebDriver : : Response Client : : get_active_element ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/active " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_active_element ( ) ;
} ) ;
2022-11-14 21:02:23 -03:00
}
2022-11-14 21:27:11 -03:00
// 12.3.9 Get Element Shadow Root, https://w3c.github.io/webdriver/#get-element-shadow-root
// GET /session/{session id}/element/{element id}/shadow
Web : : WebDriver : : Response Client : : get_element_shadow_root ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/shadow " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_shadow_root ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-14 21:27:11 -03:00
}
2022-11-03 18:05:47 -03:00
// 12.4.1 Is Element Selected, https://w3c.github.io/webdriver/#dfn-is-element-selected
// GET /session/{session id}/element/{element id}/selected
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : is_element_selected ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-03 18:05:47 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/selected " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . is_element_selected ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-03 18:05:47 -03:00
}
2022-10-19 11:58:14 -03:00
// 12.4.2 Get Element Attribute, https://w3c.github.io/webdriver/#dfn-get-element-attribute
// GET /session/{session id}/element/{element id}/attribute/{name}
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_element_attribute ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-19 11:58:14 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/attribute/<name> " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_attribute ( move ( parameters [ 1 ] ) , move ( parameters [ 2 ] ) ) ;
} ) ;
2022-10-19 11:58:14 -03:00
}
2022-10-19 15:46:56 -03:00
// 12.4.3 Get Element Property, https://w3c.github.io/webdriver/#dfn-get-element-property
2022-11-02 11:19:45 -03:00
// GET /session/{session id}/element/{element id}/property/{name}
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_element_property ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-19 15:46:56 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/property/<name> " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_property ( move ( parameters [ 1 ] ) , move ( parameters [ 2 ] ) ) ;
} ) ;
2022-10-19 15:46:56 -03:00
}
2022-10-20 07:06:52 -03:00
// 12.4.4 Get Element CSS Value, https://w3c.github.io/webdriver/#dfn-get-element-css-value
// GET /session/{session id}/element/{element id}/css/{property name}
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_element_css_value ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-20 07:06:52 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/css/<property_name> " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_css_value ( move ( parameters [ 1 ] ) , move ( parameters [ 2 ] ) ) ;
} ) ;
2022-10-20 07:06:52 -03:00
}
2022-11-01 06:12:50 -03:00
// 12.4.5 Get Element Text, https://w3c.github.io/webdriver/#dfn-get-element-text
// GET /session/{session id}/element/{element id}/text
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_element_text ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-01 06:12:50 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/text " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_text ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-01 06:12:50 -03:00
}
2022-10-20 17:40:32 -03:00
// 12.4.6 Get Element Tag Name, https://w3c.github.io/webdriver/#dfn-get-element-tag-name
// GET /session/{session id}/element/{element id}/name
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_element_tag_name ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-20 17:40:32 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/name " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_tag_name ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-10-20 17:40:32 -03:00
}
2022-11-03 13:53:27 -03:00
// 12.4.7 Get Element Rect, https://w3c.github.io/webdriver/#dfn-get-element-rect
// GET /session/{session id}/element/{element id}/rect
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_element_rect ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-03 13:53:27 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/rect " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_element_rect ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-03 13:53:27 -03:00
}
2022-11-03 14:31:08 -03:00
// 12.4.8 Is Element Enabled, https://w3c.github.io/webdriver/#dfn-is-element-enabled
// GET /session/{session id}/element/{element id}/enabled
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : is_element_enabled ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-03 14:31:08 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/enabled " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . is_element_enabled ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-03 14:31:08 -03:00
}
2023-01-15 13:26:08 -03:00
// 12.4.9 https://w3c.github.io/webdriver/#dfn-get-computed-role
// GET /session/{session id}/element/{element id}/computedrole
Web : : WebDriver : : Response Client : : get_computed_role ( Web : : WebDriver : : Parameters parameters , AK : : JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session id>/element/<element id>/computedrole " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_computed_role ( move ( parameters [ 1 ] ) ) ;
} ) ;
2023-01-15 13:26:08 -03:00
}
2023-02-19 14:36:08 -03:00
// 12.4.10 Get Computed Label, https://w3c.github.io/webdriver/#get-computed-label
// GET /session/{session id}/element/{element id}/computedlabel
Web : : WebDriver : : Response Client : : get_computed_label ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session id>/element/<element id>/computedlabel " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_computed_label ( move ( parameters [ 1 ] ) ) ;
} ) ;
2023-02-19 14:36:08 -03:00
}
2022-12-23 22:17:06 -03:00
// 12.5.1 Element Click, https://w3c.github.io/webdriver/#element-click
// POST /session/{session id}/element/{element id}/click
2023-01-26 11:11:54 -03:00
Web : : WebDriver : : Response Client : : element_click ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-12-23 22:17:06 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/element/<element_id>/click " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . element_click ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-12-23 22:17:06 -03:00
}
2024-09-07 16:41:54 -03:00
// 12.5.2 Element Clear, https://w3c.github.io/webdriver/#dfn-element-clear
// POST /session/{session id}/element/{element id}/clear
Web : : WebDriver : : Response Client : : element_clear ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
2024-09-08 09:14:52 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/element/<element_id>/clear " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . element_clear ( move ( parameters [ 1 ] ) ) ;
} ) ;
2024-09-07 16:41:54 -03:00
}
// 12.5.3 Element Send Keys, https://w3c.github.io/webdriver/#dfn-element-send-keys
// POST /session/{session id}/element/{element id}/value
2024-09-25 12:26:46 -03:00
Web : : WebDriver : : Response Client : : element_send_keys ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2024-09-07 16:41:54 -03:00
{
2024-09-08 09:14:52 -03:00
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/element/<element_id>/value " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . element_send_keys ( move ( parameters [ 1 ] ) , move ( payload ) ) ;
} ) ;
2024-09-07 16:41:54 -03:00
}
2022-11-02 21:26:06 -03:00
// 13.1 Get Page Source, https://w3c.github.io/webdriver/#dfn-get-page-source
// GET /session/{session id}/source
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_source ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-02 21:26:06 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/source " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_source ( ) ;
} ) ;
2022-11-02 21:26:06 -03:00
}
2022-11-02 15:11:04 -03:00
// 13.2.1 Execute Script, https://w3c.github.io/webdriver/#dfn-execute-script
// POST /session/{session id}/execute/sync
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : execute_script ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-11-02 15:11:04 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/execute/sync " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . execute_script ( move ( payload ) ) ;
} ) ;
2022-11-02 15:11:04 -03:00
}
2022-11-02 15:12:28 -03:00
// 13.2.2 Execute Async Script, https://w3c.github.io/webdriver/#dfn-execute-async-script
// POST /session/{session id}/execute/async
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : execute_async_script ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-11-02 15:12:28 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/execute/async " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . execute_async_script ( move ( payload ) ) ;
} ) ;
2022-11-02 15:12:28 -03:00
}
2022-10-17 11:12:20 -03:00
// 14.1 Get All Cookies, https://w3c.github.io/webdriver/#dfn-get-all-cookies
// GET /session/{session id}/cookie
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_all_cookies ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-15 09:08:07 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/cookie " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_all_cookies ( ) ;
} ) ;
2022-10-15 09:08:07 -03:00
}
2022-10-17 11:12:20 -03:00
// 14.2 Get Named Cookie, https://w3c.github.io/webdriver/#dfn-get-named-cookie
// GET /session/{session id}/cookie/{name}
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : get_named_cookie ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-15 14:22:20 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/cookie/<name> " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . get_named_cookie ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-10-15 14:22:20 -03:00
}
2022-10-17 11:12:20 -03:00
// 14.3 Add Cookie, https://w3c.github.io/webdriver/#dfn-adding-a-cookie
// POST /session/{session id}/cookie
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : add_cookie ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-10-17 08:20:57 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/cookie " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . add_cookie ( move ( payload ) ) ;
} ) ;
2022-10-17 08:20:57 -03:00
}
2022-10-17 11:12:20 -03:00
// 14.4 Delete Cookie, https://w3c.github.io/webdriver/#dfn-delete-cookie
// DELETE /session/{session id}/cookie/{name}
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : delete_cookie ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-16 14:55:47 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling DELETE /session/<session_id>/cookie/<name> " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . delete_cookie ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-10-16 14:55:47 -03:00
}
2022-10-17 11:12:20 -03:00
// 14.5 Delete All Cookies, https://w3c.github.io/webdriver/#dfn-delete-all-cookies
// DELETE /session/{session id}/cookie
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : delete_all_cookies ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-10-16 14:55:01 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling DELETE /session/<session_id>/cookie " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-03 11:39:18 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . delete_all_cookies ( ) ;
} ) ;
2022-10-16 14:55:01 -03:00
}
2024-09-02 15:41:24 -03:00
// 15.7 Perform Actions, https://w3c.github.io/webdriver/#perform-actions
// POST /session/{session id}/actions
2024-09-25 12:26:46 -03:00
Web : : WebDriver : : Response Client : : perform_actions ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2024-09-02 15:41:24 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/actions " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . perform_actions ( move ( payload ) ) ;
2026-06-13 11:06:49 -03:00
} ,
Session : : WebContentReplacement : : Allow ) ;
2024-09-02 15:41:24 -03:00
}
2023-06-17 12:36:00 -03:00
// 15.8 Release Actions, https://w3c.github.io/webdriver/#release-actions
// DELETE /session/{session id}/actions
Web : : WebDriver : : Response Client : : release_actions ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling DELETE /session/<session_id>/actions " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2025-02-03 11:38:43 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . release_actions ( ) ;
} ) ;
2023-06-17 12:36:00 -03:00
}
2022-11-16 09:15:57 -03:00
// 16.1 Dismiss Alert, https://w3c.github.io/webdriver/#dismiss-alert
// POST /session/{session id}/alert/dismiss
Web : : WebDriver : : Response Client : : dismiss_alert ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/alert/dismiss " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . dismiss_alert ( ) ;
} ) ;
2022-11-16 09:15:57 -03:00
}
2022-11-16 09:24:22 -03:00
// 16.2 Accept Alert, https://w3c.github.io/webdriver/#accept-alert
// POST /session/{session id}/alert/accept
Web : : WebDriver : : Response Client : : accept_alert ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/alert/accept " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . accept_alert ( ) ;
} ) ;
2022-11-16 09:24:22 -03:00
}
2022-11-16 10:26:48 -03:00
// 16.3 Get Alert Text, https://w3c.github.io/webdriver/#get-alert-text
// GET /session/{session id}/alert/text
Web : : WebDriver : : Response Client : : get_alert_text ( Web : : WebDriver : : Parameters parameters , JsonValue )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/alert/text " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2022-11-16 10:26:48 -03:00
return session - > web_content_connection ( ) . get_alert_text ( ) ;
}
2022-11-16 10:57:05 -03:00
// 16.4 Send Alert Text, https://w3c.github.io/webdriver/#send-alert-text
// POST /session/{session id}/alert/text
Web : : WebDriver : : Response Client : : send_alert_text ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session_id>/alert/text " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2022-11-16 10:57:05 -03:00
return session - > web_content_connection ( ) . send_alert_text ( payload ) ;
}
2022-11-02 13:59:02 -03:00
// 17.1 Take Screenshot, https://w3c.github.io/webdriver/#take-screenshot
// GET /session/{session id}/screenshot
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : take_screenshot ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-02 13:59:02 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/screenshot " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . take_screenshot ( ) ;
} ) ;
2022-11-02 13:59:02 -03:00
}
2022-11-04 21:28:42 -03:00
// 17.2 Take Element Screenshot, https://w3c.github.io/webdriver/#dfn-take-element-screenshot
// GET /session/{session id}/element/{element id}/screenshot
2022-11-13 01:37:58 -03:00
Web : : WebDriver : : Response Client : : take_element_screenshot ( Web : : WebDriver : : Parameters parameters , JsonValue )
2022-11-04 21:28:42 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling GET /session/<session_id>/element/<element_id>/screenshot " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-11-01 08:42:21 -03:00
return session - > perform_async_action ( [ & ] ( auto & connection ) {
return connection . take_element_screenshot ( move ( parameters [ 1 ] ) ) ;
} ) ;
2022-11-04 21:28:42 -03:00
}
2022-11-26 20:30:03 -03:00
// 18.1 Print Page, https://w3c.github.io/webdriver/#dfn-print-page
// POST /session/{session id}/print
2024-09-25 12:26:46 -03:00
Web : : WebDriver : : Response Client : : print_page ( Web : : WebDriver : : Parameters parameters , JsonValue payload )
2022-11-26 20:30:03 -03:00
{
dbgln_if ( WEBDRIVER_DEBUG , " Handling POST /session/<session id>/print " ) ;
2025-02-07 11:04:45 -03:00
auto session = TRY ( Session : : find_session ( parameters [ 0 ] ) ) ;
2024-09-25 12:26:46 -03:00
return session - > web_content_connection ( ) . print_page ( move ( payload ) ) ;
2022-11-26 20:30:03 -03:00
}
2022-10-12 07:14:59 -03:00
}