From de1e882601380eae12f4723a50a5d5d2e2dfb445 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 10 Nov 2022 13:20:44 -0500 Subject: [PATCH] Browser+WebContent+WebDriver: Move Take Screenshot to WebContent --- .../Browser/WebDriverConnection.cpp | 12 --------- .../Browser/WebDriverConnection.h | 1 - .../Browser/WebDriverSessionClient.ipc | 1 - .../Services/WebContent/WebDriverClient.ipc | 1 + .../WebContent/WebDriverConnection.cpp | 26 +++++++++++++++++++ .../Services/WebContent/WebDriverConnection.h | 1 + Userland/Services/WebDriver/Client.cpp | 3 +-- Userland/Services/WebDriver/Session.cpp | 22 ---------------- Userland/Services/WebDriver/Session.h | 1 - 9 files changed, 29 insertions(+), 39 deletions(-) diff --git a/Userland/Applications/Browser/WebDriverConnection.cpp b/Userland/Applications/Browser/WebDriverConnection.cpp index edd3bf6a70..db09863973 100644 --- a/Userland/Applications/Browser/WebDriverConnection.cpp +++ b/Userland/Applications/Browser/WebDriverConnection.cpp @@ -146,18 +146,6 @@ void WebDriverConnection::scroll_element_into_view(i32 element_id) } } -Messages::WebDriverSessionClient::TakeScreenshotResponse WebDriverConnection::take_screenshot() -{ - dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: take_screenshot"); - if (auto browser_window = m_browser_window.strong_ref()) { - auto& tab = browser_window->active_tab(); - if (tab.on_take_screenshot) - return { tab.on_take_screenshot() }; - } - - return { {} }; -} - Messages::WebDriverSessionClient::TakeElementScreenshotResponse WebDriverConnection::take_element_screenshot(i32 element_id) { dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: take_element_screenshot {}", element_id); diff --git a/Userland/Applications/Browser/WebDriverConnection.h b/Userland/Applications/Browser/WebDriverConnection.h index 6bb7a3662c..5d2639e6fe 100644 --- a/Userland/Applications/Browser/WebDriverConnection.h +++ b/Userland/Applications/Browser/WebDriverConnection.h @@ -49,7 +49,6 @@ public: virtual void add_cookie(Web::Cookie::ParsedCookie const&) override; virtual void update_cookie(Web::Cookie::Cookie const&) override; virtual void scroll_element_into_view(i32 element_id) override; - virtual Messages::WebDriverSessionClient::TakeScreenshotResponse take_screenshot() override; virtual Messages::WebDriverSessionClient::TakeElementScreenshotResponse take_element_screenshot(i32 element_id) override; private: diff --git a/Userland/Applications/Browser/WebDriverSessionClient.ipc b/Userland/Applications/Browser/WebDriverSessionClient.ipc index c5b97f71ac..eb68c91d46 100644 --- a/Userland/Applications/Browser/WebDriverSessionClient.ipc +++ b/Userland/Applications/Browser/WebDriverSessionClient.ipc @@ -25,6 +25,5 @@ endpoint WebDriverSessionClient { add_cookie(Web::Cookie::ParsedCookie cookie) =| update_cookie(Web::Cookie::Cookie cookie) =| scroll_element_into_view(i32 element_id) => () - take_screenshot() => (Gfx::ShareableBitmap data) take_element_screenshot(i32 element_id) => (Gfx::ShareableBitmap data) } diff --git a/Userland/Services/WebContent/WebDriverClient.ipc b/Userland/Services/WebContent/WebDriverClient.ipc index 733f60b135..e9a629f5e4 100644 --- a/Userland/Services/WebContent/WebDriverClient.ipc +++ b/Userland/Services/WebContent/WebDriverClient.ipc @@ -21,4 +21,5 @@ endpoint WebDriverClient { get_element_tag_name(String element_id) => (Web::WebDriver::Response response) get_element_rect(String element_id) => (Web::WebDriver::Response response) is_element_enabled(String element_id) => (Web::WebDriver::Response response) + take_screenshot() => (Web::WebDriver::Response response) } diff --git a/Userland/Services/WebContent/WebDriverConnection.cpp b/Userland/Services/WebContent/WebDriverConnection.cpp index 7205e94099..eca78dabc7 100644 --- a/Userland/Services/WebContent/WebDriverConnection.cpp +++ b/Userland/Services/WebContent/WebDriverConnection.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -714,6 +715,31 @@ Messages::WebDriverClient::IsElementEnabledResponse WebDriverConnection::is_elem return make_success_response(enabled); } +// 17.1 Take Screenshot, https://w3c.github.io/webdriver/#take-screenshot +Messages::WebDriverClient::TakeScreenshotResponse WebDriverConnection::take_screenshot() +{ + // 1. 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()); + + // 2. When the user agent is next to run the animation frame callbacks: + // a. Let root rect be the current top-level browsing context’s document element’s rectangle. + // b. Let screenshot result be the result of trying to call draw a bounding box from the framebuffer, given root rect as an argument. + // c. Let canvas be a canvas element of screenshot result’s data. + // d. Let encoding result be the result of trying encoding a canvas as Base64 canvas. + // e. Let encoded string be encoding result’s data. + auto* document = m_page_host.page().top_level_browsing_context().active_document(); + auto root_rect = calculate_absolute_rect_of_element(m_page_host.page(), *document->document_element()); + + auto encoded_string = TRY(Web::WebDriver::capture_element_screenshot( + [&](auto const& rect, auto& bitmap) { m_page_host.paint(rect, bitmap); }, + m_page_host.page(), + *document->document_element(), + root_rect)); + + // 3. Return success with data encoded string. + return make_success_response(move(encoded_string)); +} + // https://w3c.github.io/webdriver/#dfn-no-longer-open ErrorOr WebDriverConnection::ensure_open_top_level_browsing_context() { diff --git a/Userland/Services/WebContent/WebDriverConnection.h b/Userland/Services/WebContent/WebDriverConnection.h index d6fa957799..9eb89d01d2 100644 --- a/Userland/Services/WebContent/WebDriverConnection.h +++ b/Userland/Services/WebContent/WebDriverConnection.h @@ -51,6 +51,7 @@ private: virtual Messages::WebDriverClient::GetElementTagNameResponse get_element_tag_name(String const& element_id) override; virtual Messages::WebDriverClient::GetElementRectResponse get_element_rect(String const& element_id) override; virtual Messages::WebDriverClient::IsElementEnabledResponse is_element_enabled(String const& element_id) override; + virtual Messages::WebDriverClient::TakeScreenshotResponse take_screenshot() override; ErrorOr ensure_open_top_level_browsing_context(); void restore_the_window(); diff --git a/Userland/Services/WebDriver/Client.cpp b/Userland/Services/WebDriver/Client.cpp index 8e4e131da8..1d33b8be94 100644 --- a/Userland/Services/WebDriver/Client.cpp +++ b/Userland/Services/WebDriver/Client.cpp @@ -806,8 +806,7 @@ Web::WebDriver::Response Client::handle_take_screenshot(Vector const { dbgln_if(WEBDRIVER_DEBUG, "Handling GET /session//screenshot"); auto* session = TRY(find_session_with_id(parameters[0])); - auto result = TRY(session->take_screenshot()); - return make_json_value(result); + return session->web_content_connection().take_screenshot(); } // 17.2 Take Element Screenshot, https://w3c.github.io/webdriver/#dfn-take-element-screenshot diff --git a/Userland/Services/WebDriver/Session.cpp b/Userland/Services/WebDriver/Session.cpp index c314f71857..29d6fc0706 100644 --- a/Userland/Services/WebDriver/Session.cpp +++ b/Userland/Services/WebDriver/Session.cpp @@ -695,28 +695,6 @@ static ErrorOr encode_bitmap_as_canvas_element(Gf return encoded_string; } -// 17.1 Take Screenshot, https://w3c.github.io/webdriver/#take-screenshot -Web::WebDriver::Response Session::take_screenshot() -{ - // 1. If the current top-level browsing context is no longer open, return error with error code no such window. - TRY(check_for_open_top_level_browsing_context_or_return_error()); - - // 2. When the user agent is next to run the animation frame callbacks: - // a. Let root rect be the current top-level browsing context’s document element’s rectangle. - // b. Let screenshot result be the result of trying to call draw a bounding box from the framebuffer, given root rect as an argument. - auto screenshot = m_browser_connection->take_screenshot(); - if (!screenshot.is_valid()) - return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnableToCaptureScreen, "Unable to capture screenshot"sv); - - // c. Let canvas be a canvas element of screenshot result’s data. - // d. Let encoding result be the result of trying encoding a canvas as Base64 canvas. - // e. Let encoded string be encoding result’s data. - auto encoded_string = TRY(encode_bitmap_as_canvas_element(*screenshot.bitmap())); - - // 3. Return success with data encoded string. - return JsonValue { encoded_string }; -} - // 17.2 Take Element Screenshot, https://w3c.github.io/webdriver/#dfn-take-element-screenshot Web::WebDriver::Response Session::take_element_screenshot(StringView parameter_element_id) { diff --git a/Userland/Services/WebDriver/Session.h b/Userland/Services/WebDriver/Session.h index 623c390bd1..891bd718c6 100644 --- a/Userland/Services/WebDriver/Session.h +++ b/Userland/Services/WebDriver/Session.h @@ -66,7 +66,6 @@ public: Web::WebDriver::Response add_cookie(JsonValue const& payload); Web::WebDriver::Response delete_cookie(StringView name); Web::WebDriver::Response delete_all_cookies(); - Web::WebDriver::Response take_screenshot(); Web::WebDriver::Response take_element_screenshot(StringView element_id); private: