LibWeb: Make preferred languages configurable

This also changes fetch to use the preferred languages for the
Accept-Language header.
This commit is contained in:
Jamie Mansfield 2024-07-23 21:10:24 +01:00 committed by Tim Ledbetter
parent 2cfc1873c0
commit 2ca8fd1832
Notes: github-actions[bot] 2024-07-25 10:39:58 +00:00
9 changed files with 31 additions and 8 deletions

View file

@ -235,7 +235,10 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<Infrastructure::FetchController>> fetch(JS:
// 14. If requests header list does not contain `Accept-Language`, then user agents should append
// (`Accept-Language, an appropriate header value) to requests 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));
}

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2022, Andrew Kaster <akaster@serenityos.org>
* Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -8,21 +9,17 @@
#include <AK/String.h>
#include <AK/Vector.h>
#include <LibWeb/Loader/ResourceLoader.h>
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<String> languages() const { return m_current_preferred_languages; }
protected:
Vector<String> m_current_preferred_languages = { "en-US"_string };
Vector<String> languages() const { return ResourceLoader::the().preferred_languages(); }
};
}

View file

@ -59,6 +59,7 @@ ResourceLoader::ResourceLoader(NonnullRefPtr<ResourceLoaderConnector> 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)
{
}

View file

@ -100,6 +100,9 @@ public:
String const& platform() const { return m_platform; }
void set_platform(String platform) { m_platform = move(platform); }
Vector<String> preferred_languages() const { return m_preferred_languages; }
void set_preferred_languages(Vector<String> 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<ResourceLoaderConnector> m_connector;
String m_user_agent;
String m_platform;
Vector<String> m_preferred_languages;
NavigatorCompatibilityMode m_navigator_compatibility_mode;
bool m_enable_do_not_track { false };
Optional<JS::GCPtr<Page>> m_page {};

View file

@ -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<String> 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);

View file

@ -66,6 +66,8 @@ public:
void set_preferred_contrast(Web::CSS::PreferredContrast);
void set_preferred_motion(Web::CSS::PreferredMotion);
void set_preferred_languages(Vector<String>);
void set_enable_do_not_track(bool);
ByteString selected_text();

View file

@ -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<String> 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);

View file

@ -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<String> 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;

View file

@ -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<String> 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) =|