diff --git a/Userland/Libraries/LibWeb/WebDriver/Client.cpp b/Userland/Libraries/LibWeb/WebDriver/Client.cpp index 6161e8b61f6..18500e04f27 100644 --- a/Userland/Libraries/LibWeb/WebDriver/Client.cpp +++ b/Userland/Libraries/LibWeb/WebDriver/Client.cpp @@ -65,6 +65,7 @@ static constexpr auto s_webdriver_endpoints = Array { ROUTE(DELETE, "/session/:session_id/window"sv, close_window), ROUTE(POST, "/session/:session_id/window"sv, switch_to_window), ROUTE(GET, "/session/:session_id/window/handles"sv, get_window_handles), + ROUTE(POST, "/session/:session_id/window/new"sv, new_window), ROUTE(GET, "/session/:session_id/window/rect"sv, get_window_rect), ROUTE(POST, "/session/:session_id/window/rect"sv, set_window_rect), ROUTE(POST, "/session/:session_id/window/maximize"sv, maximize_window), diff --git a/Userland/Libraries/LibWeb/WebDriver/Client.h b/Userland/Libraries/LibWeb/WebDriver/Client.h index 9ae648cce9d..10a2b950ea9 100644 --- a/Userland/Libraries/LibWeb/WebDriver/Client.h +++ b/Userland/Libraries/LibWeb/WebDriver/Client.h @@ -50,6 +50,7 @@ public: // 11. Contexts, https://w3c.github.io/webdriver/#contexts virtual Response get_window_handle(Parameters parameters, JsonValue payload) = 0; virtual Response close_window(Parameters parameters, JsonValue payload) = 0; + virtual Response new_window(Parameters parameters, JsonValue payload) = 0; virtual Response switch_to_window(Parameters parameters, JsonValue payload) = 0; virtual Response get_window_handles(Parameters parameters, JsonValue payload) = 0; virtual Response get_window_rect(Parameters parameters, JsonValue payload) = 0; diff --git a/Userland/Services/WebContent/WebDriverClient.ipc b/Userland/Services/WebContent/WebDriverClient.ipc index 035e37d714d..3ae9553102a 100644 --- a/Userland/Services/WebContent/WebDriverClient.ipc +++ b/Userland/Services/WebContent/WebDriverClient.ipc @@ -16,6 +16,7 @@ endpoint WebDriverClient { refresh() => (Web::WebDriver::Response response) get_title() => (Web::WebDriver::Response response) close_window() => (Web::WebDriver::Response response) + new_window(JsonValue payload) => (Web::WebDriver::Response response) get_window_rect() => (Web::WebDriver::Response response) set_window_rect(JsonValue payload) => (Web::WebDriver::Response response) maximize_window() => (Web::WebDriver::Response response) diff --git a/Userland/Services/WebContent/WebDriverConnection.cpp b/Userland/Services/WebContent/WebDriverConnection.cpp index bd32b97ea12..bd157d4f706 100644 --- a/Userland/Services/WebContent/WebDriverConnection.cpp +++ b/Userland/Services/WebContent/WebDriverConnection.cpp @@ -536,6 +536,45 @@ Messages::WebDriverClient::CloseWindowResponse WebDriverConnection::close_window return JsonValue {}; } +// 11.5 New Window, https://w3c.github.io/webdriver/#dfn-new-window +Messages::WebDriverClient::NewWindowResponse WebDriverConnection::new_window(JsonValue const&) +{ + // 1. If the implementation does not support creating new top-level browsing contexts, return error with error code unsupported operation. + + // 2. If the current top-level browsing context is no longer open, return error with error code no such window. + TRY(ensure_open_top_level_browsing_context()); + + // 3. Handle any user prompts and return its value if it is an error. + TRY(handle_any_user_prompts()); + + // FIXME: 4. Let type hint be the result of getting the property "type" from the parameters argument. + + // 5. Create a new top-level browsing context by running the window open steps with url set to "about:blank", + // target set to the empty string, and features set to "noopener" and the user agent configured to create a new + // browsing context. This must be done without invoking the focusing steps for the created browsing context. If + // type hint has the value "tab", and the implementation supports multiple browsing context in the same OS + // window, the new browsing context should share an OS window with the current browsing context. If type hint + // is "window", and the implementation supports multiple browsing contexts in separate OS windows, the + // created browsing context should be in a new OS window. In all other cases the details of how the browsing + // context is presented to the user are implementation defined. + // FIXME: Reuse code of window.open() instead of calling choose_a_browsing_context + auto [browsing_context, window_type] = m_page_client.page().top_level_browsing_context().choose_a_browsing_context("_blank"sv, true); + + // 6. Let handle be the associated window handle of the newly created window. + auto handle = browsing_context->window_handle(); + + // 7. Let type be "tab" if the newly created window shares an OS-level window with the current browsing context, or "window" otherwise. + auto type = "tab"sv; + + // 8. Let result be a new JSON Object initialized with: + JsonObject result; + result.set("handle"sv, JsonValue { handle }); + result.set("type"sv, JsonValue { type }); + + // 9. Return success with data result. + return result; +} + // 11.8.1 Get Window Rect, https://w3c.github.io/webdriver/#dfn-get-window-rect Messages::WebDriverClient::GetWindowRectResponse WebDriverConnection::get_window_rect() { diff --git a/Userland/Services/WebContent/WebDriverConnection.h b/Userland/Services/WebContent/WebDriverConnection.h index 5e73b03be9f..e1bfcf2aad6 100644 --- a/Userland/Services/WebContent/WebDriverConnection.h +++ b/Userland/Services/WebContent/WebDriverConnection.h @@ -53,6 +53,7 @@ private: virtual Messages::WebDriverClient::RefreshResponse refresh() override; virtual Messages::WebDriverClient::GetTitleResponse get_title() override; virtual Messages::WebDriverClient::CloseWindowResponse close_window() override; + virtual Messages::WebDriverClient::NewWindowResponse new_window(JsonValue const& payload) override; virtual Messages::WebDriverClient::GetWindowRectResponse get_window_rect() override; virtual Messages::WebDriverClient::SetWindowRectResponse set_window_rect(JsonValue const& payload) override; virtual Messages::WebDriverClient::MaximizeWindowResponse maximize_window() override; diff --git a/Userland/Services/WebDriver/Client.cpp b/Userland/Services/WebDriver/Client.cpp index 0af52399363..b97b732f672 100644 --- a/Userland/Services/WebDriver/Client.cpp +++ b/Userland/Services/WebDriver/Client.cpp @@ -335,6 +335,15 @@ Web::WebDriver::Response Client::get_window_handles(Web::WebDriver::Parameters p return session->get_window_handles(); } +// 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//window/new"); + auto session = TRY(find_session_with_id(parameters[0])); + return session->web_content_connection().new_window(payload); +} + // 11.8.1 Get Window Rect, https://w3c.github.io/webdriver/#dfn-get-window-rect // GET /session/{session id}/window/rect Web::WebDriver::Response Client::get_window_rect(Web::WebDriver::Parameters parameters, JsonValue) diff --git a/Userland/Services/WebDriver/Client.h b/Userland/Services/WebDriver/Client.h index 10d4450a4e4..27c204e6928 100644 --- a/Userland/Services/WebDriver/Client.h +++ b/Userland/Services/WebDriver/Client.h @@ -52,6 +52,7 @@ private: virtual Web::WebDriver::Response close_window(Web::WebDriver::Parameters parameters, JsonValue payload) override; virtual Web::WebDriver::Response switch_to_window(Web::WebDriver::Parameters parameters, JsonValue payload) override; virtual Web::WebDriver::Response get_window_handles(Web::WebDriver::Parameters parameters, JsonValue payload) override; + virtual Web::WebDriver::Response new_window(Web::WebDriver::Parameters parameters, JsonValue payload) override; virtual Web::WebDriver::Response get_window_rect(Web::WebDriver::Parameters parameters, JsonValue payload) override; virtual Web::WebDriver::Response set_window_rect(Web::WebDriver::Parameters parameters, JsonValue payload) override; virtual Web::WebDriver::Response maximize_window(Web::WebDriver::Parameters parameters, JsonValue payload) override;