script/dom/
workernavigator.rs1use dom_struct::dom_struct;
6use js::rust::MutableHandleValue;
7use servo_config::pref;
8
9use crate::dom::bindings::codegen::Bindings::WorkerNavigatorBinding::WorkerNavigatorMethods;
10use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object};
11use crate::dom::bindings::root::{DomRoot, MutNullableDom};
12use crate::dom::bindings::str::DOMString;
13use crate::dom::bindings::utils::to_frozen_array;
14use crate::dom::navigator::hardware_concurrency;
15use crate::dom::navigatorinfo;
16use crate::dom::permissions::Permissions;
17#[cfg(feature = "webgpu")]
18use crate::dom::webgpu::gpu::GPU;
19use crate::dom::workerglobalscope::WorkerGlobalScope;
20use crate::script_runtime::{CanGc, JSContext};
21
22#[dom_struct]
24pub(crate) struct WorkerNavigator {
25 reflector_: Reflector,
26 permissions: MutNullableDom<Permissions>,
27 #[cfg(feature = "webgpu")]
28 gpu: MutNullableDom<GPU>,
29}
30
31impl WorkerNavigator {
32 fn new_inherited() -> WorkerNavigator {
33 WorkerNavigator {
34 reflector_: Reflector::new(),
35 permissions: Default::default(),
36 #[cfg(feature = "webgpu")]
37 gpu: Default::default(),
38 }
39 }
40
41 pub(crate) fn new(global: &WorkerGlobalScope, can_gc: CanGc) -> DomRoot<WorkerNavigator> {
42 reflect_dom_object(Box::new(WorkerNavigator::new_inherited()), global, can_gc)
43 }
44}
45
46impl WorkerNavigatorMethods<crate::DomTypeHolder> for WorkerNavigator {
47 fn Product(&self) -> DOMString {
49 navigatorinfo::Product()
50 }
51
52 fn ProductSub(&self) -> DOMString {
54 navigatorinfo::ProductSub()
55 }
56
57 fn Vendor(&self) -> DOMString {
59 navigatorinfo::Vendor()
60 }
61
62 fn VendorSub(&self) -> DOMString {
64 navigatorinfo::VendorSub()
65 }
66
67 fn TaintEnabled(&self) -> bool {
69 navigatorinfo::TaintEnabled()
70 }
71
72 fn AppName(&self) -> DOMString {
74 navigatorinfo::AppName()
75 }
76
77 fn AppCodeName(&self) -> DOMString {
79 navigatorinfo::AppCodeName()
80 }
81
82 fn Platform(&self) -> DOMString {
84 navigatorinfo::Platform()
85 }
86
87 fn UserAgent(&self) -> DOMString {
89 navigatorinfo::UserAgent(&pref!(user_agent))
90 }
91
92 fn AppVersion(&self) -> DOMString {
94 navigatorinfo::AppVersion()
95 }
96
97 fn Language(&self) -> DOMString {
99 navigatorinfo::Language()
100 }
101
102 #[allow(unsafe_code)]
104 fn Languages(&self, cx: JSContext, can_gc: CanGc, retval: MutableHandleValue) {
105 to_frozen_array(&[self.Language()], cx, retval, can_gc)
106 }
107
108 fn OnLine(&self) -> bool {
110 true
111 }
112
113 fn Permissions(&self) -> DomRoot<Permissions> {
115 self.permissions
116 .or_init(|| Permissions::new(&self.global(), CanGc::note()))
117 }
118
119 #[cfg(feature = "webgpu")]
121 fn Gpu(&self) -> DomRoot<GPU> {
122 self.gpu.or_init(|| GPU::new(&self.global(), CanGc::note()))
123 }
124
125 fn HardwareConcurrency(&self) -> u64 {
127 hardware_concurrency()
128 }
129}