diff --git a/Userland/Libraries/LibWebView/Application.cpp b/Userland/Libraries/LibWebView/Application.cpp index 8e12ba16789..c382fcd1db1 100644 --- a/Userland/Libraries/LibWebView/Application.cpp +++ b/Userland/Libraries/LibWebView/Application.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace WebView { @@ -59,6 +60,7 @@ void Application::initialize(Main::Arguments const& arguments, URL::URL new_tab_ Optional debug_process; Optional profile_process; Optional webdriver_content_ipc_path; + Optional user_agent_preset; bool log_all_js_exceptions = false; bool enable_idl_tracing = false; bool enable_http_cache = false; @@ -83,6 +85,16 @@ void Application::initialize(Main::Arguments const& arguments, URL::URL new_tab_ args_parser.add_option(expose_internals_object, "Expose internals object", "expose-internals-object"); args_parser.add_option(force_cpu_painting, "Force CPU painting", "force-cpu-painting"); args_parser.add_option(force_fontconfig, "Force using fontconfig for font loading", "force-fontconfig"); + args_parser.add_option(Core::ArgsParser::Option { + .argument_mode = Core::ArgsParser::OptionArgumentMode::Required, + .help_string = "Name of the User-Agent preset to use in place of the default User-Agent", + .long_name = "user-agent-preset", + .value_name = "name", + .accept_value = [&](StringView value) { + user_agent_preset = normalize_user_agent_name(value); + return user_agent_preset.has_value(); + }, + }); create_platform_arguments(args_parser); args_parser.parse(arguments); @@ -114,6 +126,7 @@ void Application::initialize(Main::Arguments const& arguments, URL::URL new_tab_ m_web_content_options = { .command_line = MUST(String::join(' ', arguments.strings)), .executable_path = MUST(String::from_byte_string(MUST(Core::System::current_executable_path()))), + .user_agent_preset = move(user_agent_preset), .log_all_js_exceptions = log_all_js_exceptions ? LogAllJSExceptions::Yes : LogAllJSExceptions::No, .enable_idl_tracing = enable_idl_tracing ? EnableIDLTracing::Yes : EnableIDLTracing::No, .enable_http_cache = enable_http_cache ? EnableHTTPCache::Yes : EnableHTTPCache::No, diff --git a/Userland/Libraries/LibWebView/Options.h b/Userland/Libraries/LibWebView/Options.h index ed3456e0471..624331f8a21 100644 --- a/Userland/Libraries/LibWebView/Options.h +++ b/Userland/Libraries/LibWebView/Options.h @@ -93,6 +93,7 @@ struct WebContentOptions { String command_line; String executable_path; Optional config_path {}; + Optional user_agent_preset {}; IsLayoutTestMode is_layout_test_mode { IsLayoutTestMode::No }; UseLagomNetworking use_lagom_networking { UseLagomNetworking::Yes }; LogAllJSExceptions log_all_js_exceptions { LogAllJSExceptions::No }; diff --git a/Userland/Libraries/LibWebView/UserAgent.cpp b/Userland/Libraries/LibWebView/UserAgent.cpp index c285ecded74..087f99a1d26 100644 --- a/Userland/Libraries/LibWebView/UserAgent.cpp +++ b/Userland/Libraries/LibWebView/UserAgent.cpp @@ -19,4 +19,14 @@ OrderedHashMap const user_agents = { { "Safari iOS Mobile"sv, "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1"sv }, }; +Optional normalize_user_agent_name(StringView name) +{ + for (auto const& user_agent : user_agents) { + if (user_agent.key.equals_ignoring_ascii_case(name)) + return user_agent.key; + } + + return {}; +} + } diff --git a/Userland/Libraries/LibWebView/UserAgent.h b/Userland/Libraries/LibWebView/UserAgent.h index 371cb43d917..34e9a7c2a84 100644 --- a/Userland/Libraries/LibWebView/UserAgent.h +++ b/Userland/Libraries/LibWebView/UserAgent.h @@ -7,10 +7,13 @@ #pragma once #include +#include #include namespace WebView { extern OrderedHashMap const user_agents; +Optional normalize_user_agent_name(StringView); + }