aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/navigator.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/navigator.rs')
-rw-r--r--components/script/dom/navigator.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs
index 8a0f6a21d98..9121f7ef54d 100644
--- a/components/script/dom/navigator.rs
+++ b/components/script/dom/navigator.rs
@@ -11,7 +11,10 @@ use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString;
use crate::dom::bluetooth::Bluetooth;
use crate::dom::gamepadlist::GamepadList;
+use crate::dom::gpu::GPU;
+use crate::dom::identityhub::Identities;
use crate::dom::mediadevices::MediaDevices;
+use crate::dom::mediasession::MediaSession;
use crate::dom::mimetypearray::MimeTypeArray;
use crate::dom::navigatorinfo;
use crate::dom::permissions::Permissions;
@@ -21,7 +24,9 @@ use crate::dom::serviceworkercontainer::ServiceWorkerContainer;
use crate::dom::window::Window;
use crate::dom::xr::XR;
use dom_struct::dom_struct;
+use std::cell::RefCell;
use std::rc::Rc;
+use webgpu::wgpu::AdapterId;
#[dom_struct]
pub struct Navigator {
@@ -34,6 +39,10 @@ pub struct Navigator {
mediadevices: MutNullableDom<MediaDevices>,
gamepads: MutNullableDom<GamepadList>,
permissions: MutNullableDom<Permissions>,
+ mediasession: MutNullableDom<MediaSession>,
+ gpu: MutNullableDom<GPU>,
+ #[ignore_malloc_size_of = "Defined in wgpu"]
+ gpu_id_hub: RefCell<Identities>,
}
impl Navigator {
@@ -48,6 +57,9 @@ impl Navigator {
mediadevices: Default::default(),
gamepads: Default::default(),
permissions: Default::default(),
+ mediasession: Default::default(),
+ gpu: Default::default(),
+ gpu_id_hub: RefCell::new(Identities::new()),
}
}
@@ -60,6 +72,12 @@ impl Navigator {
}
}
+impl Navigator {
+ pub fn create_adapter_id(&self) -> AdapterId {
+ self.gpu_id_hub.borrow_mut().create_adapter_id()
+ }
+}
+
impl NavigatorMethods for Navigator {
// https://html.spec.whatwg.org/multipage/#dom-navigator-product
fn Product(&self) -> DOMString {
@@ -186,4 +204,25 @@ impl NavigatorMethods for Navigator {
self.mediadevices
.or_init(|| MediaDevices::new(&self.global()))
}
+
+ /// https://w3c.github.io/mediasession/#dom-navigator-mediasession
+ fn MediaSession(&self) -> DomRoot<MediaSession> {
+ self.mediasession.or_init(|| {
+ // There is a single MediaSession instance per Pipeline
+ // and only one active MediaSession globally.
+ //
+ // MediaSession creation can happen in two cases:
+ //
+ // - If content gets `navigator.mediaSession`
+ // - If a media instance (HTMLMediaElement so far) starts playing media.
+ let global = self.global();
+ let window = global.as_window();
+ MediaSession::new(window)
+ })
+ }
+
+ // https://gpuweb.github.io/gpuweb/#dom-navigator-gpu
+ fn Gpu(&self) -> DomRoot<GPU> {
+ self.gpu.or_init(|| GPU::new(&self.global()))
+ }
}