diff options
Diffstat (limited to 'components/script/dom/navigator.rs')
-rw-r--r-- | components/script/dom/navigator.rs | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 612d2e68ff4..d16b4f263ae 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -2,6 +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::cell::Cell; use std::convert::TryInto; use dom_struct::dom_struct; @@ -9,11 +10,13 @@ use js::jsval::JSVal; use lazy_static::lazy_static; use crate::dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorMethods; +use crate::dom::bindings::codegen::Bindings::WindowBinding::Window_Binding::WindowMethods; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::utils::to_frozen_array; use crate::dom::bluetooth::Bluetooth; +use crate::dom::gamepad::Gamepad; use crate::dom::gamepadlist::GamepadList; use crate::dom::gpu::GPU; use crate::dom::mediadevices::MediaDevices; @@ -43,10 +46,13 @@ pub struct Navigator { service_worker: MutNullableDom<ServiceWorkerContainer>, xr: MutNullableDom<XRSystem>, mediadevices: MutNullableDom<MediaDevices>, + /// <https://www.w3.org/TR/gamepad/#dfn-gamepads> gamepads: MutNullableDom<GamepadList>, permissions: MutNullableDom<Permissions>, mediasession: MutNullableDom<MediaSession>, gpu: MutNullableDom<GPU>, + /// <https://www.w3.org/TR/gamepad/#dfn-hasgamepadgesture> + has_gamepad_gesture: Cell<bool>, } impl Navigator { @@ -63,6 +69,7 @@ impl Navigator { permissions: Default::default(), mediasession: Default::default(), gpu: Default::default(), + has_gamepad_gesture: Cell::new(false), } } @@ -73,6 +80,21 @@ impl Navigator { pub fn xr(&self) -> Option<DomRoot<XRSystem>> { self.xr.get() } + + pub fn gamepads(&self) -> DomRoot<GamepadList> { + let gamepads = self + .gamepads + .or_init(|| GamepadList::new(&self.global(), &[])); + gamepads + } + + pub fn has_gamepad_gesture(&self) -> bool { + self.has_gamepad_gesture.get() + } + + pub fn set_has_gamepad_gesture(&self, has_gamepad_gesture: bool) { + self.has_gamepad_gesture.set(has_gamepad_gesture); + } } impl NavigatorMethods for Navigator { @@ -169,14 +191,20 @@ impl NavigatorMethods for Navigator { true } - // https://www.w3.org/TR/gamepad/#navigator-interface-extension - fn GetGamepads(&self) -> DomRoot<GamepadList> { - let root = self - .gamepads - .or_init(|| GamepadList::new(&self.global(), &[])); + /// <https://www.w3.org/TR/gamepad/#dom-navigator-getgamepads> + fn GetGamepads(&self) -> Vec<Option<DomRoot<Gamepad>>> { + let global = self.global(); + let window = global.as_window(); + let doc = window.Document(); + + // TODO: Handle permissions policy once implemented + if !doc.is_fully_active() || !self.has_gamepad_gesture.get() { + return Vec::new(); + } + + let root = self.gamepads.or_init(|| GamepadList::new(&global, &[])); - // TODO: Add gamepads - root + root.list() } // https://w3c.github.io/permissions/#navigator-and-workernavigator-extension fn Permissions(&self) -> DomRoot<Permissions> { |