From 2ca8fd1832462c05fdec16a1de73494820597140 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 23 Jul 2024 21:10:24 +0100 Subject: [PATCH] LibWeb: Make preferred languages configurable This also changes fetch to use the preferred languages for the Accept-Language header. --- Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp | 5 ++++- Userland/Libraries/LibWeb/HTML/NavigatorLanguage.h | 11 ++++------- Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp | 1 + Userland/Libraries/LibWeb/Loader/ResourceLoader.h | 4 ++++ Userland/Libraries/LibWebView/ViewImplementation.cpp | 5 +++++ Userland/Libraries/LibWebView/ViewImplementation.h | 2 ++ Userland/Services/WebContent/ConnectionFromClient.cpp | 9 +++++++++ Userland/Services/WebContent/ConnectionFromClient.h | 1 + Userland/Services/WebContent/WebContentServer.ipc | 1 + 9 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp b/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp index 8d257b228a1..909f8542f96 100644 --- a/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp @@ -235,7 +235,10 @@ WebIDL::ExceptionOr> fetch(JS: // 14. If request’s header list does not contain `Accept-Language`, then user agents should append // (`Accept-Language, an appropriate header value) to request’s header list. if (!request.header_list()->contains("Accept-Language"sv.bytes())) { - auto header = Infrastructure::Header::from_string_pair("Accept-Language"sv, "*"sv); + StringBuilder accept_language; + accept_language.join(","sv, ResourceLoader::the().preferred_languages()); + + auto header = Infrastructure::Header::from_string_pair("Accept-Language"sv, accept_language.string_view()); request.header_list()->append(move(header)); } diff --git a/Userland/Libraries/LibWeb/HTML/NavigatorLanguage.h b/Userland/Libraries/LibWeb/HTML/NavigatorLanguage.h index e2a2d680d63..89c9a910df7 100644 --- a/Userland/Libraries/LibWeb/HTML/NavigatorLanguage.h +++ b/Userland/Libraries/LibWeb/HTML/NavigatorLanguage.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, Andrew Kaster + * Copyright (c) 2024, Jamie Mansfield * * SPDX-License-Identifier: BSD-2-Clause */ @@ -8,21 +9,17 @@ #include #include +#include namespace Web::HTML { class NavigatorLanguageMixin { public: // https://html.spec.whatwg.org/multipage/system-state.html#dom-navigator-language - String language() const { return m_current_preferred_languages[0]; } + String language() const { return ResourceLoader::the().preferred_languages()[0]; } // https://html.spec.whatwg.org/multipage/system-state.html#dom-navigator-languages - // FIXME: The same object must be returned until the user agent needs to return different values, or values in a - // different order. - Vector languages() const { return m_current_preferred_languages; } - -protected: - Vector m_current_preferred_languages = { "en-US"_string }; + Vector languages() const { return ResourceLoader::the().preferred_languages(); } }; } diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp index 961548fd6f5..6a6f66ff29f 100644 --- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp @@ -59,6 +59,7 @@ ResourceLoader::ResourceLoader(NonnullRefPtr connector) : m_connector(move(connector)) , m_user_agent(MUST(String::from_utf8(default_user_agent))) , m_platform(MUST(String::from_utf8(default_platform))) + , m_preferred_languages({ "en-US"_string }) , m_navigator_compatibility_mode(default_navigator_compatibility_mode) { } diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h index 43c23116a67..4bc2bc345ec 100644 --- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h +++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h @@ -100,6 +100,9 @@ public: String const& platform() const { return m_platform; } void set_platform(String platform) { m_platform = move(platform); } + Vector preferred_languages() const { return m_preferred_languages; } + void set_preferred_languages(Vector preferred_languages) { m_preferred_languages = move(preferred_languages); } + NavigatorCompatibilityMode navigator_compatibility_mode() { return m_navigator_compatibility_mode; } void set_navigator_compatibility_mode(NavigatorCompatibilityMode mode) { m_navigator_compatibility_mode = mode; } @@ -123,6 +126,7 @@ private: NonnullRefPtr m_connector; String m_user_agent; String m_platform; + Vector m_preferred_languages; NavigatorCompatibilityMode m_navigator_compatibility_mode; bool m_enable_do_not_track { false }; Optional> m_page {}; diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index 7fcdd2b3538..c9742ce7cbf 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -169,6 +169,11 @@ void ViewImplementation::set_preferred_motion(Web::CSS::PreferredMotion motion) client().async_set_preferred_motion(page_id(), motion); } +void ViewImplementation::set_preferred_languages(Vector preferred_languages) +{ + client().async_set_preferred_languages(page_id(), move(preferred_languages)); +} + void ViewImplementation::set_enable_do_not_track(bool enable) { client().async_set_enable_do_not_track(page_id(), enable); diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index 48bb15516ee..9427535b927 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -66,6 +66,8 @@ public: void set_preferred_contrast(Web::CSS::PreferredContrast); void set_preferred_motion(Web::CSS::PreferredMotion); + void set_preferred_languages(Vector); + void set_enable_do_not_track(bool); ByteString selected_text(); diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index b73133f661b..0480c884843 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -946,6 +946,15 @@ void ConnectionFromClient::set_preferred_motion(u64 page_id, Web::CSS::Preferred page->set_preferred_motion(motion); } +void ConnectionFromClient::set_preferred_languages(u64, Vector const& preferred_languages) +{ + // FIXME: Whenever the user agent needs to make the navigator.languages attribute of a Window or WorkerGlobalScope + // object global return a new set of language tags, the user agent must queue a global task on the DOM manipulation + // task source given global to fire an event named languagechange at global, and wait until that task begins to be + // executed before actually returning a new value. + Web::ResourceLoader::the().set_preferred_languages(preferred_languages); +} + void ConnectionFromClient::set_enable_do_not_track(u64, bool enable) { Web::ResourceLoader::the().set_enable_do_not_track(enable); diff --git a/Userland/Services/WebContent/ConnectionFromClient.h b/Userland/Services/WebContent/ConnectionFromClient.h index 5d4070f4c9f..7f4c5ed0465 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -95,6 +95,7 @@ private: virtual void set_preferred_color_scheme(u64 page_id, Web::CSS::PreferredColorScheme const&) override; virtual void set_preferred_contrast(u64 page_id, Web::CSS::PreferredContrast const&) override; virtual void set_preferred_motion(u64 page_id, Web::CSS::PreferredMotion const&) override; + virtual void set_preferred_languages(u64 page_id, Vector const&) override; virtual void set_enable_do_not_track(u64 page_id, bool) override; virtual void set_has_focus(u64 page_id, bool) override; virtual void set_is_scripting_enabled(u64 page_id, bool) override; diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 0bf88c71258..e61898bba5b 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -81,6 +81,7 @@ endpoint WebContentServer set_preferred_color_scheme(u64 page_id, Web::CSS::PreferredColorScheme color_scheme) =| set_preferred_contrast(u64 page_id, Web::CSS::PreferredContrast contrast) =| set_preferred_motion(u64 page_id, Web::CSS::PreferredMotion motion) =| + set_preferred_languages(u64 page_id, Vector preferred_languages) =| set_enable_do_not_track(u64 page_id, bool enable) =| set_has_focus(u64 page_id, bool has_focus) =| set_is_scripting_enabled(u64 page_id, bool is_scripting_enabled) =|