Browse Source

WebContent+WebDriver: Handle when new windows are immediately closed

This happens when window.close() is invoked immediately upon a window
being opened.
Timothy Flynn 9 months ago
parent
commit
ce11a90726

+ 1 - 1
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)

+ 5 - 1
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

+ 8 - 1
Userland/Services/WebDriver/Session.cpp

@@ -73,7 +73,14 @@ ErrorOr<NonnullRefPtr<Core::LocalServer>> Session::create_server(NonnullRefPtr<S
         dbgln("WebDriver is connected to WebContent socket");
         auto web_content_connection = maybe_connection.release_value();
 
-        auto window_handle = web_content_connection->get_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);