diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Applications/Browser/BrowserWindow.cpp | 4 | ||||
-rw-r--r-- | Userland/Applications/Browser/CookieJar.cpp | 26 | ||||
-rw-r--r-- | Userland/Applications/Browser/CookieJar.h | 8 | ||||
-rw-r--r-- | Userland/Applications/Browser/Tab.cpp | 6 | ||||
-rw-r--r-- | Userland/Applications/Browser/Tab.h | 1 | ||||
-rw-r--r-- | Userland/Services/WebContent/WebDriverClient.ipc | 1 | ||||
-rw-r--r-- | Userland/Services/WebContent/WebDriverConnection.cpp | 43 | ||||
-rw-r--r-- | Userland/Services/WebContent/WebDriverConnection.h | 1 | ||||
-rw-r--r-- | Userland/Services/WebDriver/Client.cpp | 3 | ||||
-rw-r--r-- | Userland/Services/WebDriver/Session.cpp | 24 | ||||
-rw-r--r-- | Userland/Services/WebDriver/Session.h | 1 |
11 files changed, 89 insertions, 29 deletions
diff --git a/Userland/Applications/Browser/BrowserWindow.cpp b/Userland/Applications/Browser/BrowserWindow.cpp index dc128bcdec..ba2dac87ea 100644 --- a/Userland/Applications/Browser/BrowserWindow.cpp +++ b/Userland/Applications/Browser/BrowserWindow.cpp @@ -575,6 +575,10 @@ void BrowserWindow::create_new_tab(URL url, bool activate) }); }; + new_tab.on_get_all_cookies = [this](auto& url) { + return m_cookie_jar.get_all_cookies(url); + }; + new_tab.on_get_cookie = [this](auto& url, auto source) -> String { return m_cookie_jar.get_cookie(url, source); }; diff --git a/Userland/Applications/Browser/CookieJar.cpp b/Userland/Applications/Browser/CookieJar.cpp index d0c3df10a6..bf1ec26260 100644 --- a/Userland/Applications/Browser/CookieJar.cpp +++ b/Userland/Applications/Browser/CookieJar.cpp @@ -116,6 +116,24 @@ Vector<Web::Cookie::Cookie> CookieJar::get_all_cookies() const return cookies; } +// https://w3c.github.io/webdriver/#dfn-associated-cookies +Vector<Web::Cookie::Cookie> CookieJar::get_all_cookies(URL const& url) +{ + auto domain = canonicalize_domain(url); + if (!domain.has_value()) + return {}; + + auto cookie_list = get_matching_cookies(url, domain.value(), Web::Cookie::Source::Http, MatchingCookiesSpecMode::WebDriver); + + Vector<Web::Cookie::Cookie> cookies; + cookies.ensure_capacity(cookie_list.size()); + + for (auto const& cookie : cookie_list) + cookies.unchecked_append(cookie); + + return cookies; +} + Optional<String> CookieJar::canonicalize_domain(const URL& url) { // https://tools.ietf.org/html/rfc6265#section-5.1.2 @@ -281,7 +299,7 @@ void CookieJar::store_cookie(Web::Cookie::ParsedCookie const& parsed_cookie, con m_cookies.set(key, move(cookie)); } -Vector<Web::Cookie::Cookie&> CookieJar::get_matching_cookies(const URL& url, String const& canonicalized_domain, Web::Cookie::Source source) +Vector<Web::Cookie::Cookie&> CookieJar::get_matching_cookies(const URL& url, String const& canonicalized_domain, Web::Cookie::Source source, MatchingCookiesSpecMode mode) { // https://tools.ietf.org/html/rfc6265#section-5.4 @@ -310,6 +328,12 @@ Vector<Web::Cookie::Cookie&> CookieJar::get_matching_cookies(const URL& url, Str if (cookie.value.http_only && (source != Web::Cookie::Source::Http)) continue; + // NOTE: The WebDriver spec expects only step 1 above to be executed to match cookies. + if (mode == MatchingCookiesSpecMode::WebDriver) { + cookie_list.append(cookie.value); + continue; + } + // 2. The user agent SHOULD sort the cookie-list in the following order: // - Cookies with longer paths are listed before cookies with shorter paths. // - Among cookies that have equal-length path fields, cookies with earlier creation-times are listed before cookies with later creation-times. diff --git a/Userland/Applications/Browser/CookieJar.h b/Userland/Applications/Browser/CookieJar.h index 7bae12c04f..2db6f41b73 100644 --- a/Userland/Applications/Browser/CookieJar.h +++ b/Userland/Applications/Browser/CookieJar.h @@ -31,6 +31,7 @@ public: void update_cookie(URL const&, Web::Cookie::Cookie); void dump_cookies() const; Vector<Web::Cookie::Cookie> get_all_cookies() const; + Vector<Web::Cookie::Cookie> get_all_cookies(URL const& url); private: static Optional<String> canonicalize_domain(const URL& url); @@ -38,8 +39,13 @@ private: static bool path_matches(String const& request_path, String const& cookie_path); static String default_path(const URL& url); + enum class MatchingCookiesSpecMode { + RFC6265, + WebDriver, + }; + void store_cookie(Web::Cookie::ParsedCookie const& parsed_cookie, const URL& url, String canonicalized_domain, Web::Cookie::Source source); - Vector<Web::Cookie::Cookie&> get_matching_cookies(const URL& url, String const& canonicalized_domain, Web::Cookie::Source source); + Vector<Web::Cookie::Cookie&> get_matching_cookies(const URL& url, String const& canonicalized_domain, Web::Cookie::Source source, MatchingCookiesSpecMode mode = MatchingCookiesSpecMode::RFC6265); void purge_expired_cookies(); HashMap<CookieStorageKey, Web::Cookie::Cookie> m_cookies; diff --git a/Userland/Applications/Browser/Tab.cpp b/Userland/Applications/Browser/Tab.cpp index 2262c4e899..905978ab3f 100644 --- a/Userland/Applications/Browser/Tab.cpp +++ b/Userland/Applications/Browser/Tab.cpp @@ -351,6 +351,12 @@ Tab::Tab(BrowserWindow& window) on_favicon_change(icon); }; + view().on_get_all_cookies = [this](auto& url) -> Vector<Web::Cookie::Cookie> { + if (on_get_all_cookies) + return on_get_all_cookies(url); + return {}; + }; + view().on_get_cookie = [this](auto& url, auto source) -> String { if (on_get_cookie) return on_get_cookie(url, source); diff --git a/Userland/Applications/Browser/Tab.h b/Userland/Applications/Browser/Tab.h index c016783209..9477fefb7f 100644 --- a/Userland/Applications/Browser/Tab.h +++ b/Userland/Applications/Browser/Tab.h @@ -64,6 +64,7 @@ public: Function<void(Tab&)> on_tab_close_request; Function<void(Tab&)> on_tab_close_other_request; Function<void(Gfx::Bitmap const&)> on_favicon_change; + Function<Vector<Web::Cookie::Cookie>(AK::URL const& url)> on_get_all_cookies; Function<String(const URL&, Web::Cookie::Source source)> on_get_cookie; Function<void(const URL&, Web::Cookie::ParsedCookie const& cookie, Web::Cookie::Source source)> on_set_cookie; Function<void()> on_dump_cookies; diff --git a/Userland/Services/WebContent/WebDriverClient.ipc b/Userland/Services/WebContent/WebDriverClient.ipc index b8f803f2f3..a7d70c8ff5 100644 --- a/Userland/Services/WebContent/WebDriverClient.ipc +++ b/Userland/Services/WebContent/WebDriverClient.ipc @@ -24,6 +24,7 @@ endpoint WebDriverClient { get_source() => (Web::WebDriver::Response response) execute_script(JsonValue payload) => (Web::WebDriver::Response response) execute_async_script(JsonValue payload) => (Web::WebDriver::Response response) + get_all_cookies() => (Web::WebDriver::Response response) take_screenshot() => (Web::WebDriver::Response response) take_element_screenshot(String element_id) => (Web::WebDriver::Response response) } diff --git a/Userland/Services/WebContent/WebDriverConnection.cpp b/Userland/Services/WebContent/WebDriverConnection.cpp index 9b4e67098b..94b12c8a46 100644 --- a/Userland/Services/WebContent/WebDriverConnection.cpp +++ b/Userland/Services/WebContent/WebDriverConnection.cpp @@ -16,6 +16,7 @@ #include <LibWeb/CSS/PropertyID.h> #include <LibWeb/CSS/StyleProperties.h> #include <LibWeb/CSS/StyleValue.h> +#include <LibWeb/Cookie/Cookie.h> #include <LibWeb/DOM/Document.h> #include <LibWeb/DOM/Element.h> #include <LibWeb/Geometry/DOMRect.h> @@ -41,6 +42,22 @@ static JsonValue make_success_response(JsonValue value) return result; } +// https://w3c.github.io/webdriver/#dfn-serialized-cookie +static JsonValue serialize_cookie(Web::Cookie::Cookie const& cookie) +{ + JsonObject serialized_cookie; + serialized_cookie.set("name"sv, cookie.name); + serialized_cookie.set("value"sv, cookie.value); + serialized_cookie.set("path"sv, cookie.path); + serialized_cookie.set("domain"sv, cookie.domain); + serialized_cookie.set("secure"sv, cookie.secure); + serialized_cookie.set("httpOnly"sv, cookie.http_only); + serialized_cookie.set("expiry"sv, cookie.expiry_time.timestamp()); + serialized_cookie.set("sameSite"sv, Web::Cookie::same_site_to_string(cookie.same_site)); + + return serialized_cookie; +} + static JsonValue serialize_rect(Gfx::IntRect const& rect) { JsonObject serialized_rect = {}; @@ -829,6 +846,32 @@ Messages::WebDriverClient::ExecuteAsyncScriptResponse WebDriverConnection::execu VERIFY_NOT_REACHED(); } +// 14.1 Get All Cookies, https://w3c.github.io/webdriver/#dfn-get-all-cookies +Messages::WebDriverClient::GetAllCookiesResponse WebDriverConnection::get_all_cookies() +{ + // 1. If the current browsing context is no longer open, return error with error code no such window. + TRY(ensure_open_top_level_browsing_context()); + + // FIXME: 2. Handle any user prompts, and return its value if it is an error. + + // 3. Let cookies be a new JSON List. + JsonArray cookies; + + // 4. For each cookie in all associated cookies of the current browsing context’s active document: + auto* document = m_page_host.page().top_level_browsing_context().active_document(); + + for (auto const& cookie : m_web_content_client.did_request_all_cookies(document->url())) { + // 1. Let serialized cookie be the result of serializing cookie. + auto serialized_cookie = serialize_cookie(cookie); + + // 2. Append serialized cookie to cookies + cookies.append(move(serialized_cookie)); + } + + // 5. Return success with data cookies. + return make_success_response(move(cookies)); +} + // 17.1 Take Screenshot, https://w3c.github.io/webdriver/#take-screenshot Messages::WebDriverClient::TakeScreenshotResponse WebDriverConnection::take_screenshot() { diff --git a/Userland/Services/WebContent/WebDriverConnection.h b/Userland/Services/WebContent/WebDriverConnection.h index 56e00a907e..91f6735056 100644 --- a/Userland/Services/WebContent/WebDriverConnection.h +++ b/Userland/Services/WebContent/WebDriverConnection.h @@ -56,6 +56,7 @@ private: virtual Messages::WebDriverClient::GetSourceResponse get_source() override; virtual Messages::WebDriverClient::ExecuteScriptResponse execute_script(JsonValue const& payload) override; virtual Messages::WebDriverClient::ExecuteAsyncScriptResponse execute_async_script(JsonValue const& payload) override; + virtual Messages::WebDriverClient::GetAllCookiesResponse get_all_cookies() override; virtual Messages::WebDriverClient::TakeScreenshotResponse take_screenshot() override; virtual Messages::WebDriverClient::TakeElementScreenshotResponse take_element_screenshot(String const& element_id) override; diff --git a/Userland/Services/WebDriver/Client.cpp b/Userland/Services/WebDriver/Client.cpp index 0587209c91..c5f660eacc 100644 --- a/Userland/Services/WebDriver/Client.cpp +++ b/Userland/Services/WebDriver/Client.cpp @@ -753,8 +753,7 @@ Web::WebDriver::Response Client::handle_get_all_cookies(Vector<StringView> const { dbgln_if(WEBDRIVER_DEBUG, "Handling GET /session/<session_id>/cookie"); auto* session = TRY(find_session_with_id(parameters[0])); - auto cookies = TRY(session->get_all_cookies()); - return make_json_value(cookies); + return session->web_content_connection().get_all_cookies(); } // 14.2 Get Named Cookie, https://w3c.github.io/webdriver/#dfn-get-named-cookie diff --git a/Userland/Services/WebDriver/Session.cpp b/Userland/Services/WebDriver/Session.cpp index 4732d4fef3..3c9c816c8c 100644 --- a/Userland/Services/WebDriver/Session.cpp +++ b/Userland/Services/WebDriver/Session.cpp @@ -313,30 +313,6 @@ static JsonObject serialize_cookie(Web::Cookie::Cookie const& cookie) return serialized_cookie; } -// 14.1 Get All Cookies, https://w3c.github.io/webdriver/#dfn-get-all-cookies -Web::WebDriver::Response Session::get_all_cookies() -{ - // 1. If the current 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()); - - // FIXME: 2. Handle any user prompts, and return its value if it is an error. - - // 3. Let cookies be a new JSON List. - JsonArray cookies = {}; - - // 4. For each cookie in all associated cookies of the current browsing context’s active document: - for (auto const& cookie : m_browser_connection->get_all_cookies()) { - // 1. Let serialized cookie be the result of serializing cookie. - auto serialized_cookie = serialize_cookie(cookie); - - // 2. Append serialized cookie to cookies - cookies.append(serialized_cookie); - } - - // 5. Return success with data cookies. - return JsonValue(cookies); -} - // 14.2 Get Named Cookie, https://w3c.github.io/webdriver/#dfn-get-named-cookie Web::WebDriver::Response Session::get_named_cookie(String const& name) { diff --git a/Userland/Services/WebDriver/Session.h b/Userland/Services/WebDriver/Session.h index da590dc1ed..cb7fcdccc5 100644 --- a/Userland/Services/WebDriver/Session.h +++ b/Userland/Services/WebDriver/Session.h @@ -58,7 +58,6 @@ public: Web::WebDriver::Response get_window_handle(); ErrorOr<void, Variant<Web::WebDriver::Error, Error>> close_window(); Web::WebDriver::Response get_window_handles() const; - Web::WebDriver::Response get_all_cookies(); Web::WebDriver::Response get_named_cookie(String const& name); Web::WebDriver::Response add_cookie(JsonValue const& payload); Web::WebDriver::Response delete_cookie(StringView name); |