diff --git a/Userland/Services/WebContent/WebDriverClient.ipc b/Userland/Services/WebContent/WebDriverClient.ipc index d54d023f4f3..5ef1de98318 100644 --- a/Userland/Services/WebContent/WebDriverClient.ipc +++ b/Userland/Services/WebContent/WebDriverClient.ipc @@ -15,7 +15,7 @@ endpoint WebDriverClient { forward() => (Web::WebDriver::Response response) refresh() => (Web::WebDriver::Response response) get_title() => (Web::WebDriver::Response response) - get_window_handle() => (String handle) + get_window_handle() => (Web::WebDriver::Response response) close_window() => (Web::WebDriver::Response response) switch_to_window(String handle) => (Web::WebDriver::Response response) new_window(JsonValue payload) => (Web::WebDriver::Response response) diff --git a/Userland/Services/WebContent/WebDriverConnection.cpp b/Userland/Services/WebContent/WebDriverConnection.cpp index df8103fdc8c..a7068275404 100644 --- a/Userland/Services/WebContent/WebDriverConnection.cpp +++ b/Userland/Services/WebContent/WebDriverConnection.cpp @@ -390,7 +390,11 @@ Messages::WebDriverClient::GetTitleResponse WebDriverConnection::get_title() // 11.1 Get Window Handle, https://w3c.github.io/webdriver/#get-window-handle Messages::WebDriverClient::GetWindowHandleResponse WebDriverConnection::get_window_handle() { - return current_top_level_browsing_context()->top_level_traversable()->window_handle(); + // 1. If session's current top-level browsing context is no longer open, return error with error code no such window. + TRY(ensure_current_top_level_browsing_context_is_open()); + + // 2. Return success with data being the window handle associated with session's current top-level browsing context. + return JsonValue { current_top_level_browsing_context()->top_level_traversable()->window_handle() }; } // 11.2 Close Window, https://w3c.github.io/webdriver/#dfn-close-window diff --git a/Userland/Services/WebDriver/Session.cpp b/Userland/Services/WebDriver/Session.cpp index e9cca258085..ddcb4a11de6 100644 --- a/Userland/Services/WebDriver/Session.cpp +++ b/Userland/Services/WebDriver/Session.cpp @@ -73,7 +73,14 @@ ErrorOr> Session::create_server(NonnullRefPtrget_window_handle(); + auto maybe_window_handle = web_content_connection->get_window_handle(); + if (maybe_window_handle.is_error()) { + promise->reject(Error::from_string_literal("Window was closed immediately")); + return; + } + + auto window_handle = MUST(String::from_byte_string(maybe_window_handle.value().as_string())); + web_content_connection->on_close = [this, window_handle]() { dbgln_if(WEBDRIVER_DEBUG, "Window {} was closed remotely.", window_handle); m_windows.remove(window_handle);