aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/compositing/compositor.rs16
-rw-r--r--components/compositing/windowing.rs10
-rw-r--r--components/config/prefs.rs84
-rw-r--r--components/constellation/constellation.rs10
-rw-r--r--components/constellation/pipeline.rs7
-rw-r--r--components/net/fetch/methods.rs3
-rw-r--r--components/net/http_loader.rs3
-rw-r--r--components/net/resource_thread.rs12
-rw-r--r--components/net/tests/resource_thread.rs1
-rw-r--r--components/script/dom/dissimilaroriginwindow.rs1
-rw-r--r--components/script/dom/globalscope.rs10
-rw-r--r--components/script/dom/navigator.rs3
-rw-r--r--components/script/dom/navigatorinfo.rs6
-rw-r--r--components/script/dom/window.rs4
-rw-r--r--components/script/dom/workerglobalscope.rs2
-rw-r--r--components/script/dom/workernavigator.rs3
-rw-r--r--components/script/dom/workletglobalscope.rs4
-rw-r--r--components/script/script_thread.rs12
-rw-r--r--components/servo/examples/winit_minimal.rs1
-rw-r--r--components/servo/lib.rs93
-rw-r--r--components/shared/script/lib.rs3
-rw-r--r--components/shared/script_layout/lib.rs2
-rw-r--r--ports/servoshell/desktop/app.rs1
-rw-r--r--ports/servoshell/desktop/embedder.rs4
-rw-r--r--ports/servoshell/egl/android/simpleservo.rs1
-rw-r--r--ports/servoshell/egl/ohos/simpleservo.rs1
-rw-r--r--ports/servoshell/prefs.rs4
27 files changed, 95 insertions, 206 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs
index 7f8864120b4..c9c61283ff8 100644
--- a/components/compositing/compositor.rs
+++ b/components/compositing/compositor.rs
@@ -5,8 +5,7 @@
use std::cell::{Cell, RefCell};
use std::collections::HashMap;
use std::env;
-use std::fs::{File, create_dir_all};
-use std::io::Write;
+use std::fs::create_dir_all;
use std::iter::once;
use std::mem::take;
use std::rc::Rc;
@@ -114,10 +113,6 @@ pub struct ServoRenderer {
/// The GL bindings for webrender
webrender_gl: Rc<dyn gleam::gl::Gl>,
- /// The string representing the version of Servo that is running. This is used to tag
- /// WebRender capture output.
- version_string: String,
-
#[cfg(feature = "webxr")]
/// Some XR devices want to run on the main thread.
webxr_main_thread: webxr::MainThreadRegistry,
@@ -429,7 +424,6 @@ impl IOCompositor {
window: Rc<dyn WindowMethods>,
state: InitialCompositorState,
convert_mouse_to_touch: bool,
- version_string: String,
) -> Self {
let compositor = IOCompositor {
global: Rc::new(RefCell::new(ServoRenderer {
@@ -441,7 +435,6 @@ impl IOCompositor {
webrender_api: state.webrender_api,
webrender_document: state.webrender_document,
webrender_gl: state.webrender_gl,
- version_string,
#[cfg(feature = "webxr")]
webxr_main_thread: state.webxr_main_thread,
convert_mouse_to_touch,
@@ -1773,13 +1766,6 @@ impl IOCompositor {
.borrow()
.webrender_api
.save_capture(capture_path.clone(), CaptureBits::all());
-
- let version_file_path = capture_path.join("servo-version.txt");
- if let Err(error) = File::create(version_file_path)
- .and_then(|mut file| write!(file, "{}", self.global.borrow().version_string))
- {
- eprintln!("Unable to write servo version for WebRender Capture: {error:?}");
- }
}
fn add_font_instance(
diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs
index 2ac4e82b81d..8bd9159fd4c 100644
--- a/components/compositing/windowing.rs
+++ b/components/compositing/windowing.rs
@@ -59,16 +59,6 @@ pub trait EmbedderMethods {
) {
}
- /// Returns the user agent string to report in network requests.
- fn get_user_agent_string(&self) -> Option<String> {
- None
- }
-
- /// Returns the version string of this embedder.
- fn get_version_string(&self) -> Option<String> {
- None
- }
-
/// Returns the protocol handlers implemented by that embedder.
/// They will be merged with the default internal ones.
fn get_protocol_handlers(&self) -> ProtocolRegistry {
diff --git a/components/config/prefs.rs b/components/config/prefs.rs
index eaf352f7daa..5cdfc18ac6b 100644
--- a/components/config/prefs.rs
+++ b/components/config/prefs.rs
@@ -9,7 +9,7 @@ use servo_config_macro::ServoPreferences;
pub use crate::pref_util::PrefValue;
-static PREFERENCES: RwLock<Preferences> = RwLock::new(Preferences::new());
+static PREFERENCES: RwLock<Preferences> = RwLock::new(Preferences::const_default());
#[inline]
/// Get the current set of global preferences for Servo.
@@ -230,10 +230,13 @@ pub struct Preferences {
pub threadpools_resource_workers_max: i64,
/// Maximum number of workers for webrender
pub threadpools_webrender_workers_max: i64,
+ /// The user-agent to use for Servo. This can also be set via [`UserAgentPlatform`] in
+ /// order to set the value to the default value for the given platform.
+ pub user_agent: String,
}
impl Preferences {
- const fn new() -> Self {
+ const fn const_default() -> Self {
Self {
css_animations_testing_enabled: false,
devtools_server_enabled: false,
@@ -389,12 +392,87 @@ impl Preferences {
threadpools_resource_workers_max: 4,
threadpools_webrender_workers_max: 4,
webgl_testing_context_creation_error: false,
+ user_agent: String::new(),
}
}
}
impl Default for Preferences {
fn default() -> Self {
- Self::new()
+ let mut preferences = Self::const_default();
+ preferences.user_agent = UserAgentPlatform::default().to_user_agent_string();
+ preferences
+ }
+}
+
+pub enum UserAgentPlatform {
+ Desktop,
+ Android,
+ OpenHarmony,
+ Ios,
+}
+
+impl UserAgentPlatform {
+ /// Return the default `UserAgentPlatform` for this platform. This is
+ /// not an implementation of `Default` so that it can be `const`.
+ const fn default() -> Self {
+ if cfg!(target_os = "android") {
+ Self::Android
+ } else if cfg!(target_env = "ohos") {
+ Self::OpenHarmony
+ } else if cfg!(target_os = "ios") {
+ Self::Ios
+ } else {
+ Self::Desktop
+ }
+ }
+}
+
+impl UserAgentPlatform {
+ /// Convert this [`UserAgentPlatform`] into its corresponding `String` value, ie the
+ /// default user-agent to use for this platform.
+ pub fn to_user_agent_string(&self) -> String {
+ const SERVO_VERSION: &str = env!("CARGO_PKG_VERSION");
+ match self {
+ UserAgentPlatform::Desktop
+ if cfg!(all(target_os = "windows", target_arch = "x86_64")) =>
+ {
+ #[cfg(target_arch = "x86_64")]
+ const ARCHITECTURE: &str = "x86; ";
+ #[cfg(not(target_arch = "x86_64"))]
+ const ARCHITECTURE: &str = "";
+
+ format!(
+ "Mozilla/5.0 (Windows NT 10.0; Win64; {ARCHITECTURE}rv:128.0) Servo/{SERVO_VERSION} Firefox/128.0"
+ )
+ },
+ UserAgentPlatform::Desktop if cfg!(target_os = "macos") => {
+ format!(
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Servo/{SERVO_VERSION} Firefox/128.0"
+ )
+ },
+ UserAgentPlatform::Desktop => {
+ #[cfg(target_arch = "x86_64")]
+ const ARCHITECTURE: &str = "x86_64";
+ // TODO: This is clearly wrong for other platforms.
+ #[cfg(not(target_arch = "x86_64"))]
+ const ARCHITECTURE: &str = "i686";
+
+ format!(
+ "Mozilla/5.0 (X11; Linux {ARCHITECTURE}; rv:128.0) Servo/{SERVO_VERSION} Firefox/128.0"
+ )
+ },
+ UserAgentPlatform::Android => {
+ format!(
+ "Mozilla/5.0 (Android; Mobile; rv:128.0) Servo/{SERVO_VERSION} Firefox/128.0"
+ )
+ },
+ UserAgentPlatform::OpenHarmony => format!(
+ "Mozilla/5.0 (OpenHarmony; Mobile; rv:128.0) Servo/{SERVO_VERSION} Firefox/128.0"
+ ),
+ UserAgentPlatform::Ios => format!(
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X; rv:128.0) Servo/{SERVO_VERSION} Firefox/128.0"
+ ),
+ }
}
}
diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs
index b8fd7a465aa..3c3a9f761b0 100644
--- a/components/constellation/constellation.rs
+++ b/components/constellation/constellation.rs
@@ -84,7 +84,7 @@
//!
//! See <https://github.com/servo/servo/issues/14704>
-use std::borrow::{Cow, ToOwned};
+use std::borrow::ToOwned;
use std::collections::hash_map::Entry;
use std::collections::{HashMap, HashSet, VecDeque};
use std::marker::PhantomData;
@@ -465,9 +465,6 @@ pub struct Constellation<STF, SWF> {
/// Pipeline ID of the active media session.
active_media_session: Option<PipelineId>,
- /// User agent string to report in network requests.
- user_agent: Cow<'static, str>,
-
/// The image bytes associated with the RippyPNG embedder resource.
/// Read during startup and provided to image caches that are created
/// on an as-needed basis, rather than retrieving it every time.
@@ -522,9 +519,6 @@ pub struct InitialConstellationState {
/// The XR device registry
pub webxr_registry: Option<webxr_api::Registry>,
- /// User agent string to report in network requests.
- pub user_agent: Cow<'static, str>,
-
#[cfg(feature = "webgpu")]
pub wgpu_image_map: WGPUImageMap,
@@ -744,7 +738,6 @@ where
active_keyboard_modifiers: Modifiers::empty(),
hard_fail,
active_media_session: None,
- user_agent: state.user_agent,
rippy_data,
user_content_manager: state.user_content_manager,
};
@@ -988,7 +981,6 @@ where
.map(|threads| threads.pipeline()),
webxr_registry: self.webxr_registry.clone(),
player_context: WindowGLContext::get(),
- user_agent: self.user_agent.clone(),
rippy_data: self.rippy_data.clone(),
user_content_manager: self.user_content_manager.clone(),
});
diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs
index 65f0c9dbfbd..fb046d77c33 100644
--- a/components/constellation/pipeline.rs
+++ b/components/constellation/pipeline.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::borrow::Cow;
use std::collections::HashSet;
use std::rc::Rc;
use std::sync::Arc;
@@ -192,9 +191,6 @@ pub struct InitialPipelineState {
/// Application window's GL Context for Media player
pub player_context: WindowGLContext,
- /// User agent string to report in network requests.
- pub user_agent: Cow<'static, str>,
-
/// The image bytes associated with the RippyPNG embedder resource.
pub rippy_data: Vec<u8>,
@@ -294,7 +290,6 @@ impl Pipeline {
webgl_chan: state.webgl_chan,
webxr_registry: state.webxr_registry,
player_context: state.player_context,
- user_agent: state.user_agent,
rippy_data: state.rippy_data,
user_content_manager: state.user_content_manager,
};
@@ -501,7 +496,6 @@ pub struct UnprivilegedPipelineContent {
webgl_chan: Option<WebGLPipeline>,
webxr_registry: Option<webxr_api::Registry>,
player_context: WindowGLContext,
- user_agent: Cow<'static, str>,
rippy_data: Vec<u8>,
user_content_manager: UserContentManager,
}
@@ -554,7 +548,6 @@ impl UnprivilegedPipelineContent {
layout_factory,
Arc::new(self.system_font_service.to_proxy()),
self.load_data.clone(),
- self.user_agent,
);
if wait_for_completion {
diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs
index 3286d1caad3..8c5758830c1 100644
--- a/components/net/fetch/methods.rs
+++ b/components/net/fetch/methods.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::borrow::Cow;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
use std::{io, mem, str};
@@ -61,7 +60,7 @@ pub enum Data {
pub struct FetchContext {
pub state: Arc<HttpState>,
- pub user_agent: Cow<'static, str>,
+ pub user_agent: String,
pub devtools_chan: Option<Arc<Mutex<Sender<DevtoolsControlMsg>>>>,
pub filemanager: Arc<Mutex<FileManager>>,
pub file_token: FileTokenCheck,
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 8549b11a101..b6f107878a4 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -1255,10 +1255,9 @@ async fn http_network_or_cache_fetch(
// Step 8.15: If httpRequest’s header list does not contain `User-Agent`, then user agents
// should append (`User-Agent`, default `User-Agent` value) to httpRequest’s header list.
if !http_request.headers.contains_key(header::USER_AGENT) {
- let user_agent = context.user_agent.clone().into_owned();
http_request
.headers
- .typed_insert::<UserAgent>(user_agent.parse().unwrap());
+ .typed_insert::<UserAgent>(context.user_agent.parse().unwrap());
}
// Steps 8.16 to 8.18
diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs
index e26ba346b2e..f792596e12d 100644
--- a/components/net/resource_thread.rs
+++ b/components/net/resource_thread.rs
@@ -4,7 +4,7 @@
//! A thread that takes a URL and streams back the binary data.
-use std::borrow::{Cow, ToOwned};
+use std::borrow::ToOwned;
use std::collections::HashMap;
use std::fs::File;
use std::io::prelude::*;
@@ -71,7 +71,6 @@ fn load_root_cert_store_from_file(file_path: String) -> io::Result<RootCertStore
/// Returns a tuple of (public, private) senders to the new threads.
#[allow(clippy::too_many_arguments)]
pub fn new_resource_threads(
- user_agent: Cow<'static, str>,
devtools_sender: Option<Sender<DevtoolsControlMsg>>,
time_profiler_chan: ProfilerChan,
mem_profiler_chan: MemProfilerChan,
@@ -93,7 +92,6 @@ pub fn new_resource_threads(
};
let (public_core, private_core) = new_core_resource_thread(
- user_agent,
devtools_sender,
time_profiler_chan,
mem_profiler_chan,
@@ -113,7 +111,6 @@ pub fn new_resource_threads(
/// Create a CoreResourceThread
#[allow(clippy::too_many_arguments)]
pub fn new_core_resource_thread(
- user_agent: Cow<'static, str>,
devtools_sender: Option<Sender<DevtoolsControlMsg>>,
time_profiler_chan: ProfilerChan,
mem_profiler_chan: MemProfilerChan,
@@ -131,7 +128,6 @@ pub fn new_core_resource_thread(
.name("ResourceManager".to_owned())
.spawn(move || {
let resource_manager = CoreResourceManager::new(
- user_agent,
devtools_sender,
time_profiler_chan,
embedder_proxy.clone(),
@@ -549,7 +545,6 @@ pub struct AuthCache {
}
pub struct CoreResourceManager {
- user_agent: Cow<'static, str>,
devtools_sender: Option<Sender<DevtoolsControlMsg>>,
sw_managers: HashMap<ImmutableOrigin, IpcSender<CustomResponseMediator>>,
filemanager: FileManager,
@@ -691,7 +686,6 @@ impl CoreResourceThreadPool {
impl CoreResourceManager {
pub fn new(
- user_agent: Cow<'static, str>,
devtools_sender: Option<Sender<DevtoolsControlMsg>>,
_profiler_chan: ProfilerChan,
embedder_proxy: EmbedderProxy,
@@ -705,7 +699,6 @@ impl CoreResourceManager {
let pool = CoreResourceThreadPool::new(num_threads, "CoreResourceThreadPool".to_string());
let pool_handle = Arc::new(pool);
CoreResourceManager {
- user_agent,
devtools_sender,
sw_managers: Default::default(),
filemanager: FileManager::new(embedder_proxy.clone(), Arc::downgrade(&pool_handle)),
@@ -749,7 +742,6 @@ impl CoreResourceManager {
protocols: Arc<ProtocolRegistry>,
) {
let http_state = http_state.clone();
- let ua = self.user_agent.clone();
let dc = self.devtools_sender.clone();
let filemanager = self.filemanager.clone();
let request_interceptor = self.request_interceptor.clone();
@@ -790,7 +782,7 @@ impl CoreResourceManager {
// todo service worker stuff
let context = FetchContext {
state: http_state,
- user_agent: ua,
+ user_agent: servo_config::pref!(user_agent),
devtools_chan: dc.map(|dc| Arc::new(Mutex::new(dc))),
filemanager: Arc::new(Mutex::new(filemanager)),
file_token,
diff --git a/components/net/tests/resource_thread.rs b/components/net/tests/resource_thread.rs
index 0de76fd5dd1..05b8bbad640 100644
--- a/components/net/tests/resource_thread.rs
+++ b/components/net/tests/resource_thread.rs
@@ -25,7 +25,6 @@ fn test_exit() {
let (mtx, _mrx) = ipc::channel().unwrap();
let (sender, receiver) = ipc::channel().unwrap();
let (resource_thread, _private_resource_thread) = new_core_resource_thread(
- "".into(),
None,
ProfilerChan(tx),
MemProfilerChan(mtx),
diff --git a/components/script/dom/dissimilaroriginwindow.rs b/components/script/dom/dissimilaroriginwindow.rs
index 98d1631c728..e360e98e4c5 100644
--- a/components/script/dom/dissimilaroriginwindow.rs
+++ b/components/script/dom/dissimilaroriginwindow.rs
@@ -64,7 +64,6 @@ impl DissimilarOriginWindow {
// FIXME(nox): The microtask queue is probably not important
// here, but this whole DOM interface is a hack anyway.
global_to_clone_from.microtask_queue().clone(),
- global_to_clone_from.get_user_agent(),
#[cfg(feature = "webgpu")]
global_to_clone_from.wgpu_id_hub(),
Some(global_to_clone_from.is_secure_context()),
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 7b8169a06a6..11ffdc752d0 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::borrow::Cow;
use std::cell::{Cell, OnceCell};
use std::collections::hash_map::Entry;
use std::collections::{HashMap, VecDeque};
@@ -319,9 +318,6 @@ pub(crate) struct GlobalScope {
#[allow(clippy::vec_box)]
consumed_rejections: DomRefCell<Vec<Box<Heap<*mut JSObject>>>>,
- /// An optional string allowing the user agent to be set for testing.
- user_agent: Cow<'static, str>,
-
/// Identity Manager for WebGPU resources
#[ignore_malloc_size_of = "defined in wgpu"]
#[no_trace]
@@ -720,7 +716,6 @@ impl GlobalScope {
origin: MutableOrigin,
creation_url: Option<ServoUrl>,
microtask_queue: Rc<MicrotaskQueue>,
- user_agent: Cow<'static, str>,
#[cfg(feature = "webgpu")] gpu_id_hub: Arc<IdentityHub>,
inherited_secure_context: Option<bool>,
unminify_js: bool,
@@ -754,7 +749,6 @@ impl GlobalScope {
event_source_tracker: DOMTracker::new(),
uncaught_rejections: Default::default(),
consumed_rejections: Default::default(),
- user_agent,
#[cfg(feature = "webgpu")]
gpu_id_hub,
#[cfg(feature = "webgpu")]
@@ -2920,10 +2914,6 @@ impl GlobalScope {
);
}
- pub(crate) fn get_user_agent(&self) -> Cow<'static, str> {
- self.user_agent.clone()
- }
-
pub(crate) fn get_https_state(&self) -> HttpsState {
self.https_state.get()
}
diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs
index 371ab0b1b9f..05eaf4f83c0 100644
--- a/components/script/dom/navigator.rs
+++ b/components/script/dom/navigator.rs
@@ -8,6 +8,7 @@ use std::sync::LazyLock;
use dom_struct::dom_struct;
use js::rust::MutableHandleValue;
+use servo_config::pref;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorMethods;
@@ -192,7 +193,7 @@ impl NavigatorMethods<crate::DomTypeHolder> for Navigator {
// https://html.spec.whatwg.org/multipage/#dom-navigator-useragent
fn UserAgent(&self) -> DOMString {
- navigatorinfo::UserAgent(self.global().get_user_agent())
+ navigatorinfo::UserAgent(&pref!(user_agent))
}
// https://html.spec.whatwg.org/multipage/#dom-navigator-appversion
diff --git a/components/script/dom/navigatorinfo.rs b/components/script/dom/navigatorinfo.rs
index 66c2f3658fe..f3e6ddc109b 100644
--- a/components/script/dom/navigatorinfo.rs
+++ b/components/script/dom/navigatorinfo.rs
@@ -2,8 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::borrow::Cow;
-
use crate::dom::bindings::str::DOMString;
#[allow(non_snake_case)]
@@ -66,8 +64,8 @@ pub(crate) fn Platform() -> DOMString {
}
#[allow(non_snake_case)]
-pub(crate) fn UserAgent(user_agent: Cow<'static, str>) -> DOMString {
- DOMString::from(&*user_agent)
+pub(crate) fn UserAgent(user_agent: &str) -> DOMString {
+ DOMString::from(user_agent)
}
#[allow(non_snake_case)]
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 4da445c20c6..42c085a81df 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::borrow::{Cow, ToOwned};
+use std::borrow::ToOwned;
use std::cell::{Cell, RefCell, RefMut};
use std::cmp;
use std::collections::hash_map::Entry;
@@ -2804,7 +2804,6 @@ impl Window {
unminify_css: bool,
local_script_source: Option<String>,
user_content_manager: UserContentManager,
- user_agent: Cow<'static, str>,
player_context: WindowGLContext,
#[cfg(feature = "webgpu")] gpu_id_hub: Arc<IdentityHub>,
inherited_secure_context: Option<bool>,
@@ -2831,7 +2830,6 @@ impl Window {
origin,
Some(creator_url),
microtask_queue,
- user_agent,
#[cfg(feature = "webgpu")]
gpu_id_hub,
inherited_secure_context,
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index 276b39657a6..f084d429730 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -79,7 +79,6 @@ pub(crate) fn prepare_workerscope_init(
pipeline_id: global.pipeline_id(),
origin: global.origin().immutable().clone(),
creation_url: global.creation_url().clone(),
- user_agent: global.get_user_agent(),
inherited_secure_context: Some(global.is_secure_context()),
};
@@ -164,7 +163,6 @@ impl WorkerGlobalScope {
MutableOrigin::new(init.origin),
init.creation_url,
runtime.microtask_queue.clone(),
- init.user_agent,
#[cfg(feature = "webgpu")]
gpu_id_hub,
init.inherited_secure_context,
diff --git a/components/script/dom/workernavigator.rs b/components/script/dom/workernavigator.rs
index 1034381a287..e3a406ed4f8 100644
--- a/components/script/dom/workernavigator.rs
+++ b/components/script/dom/workernavigator.rs
@@ -4,6 +4,7 @@
use dom_struct::dom_struct;
use js::rust::MutableHandleValue;
+use servo_config::pref;
use crate::dom::bindings::codegen::Bindings::WorkerNavigatorBinding::WorkerNavigatorMethods;
use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object};
@@ -85,7 +86,7 @@ impl WorkerNavigatorMethods<crate::DomTypeHolder> for WorkerNavigator {
// https://html.spec.whatwg.org/multipage/#dom-navigator-useragent
fn UserAgent(&self) -> DOMString {
- navigatorinfo::UserAgent(self.global().get_user_agent())
+ navigatorinfo::UserAgent(&pref!(user_agent))
}
// https://html.spec.whatwg.org/multipage/#dom-navigator-appversion
diff --git a/components/script/dom/workletglobalscope.rs b/components/script/dom/workletglobalscope.rs
index 0055d39bec3..14a4b75470b 100644
--- a/components/script/dom/workletglobalscope.rs
+++ b/components/script/dom/workletglobalscope.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::borrow::Cow;
use std::sync::Arc;
use base::id::PipelineId;
@@ -96,7 +95,6 @@ impl WorkletGlobalScope {
MutableOrigin::new(ImmutableOrigin::new_opaque()),
None,
Default::default(),
- init.user_agent.clone(),
#[cfg(feature = "webgpu")]
init.gpu_id_hub.clone(),
init.inherited_secure_context,
@@ -185,8 +183,6 @@ pub(crate) struct WorkletGlobalScopeInit {
pub(crate) to_constellation_sender: IpcSender<(PipelineId, ScriptMsg)>,
/// The image cache
pub(crate) image_cache: Arc<dyn ImageCache>,
- /// An optional string allowing the user agent to be set for testing
- pub(crate) user_agent: Cow<'static, str>,
/// Identity manager for WebGPU resources
#[cfg(feature = "webgpu")]
pub(crate) gpu_id_hub: Arc<IdentityHub>,
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 8c0eec13628..35b45fee6dd 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -17,7 +17,6 @@
//! a page runs its course and the script thread returns to processing events in the main event
//! loop.
-use std::borrow::Cow;
use std::cell::{Cell, RefCell};
use std::collections::{HashMap, HashSet};
use std::default::Default;
@@ -308,9 +307,6 @@ pub struct ScriptThread {
#[no_trace]
user_content_manager: UserContentManager,
- /// An optional string allowing the user agent to be set for testing.
- user_agent: Cow<'static, str>,
-
/// Application window's GL Context for Media player
#[no_trace]
player_context: WindowGLContext,
@@ -390,7 +386,6 @@ impl ScriptThreadFactory for ScriptThread {
layout_factory: Arc<dyn LayoutFactory>,
system_font_service: Arc<SystemFontServiceProxy>,
load_data: LoadData,
- user_agent: Cow<'static, str>,
) {
thread::Builder::new()
.name(format!("Script{:?}", state.id))
@@ -408,8 +403,7 @@ impl ScriptThreadFactory for ScriptThread {
let memory_profiler_sender = state.memory_profiler_sender.clone();
let window_size = state.window_size;
- let script_thread =
- ScriptThread::new(state, layout_factory, system_font_service, user_agent);
+ let script_thread = ScriptThread::new(state, layout_factory, system_font_service);
SCRIPT_THREAD_ROOT.with(|root| {
root.set(Some(&script_thread as *const _));
@@ -736,7 +730,6 @@ impl ScriptThread {
.pipeline_to_constellation_sender
.clone(),
image_cache: script_thread.image_cache.clone(),
- user_agent: script_thread.user_agent.clone(),
#[cfg(feature = "webgpu")]
gpu_id_hub: script_thread.gpu_id_hub.clone(),
inherited_secure_context: script_thread.inherited_secure_context,
@@ -826,7 +819,6 @@ impl ScriptThread {
state: InitialScriptState,
layout_factory: Arc<dyn LayoutFactory>,
system_font_service: Arc<SystemFontServiceProxy>,
- user_agent: Cow<'static, str>,
) -> ScriptThread {
let (self_sender, self_receiver) = unbounded();
let runtime = Runtime::new(Some(SendableTaskSource {
@@ -938,7 +930,6 @@ impl ScriptThread {
unminify_js: opts.unminify_js,
local_script_source: opts.local_script_source.clone(),
unminify_css: opts.unminify_css,
- user_agent,
user_content_manager: state.user_content_manager,
player_context: state.player_context,
node_ids: Default::default(),
@@ -3109,7 +3100,6 @@ impl ScriptThread {
self.unminify_css,
self.local_script_source.clone(),
self.user_content_manager.clone(),
- self.user_agent.clone(),
self.player_context.clone(),
#[cfg(feature = "webgpu")]
self.gpu_id_hub.clone(),
diff --git a/components/servo/examples/winit_minimal.rs b/components/servo/examples/winit_minimal.rs
index 49d0c96f806..c4995a54224 100644
--- a/components/servo/examples/winit_minimal.rs
+++ b/components/servo/examples/winit_minimal.rs
@@ -102,7 +102,6 @@ impl ApplicationHandler<WakerEvent> for App {
}),
window_delegate.clone(),
Default::default(),
- Default::default(),
);
servo.setup_logging();
diff --git a/components/servo/lib.rs b/components/servo/lib.rs
index 7027fa77972..e61a08fff89 100644
--- a/components/servo/lib.rs
+++ b/components/servo/lib.rs
@@ -24,7 +24,6 @@ mod servo_delegate;
mod webview;
mod webview_delegate;
-use std::borrow::Cow;
use std::cell::{Cell, RefCell};
use std::cmp::max;
use std::collections::HashMap;
@@ -264,7 +263,6 @@ impl Servo {
rendering_context: Rc<dyn RenderingContext>,
mut embedder: Box<dyn EmbedderMethods>,
window: Rc<dyn WindowMethods>,
- user_agent: Option<String>,
user_content_manager: UserContentManager,
) -> Self {
// Global configuration options, parsed from the command line.
@@ -288,24 +286,6 @@ impl Servo {
media_platform::init();
}
- let user_agent = match user_agent {
- Some(ref ua) if ua == "ios" => default_user_agent_string_for(UserAgent::iOS).into(),
- Some(ref ua) if ua == "android" => {
- default_user_agent_string_for(UserAgent::Android).into()
- },
- Some(ref ua) if ua == "desktop" => {
- default_user_agent_string_for(UserAgent::Desktop).into()
- },
- Some(ref ua) if ua == "ohos" => {
- default_user_agent_string_for(UserAgent::OpenHarmony).into()
- },
- Some(ua) => ua.into(),
- None => embedder
- .get_user_agent_string()
- .map(Into::into)
- .unwrap_or(default_user_agent_string_for(DEFAULT_USER_AGENT).into()),
- };
-
// Get GL bindings
let webrender_gl = rendering_context.gleam_gl_api();
@@ -486,7 +466,6 @@ impl Servo {
protocols.merge(embedder.get_protocol_handlers());
let constellation_chan = create_constellation(
- user_agent,
opts.config_dir.clone(),
embedder_proxy,
compositor_proxy.clone(),
@@ -533,7 +512,6 @@ impl Servo {
shutdown_state: shutdown_state.clone(),
},
opts.debug.convert_mouse_to_touch,
- embedder.get_version_string().unwrap_or_default(),
);
Self {
@@ -1041,7 +1019,6 @@ fn create_compositor_channel(
#[allow(clippy::too_many_arguments)]
fn create_constellation(
- user_agent: Cow<'static, str>,
config_dir: Option<PathBuf>,
embedder_proxy: EmbedderProxy,
compositor_proxy: CompositorProxy,
@@ -1066,7 +1043,6 @@ fn create_constellation(
BluetoothThreadFactory::new(embedder_proxy.clone());
let (public_resource_threads, private_resource_threads) = new_resource_threads(
- user_agent.clone(),
devtools_sender.clone(),
time_profiler_chan.clone(),
mem_profiler_chan.clone(),
@@ -1105,7 +1081,6 @@ fn create_constellation(
#[cfg(not(feature = "webxr"))]
webxr_registry: None,
webgl_threads,
- user_agent,
webrender_external_images: external_images,
#[cfg(feature = "webgpu")]
wgpu_image_map,
@@ -1229,71 +1204,3 @@ fn create_sandbox() {
fn create_sandbox() {
panic!("Sandboxing is not supported on Windows, iOS, ARM targets and android.");
}
-
-enum UserAgent {
- Desktop,
- Android,
- OpenHarmony,
- #[allow(non_camel_case_types)]
- iOS,
-}
-
-fn get_servo_version() -> &'static str {
- env!("CARGO_PKG_VERSION")
-}
-
-fn default_user_agent_string_for(agent: UserAgent) -> String {
- let servo_version = get_servo_version();
-
- #[cfg(all(target_os = "linux", target_arch = "x86_64", not(target_env = "ohos")))]
- let desktop_ua_string =
- format!("Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Servo/{servo_version} Firefox/128.0");
- #[cfg(all(
- target_os = "linux",
- not(target_arch = "x86_64"),
- not(target_env = "ohos")
- ))]
- let desktop_ua_string =
- format!("Mozilla/5.0 (X11; Linux i686; rv:128.0) Servo/{servo_version} Firefox/128.0");
-
- #[cfg(all(target_os = "windows", target_arch = "x86_64"))]
- let desktop_ua_string = format!(
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Servo/{servo_version} Firefox/128.0"
- );
- #[cfg(all(target_os = "windows", not(target_arch = "x86_64")))]
- let desktop_ua_string =
- format!("Mozilla/5.0 (Windows NT 10.0; rv:128.0) Servo/{servo_version} Firefox/128.0");
-
- #[cfg(target_os = "macos")]
- let desktop_ua_string = format!(
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Servo/{servo_version} Firefox/128.0"
- );
-
- #[cfg(any(target_os = "android", target_env = "ohos"))]
- let desktop_ua_string = "".to_string();
-
- match agent {
- UserAgent::Desktop => desktop_ua_string,
- UserAgent::Android => {
- format!("Mozilla/5.0 (Android; Mobile; rv:128.0) Servo/{servo_version} Firefox/128.0")
- },
- UserAgent::OpenHarmony => format!(
- "Mozilla/5.0 (OpenHarmony; Mobile; rv:128.0) Servo/{servo_version} Firefox/128.0"
- ),
- UserAgent::iOS => format!(
- "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X; rv:128.0) Servo/{servo_version} Firefox/128.0"
- ),
- }
-}
-
-#[cfg(target_os = "android")]
-const DEFAULT_USER_AGENT: UserAgent = UserAgent::Android;
-
-#[cfg(target_env = "ohos")]
-const DEFAULT_USER_AGENT: UserAgent = UserAgent::OpenHarmony;
-
-#[cfg(target_os = "ios")]
-const DEFAULT_USER_AGENT: UserAgent = UserAgent::iOS;
-
-#[cfg(not(any(target_os = "android", target_os = "ios", target_env = "ohos")))]
-const DEFAULT_USER_AGENT: UserAgent = UserAgent::Desktop;
diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs
index e7971962106..4a1cf193a34 100644
--- a/components/shared/script/lib.rs
+++ b/components/shared/script/lib.rs
@@ -13,7 +13,6 @@ mod script_msg;
pub mod serializable;
pub mod transferable;
-use std::borrow::Cow;
use std::collections::{HashMap, VecDeque};
use std::fmt;
use std::sync::Arc;
@@ -564,8 +563,6 @@ pub struct WorkerGlobalScopeInit {
pub origin: ImmutableOrigin,
/// The creation URL
pub creation_url: Option<ServoUrl>,
- /// An optional string allowing the user agnet to be set for testing.
- pub user_agent: Cow<'static, str>,
/// True if secure context
pub inherited_secure_context: Option<bool>,
}
diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs
index 3001f9ce77d..817ddd820bd 100644
--- a/components/shared/script_layout/lib.rs
+++ b/components/shared/script_layout/lib.rs
@@ -11,7 +11,6 @@
pub mod wrapper_traits;
use std::any::Any;
-use std::borrow::Cow;
use std::sync::Arc;
use std::sync::atomic::{AtomicIsize, AtomicU64, Ordering};
@@ -280,7 +279,6 @@ pub trait ScriptThreadFactory {
layout_factory: Arc<dyn LayoutFactory>,
system_font_service: Arc<SystemFontServiceProxy>,
load_data: LoadData,
- user_agent: Cow<'static, str>,
);
}
#[derive(Clone, Default)]
diff --git a/ports/servoshell/desktop/app.rs b/ports/servoshell/desktop/app.rs
index 6df9945ee7a..613b2807d14 100644
--- a/ports/servoshell/desktop/app.rs
+++ b/ports/servoshell/desktop/app.rs
@@ -161,7 +161,6 @@ impl App {
window.rendering_context(),
embedder,
Rc::new(UpcastedWindow(window.clone())),
- self.servoshell_preferences.user_agent.clone(),
user_content_manager,
);
servo.setup_logging();
diff --git a/ports/servoshell/desktop/embedder.rs b/ports/servoshell/desktop/embedder.rs
index ccb4e5fde84..9c8563b04b4 100644
--- a/ports/servoshell/desktop/embedder.rs
+++ b/ports/servoshell/desktop/embedder.rs
@@ -68,8 +68,4 @@ impl EmbedderMethods for EmbedderCallbacks {
registry.register("resource", resource::ResourceProtocolHandler::default());
registry
}
-
- fn get_version_string(&self) -> Option<String> {
- crate::servo_version().into()
- }
}
diff --git a/ports/servoshell/egl/android/simpleservo.rs b/ports/servoshell/egl/android/simpleservo.rs
index 348faa8d4e0..1f5a6adee61 100644
--- a/ports/servoshell/egl/android/simpleservo.rs
+++ b/ports/servoshell/egl/android/simpleservo.rs
@@ -98,7 +98,6 @@ pub fn init(
rendering_context.clone(),
embedder_callbacks,
window_callbacks.clone(),
- None,
Default::default(),
);
diff --git a/ports/servoshell/egl/ohos/simpleservo.rs b/ports/servoshell/egl/ohos/simpleservo.rs
index 621b2f446ed..22db879c24b 100644
--- a/ports/servoshell/egl/ohos/simpleservo.rs
+++ b/ports/servoshell/egl/ohos/simpleservo.rs
@@ -130,7 +130,6 @@ pub fn init(
rendering_context.clone(),
embedder_callbacks,
window_callbacks.clone(),
- None, /* user_agent */
Default::default(),
);
diff --git a/ports/servoshell/prefs.rs b/ports/servoshell/prefs.rs
index 5157615f44a..eff5bf63e1b 100644
--- a/ports/servoshell/prefs.rs
+++ b/ports/servoshell/prefs.rs
@@ -23,8 +23,6 @@ use url::Url;
#[cfg_attr(any(target_os = "android", target_env = "ohos"), allow(dead_code))]
#[derive(Clone)]
pub(crate) struct ServoShellPreferences {
- /// The user agent to use for servoshell.
- pub user_agent: Option<String>,
/// A URL to load when starting servoshell.
pub url: Option<String>,
/// An override value for the device pixel ratio.
@@ -74,7 +72,6 @@ impl Default for ServoShellPreferences {
searchpage: "https://duckduckgo.com/html/?q=%s".into(),
tracing_filter: None,
url: None,
- user_agent: None,
output_image_path: None,
exit_after_stable_image: false,
userscripts_directory: None,
@@ -615,7 +612,6 @@ pub(crate) fn parse_command_line_arguments(args: Vec<String>) -> ArgumentParsing
let exit_after_load = opt_match.opt_present("x") || output_image_path.is_some();
let wait_for_stable_image = exit_after_load;
let servoshell_preferences = ServoShellPreferences {
- user_agent: opt_match.opt_str("u"),
url,
no_native_titlebar,
device_pixel_ratio_override,