From 6a21983e1570846a6024bf45bfc3cfc5c4984a1a Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 15:50:37 +0530 Subject: [PATCH 01/15] Update webxr --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 15991d2b9ff..f2caa82edb1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6450,7 +6450,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1" +source = "git+https://github.com/servo/webxr#ed1ec1afadce730247401e60994b7f6ff226639d" dependencies = [ "bindgen", "euclid", @@ -6471,7 +6471,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1" +source = "git+https://github.com/servo/webxr#ed1ec1afadce730247401e60994b7f6ff226639d" dependencies = [ "euclid", "ipc-channel", From 9ecb13d83f2c83c27f2e50f98dcda0a5ef0a886d Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 15:50:57 +0530 Subject: [PATCH 02/15] Add SimulateVisibilityChange() --- components/script/dom/fakexrdevice.rs | 15 +++++++++++++-- components/script/dom/webidls/FakeXRDevice.webidl | 8 +------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/components/script/dom/fakexrdevice.rs b/components/script/dom/fakexrdevice.rs index bb73580e98a..d193c095717 100644 --- a/components/script/dom/fakexrdevice.rs +++ b/components/script/dom/fakexrdevice.rs @@ -5,6 +5,7 @@ use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::{ self, FakeXRDeviceMethods, FakeXRRigidTransformInit, FakeXRViewInit, }; +use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRVisibilityState; use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::refcounted::TrustedPromise; @@ -20,7 +21,7 @@ use ipc_channel::ipc::IpcSender; use ipc_channel::router::ROUTER; use profile_traits::ipc; use std::rc::Rc; -use webxr_api::{MockDeviceMsg, MockViewInit, MockViewsInit}; +use webxr_api::{MockDeviceMsg, MockViewInit, MockViewsInit, Visibility}; #[dom_struct] pub struct FakeXRDevice { @@ -163,7 +164,17 @@ impl FakeXRDeviceMethods for FakeXRDevice { Ok(()) } - /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrdevice-simulatevisibilitychange + fn SimulateVisibilityChange(&self, v: XRVisibilityState) { + let v = match v { + XRVisibilityState::Visible => Visibility::Visible, + XRVisibilityState::Visible_blurred => Visibility::VisibleBlurred, + XRVisibilityState::Hidden => Visibility::Hidden, + }; + let _ = self.sender.send(MockDeviceMsg::VisibilityChange(v)); + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrdevice-disconnect fn Disconnect(&self) -> Rc { let global = self.global(); let p = Promise::new(&global); diff --git a/components/script/dom/webidls/FakeXRDevice.webidl b/components/script/dom/webidls/FakeXRDevice.webidl index 4dde2678435..8d981c4182a 100644 --- a/components/script/dom/webidls/FakeXRDevice.webidl +++ b/components/script/dom/webidls/FakeXRDevice.webidl @@ -10,9 +10,6 @@ interface FakeXRDevice { // requestAnimationFrame() callbacks. [Throws] void setViews(sequence views); - // // behaves as if device was disconnected - // Promise disconnect(); - [Throws] void setViewerOrigin(FakeXRRigidTransformInit origin, optional boolean emulatedPosition = false); void clearViewerOrigin(); @@ -20,12 +17,9 @@ interface FakeXRDevice { void clearFloorOrigin(); // // Simulates devices focusing and blurring sessions. - // void simulateVisibilityChange(XRVisibilityState); + void simulateVisibilityChange(XRVisibilityState state); // void setBoundsGeometry(sequence boundsCoodinates); - // // Sets eye level used for calculating floor-level spaces - // void setEyeLevel(float eyeLevel); - // Promise // simulateInputSourceConnection(FakeXRInputSourceInit); From bf30bf26a4754e21d4ae14ec0699cb3ca713c98c Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 16:10:29 +0530 Subject: [PATCH 03/15] Add blank FakeXRInputController interface --- components/script/dom/bindings/trace.rs | 3 +- .../script/dom/fakexrinputcontroller.rs | 42 +++++++++++++++ components/script/dom/mod.rs | 1 + .../dom/webidls/FakeXRInputController.webidl | 53 +++++++++++++++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 components/script/dom/fakexrinputcontroller.rs create mode 100644 components/script/dom/webidls/FakeXRInputController.webidl diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index d2e1876b9d8..3bad24b1b1d 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -534,7 +534,8 @@ unsafe_no_jsmanaged_fields!( webxr_api::Registry, webxr_api::Session, webxr_api::Frame, - webxr_api::InputSource + webxr_api::InputSource, + webxr_api::InputId ); unsafe_no_jsmanaged_fields!(ScriptToConstellationChan); unsafe_no_jsmanaged_fields!(InteractiveMetrics); diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs new file mode 100644 index 00000000000..274039c2fd2 --- /dev/null +++ b/components/script/dom/fakexrinputcontroller.rs @@ -0,0 +1,42 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{self}; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::globalscope::GlobalScope; +use dom_struct::dom_struct; +use ipc_channel::ipc::IpcSender; +use webxr_api::{InputId, MockDeviceMsg}; + +#[dom_struct] +pub struct FakeXRInputController { + reflector: Reflector, + #[ignore_malloc_size_of = "defined in ipc-channel"] + sender: IpcSender, + #[ignore_malloc_size_of = "defined in webxr-api"] + id: InputId, +} + +impl FakeXRInputController { + pub fn new_inherited(sender: IpcSender, id: InputId) -> FakeXRInputController { + FakeXRInputController { + reflector: Reflector::new(), + sender, + id, + } + } + + pub fn new( + global: &GlobalScope, + sender: IpcSender, + id: InputId, + ) -> DomRoot { + reflect_dom_object( + Box::new(FakeXRInputController::new_inherited(sender, id)), + global, + FakeXRInputControllerBinding::Wrap, + ) + } +} diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index b8bdc638c17..014a82e8a73 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -301,6 +301,7 @@ pub mod eventtarget; pub mod extendableevent; pub mod extendablemessageevent; pub mod fakexrdevice; +pub mod fakexrinputcontroller; pub mod file; pub mod filelist; pub mod filereader; diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl new file mode 100644 index 00000000000..b4022d5d404 --- /dev/null +++ b/components/script/dom/webidls/FakeXRInputController.webidl @@ -0,0 +1,53 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +// https://immersive-web.github.io/webxr-test-api/#fakexrinputcontroller + +[Exposed=Window, Pref="dom.webxr.test"] +interface FakeXRInputController { + // void setHandedness(XRHandedness handedness); + // void setTargetRayMode(XRTargetRayMode targetRayMode); + // void setProfiles(sequence profiles); + // void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false); + // void clearGripOrigin(); + // void setPointerOrigin(FakeXRRigidTransformInit pointerOrigin, optional boolean emulatedPosition = false); + + // void disconnect(); + // void reconnect(); + + // void startSelection(); + // void endSelection(); + // void simulateSelect(); + + // void setSupportedButtons(sequence supportedButtons); + // void updateButtonState(FakeXRButtonStateInit buttonState); +}; + +dictionary FakeXRInputSourceInit { + required XRHandedness handedness; + required XRTargetRayMode targetRayMode; + required FakeXRRigidTransformInit pointerOrigin; + required sequence profiles; + boolean selectionStarted = false; + boolean selectionClicked = false; + sequence supportedButtons; + FakeXRRigidTransformInit gripOrigin; +}; + +enum FakeXRButtonType { + "grip", + "touchpad", + "thumbstick", + "optional-button", + "optional-thumbstick" +}; + +dictionary FakeXRButtonStateInit { + required FakeXRButtonType buttonType; + required boolean pressed; + required boolean touched; + required float pressedValue; + float xValue = 0.0; + float yValue = 0.0; +}; From 11e882385d92dab96350adb5e3531d1b8c248c27 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 16:42:11 +0530 Subject: [PATCH 04/15] Correctly initialize grip space --- components/script/dom/xrinputsource.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/script/dom/xrinputsource.rs b/components/script/dom/xrinputsource.rs index 7516fe49f2f..d24e328d361 100644 --- a/components/script/dom/xrinputsource.rs +++ b/components/script/dom/xrinputsource.rs @@ -75,7 +75,7 @@ impl XRInputSourceMethods for XRInputSource { /// https://immersive-web.github.io/webxr/#dom-xrinputsource-gripspace fn GetGripSpace(&self) -> Option> { if self.info.supports_grip { - Some(self.target_ray_space.or_init(|| { + Some(self.grip_space.or_init(|| { let global = self.global(); XRSpace::new_inputspace(&global, &self.session, &self, true) })) From 7046f543a1875ab419d30fad8cc33333e92e4373 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 16:45:37 +0530 Subject: [PATCH 05/15] Expose targetRayMode --- components/script/dom/webidls/XRInputSource.webidl | 2 +- components/script/dom/xrinputsource.rs | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/components/script/dom/webidls/XRInputSource.webidl b/components/script/dom/webidls/XRInputSource.webidl index 51efc645282..f07de183927 100644 --- a/components/script/dom/webidls/XRInputSource.webidl +++ b/components/script/dom/webidls/XRInputSource.webidl @@ -19,7 +19,7 @@ enum XRTargetRayMode { [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRInputSource { readonly attribute XRHandedness handedness; - // [SameObject] readonly attribute XRTargetRayMode targetRayMode; + readonly attribute XRTargetRayMode targetRayMode; [SameObject] readonly attribute XRSpace targetRaySpace; [SameObject] readonly attribute XRSpace? gripSpace; // [SameObject] readonly attribute Gamepad? gamepad; diff --git a/components/script/dom/xrinputsource.rs b/components/script/dom/xrinputsource.rs index d24e328d361..fed76937d9c 100644 --- a/components/script/dom/xrinputsource.rs +++ b/components/script/dom/xrinputsource.rs @@ -4,7 +4,7 @@ use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding; use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding::{ - XRHandedness, XRInputSourceMethods, + XRHandedness, XRInputSourceMethods, XRTargetRayMode, }; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; @@ -12,7 +12,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::xrsession::XRSession; use crate::dom::xrspace::XRSpace; use dom_struct::dom_struct; -use webxr_api::{Handedness, InputId, InputSource}; +use webxr_api::{Handedness, InputId, InputSource, TargetRayMode}; #[dom_struct] pub struct XRInputSource { @@ -64,6 +64,15 @@ impl XRInputSourceMethods for XRInputSource { } } + /// https://immersive-web.github.io/webxr/#dom-xrinputsource-targetraymode + fn TargetRayMode(&self) -> XRTargetRayMode { + match self.info.target_ray_mode { + TargetRayMode::Gaze => XRTargetRayMode::Gaze, + TargetRayMode::TrackedPointer => XRTargetRayMode::Tracked_pointer, + TargetRayMode::Screen => XRTargetRayMode::Screen, + } + } + /// https://immersive-web.github.io/webxr/#dom-xrinputsource-targetrayspace fn TargetRaySpace(&self) -> DomRoot { self.target_ray_space.or_init(|| { From 506a0afca32ef802d1fa69d303297b2b6b095629 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 16:38:20 +0530 Subject: [PATCH 06/15] Add FakeXRDevice::simulateInputSourceConnection() --- components/script/dom/fakexrdevice.rs | 76 ++++++++++++++++++- .../script/dom/webidls/FakeXRDevice.webidl | 3 +- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/components/script/dom/fakexrdevice.rs b/components/script/dom/fakexrdevice.rs index d193c095717..7b55cb44b86 100644 --- a/components/script/dom/fakexrdevice.rs +++ b/components/script/dom/fakexrdevice.rs @@ -5,12 +5,17 @@ use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::{ self, FakeXRDeviceMethods, FakeXRRigidTransformInit, FakeXRViewInit, }; +use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::FakeXRInputSourceInit; +use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding::{ + XRHandedness, XRTargetRayMode, +}; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRVisibilityState; use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::refcounted::TrustedPromise; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; +use crate::dom::fakexrinputcontroller::FakeXRInputController; use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; use crate::task_source::TaskSource; @@ -20,14 +25,19 @@ use euclid::{RigidTransform3D, Rotation3D, Transform3D, Vector3D}; use ipc_channel::ipc::IpcSender; use ipc_channel::router::ROUTER; use profile_traits::ipc; +use std::cell::Cell; use std::rc::Rc; -use webxr_api::{MockDeviceMsg, MockViewInit, MockViewsInit, Visibility}; +use webxr_api::{ + Handedness, InputId, InputSource, MockDeviceMsg, MockInputInit, MockViewInit, MockViewsInit, + TargetRayMode, Visibility, +}; #[dom_struct] pub struct FakeXRDevice { reflector: Reflector, #[ignore_malloc_size_of = "defined in ipc-channel"] sender: IpcSender, + next_input_id: Cell, } impl FakeXRDevice { @@ -35,6 +45,7 @@ impl FakeXRDevice { FakeXRDevice { reflector: Reflector::new(), sender, + next_input_id: Cell::new(0), } } @@ -174,6 +185,49 @@ impl FakeXRDeviceMethods for FakeXRDevice { let _ = self.sender.send(MockDeviceMsg::VisibilityChange(v)); } + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrdevice-simulateinputsourceconnection + fn SimulateInputSourceConnection( + &self, + init: &FakeXRInputSourceInit, + ) -> Fallible> { + let id = self.next_input_id.get(); + self.next_input_id.set(id + 1); + let id = InputId(id); + + let handedness = init.handedness.into(); + let target_ray_mode = init.targetRayMode.into(); + + let pointer_origin = Some(get_origin(&init.pointerOrigin)?); + + let grip_origin = if let Some(ref g) = init.gripOrigin { + Some(get_origin(g)?) + } else { + None + }; + + // XXXManishearth deal with profiles, supportedButtons, selection* + + let source = InputSource { + handedness, + target_ray_mode, + id, + supports_grip: true, + }; + + let init = MockInputInit { + source, + pointer_origin, + grip_origin, + }; + + let global = self.global(); + let _ = self.sender.send(MockDeviceMsg::AddInputSource(init)); + + let controller = FakeXRInputController::new(&global, self.sender.clone(), id); + + Ok(controller) + } + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrdevice-disconnect fn Disconnect(&self) -> Rc { let global = self.global(); @@ -197,3 +251,23 @@ impl FakeXRDeviceMethods for FakeXRDevice { p } } + +impl From for Handedness { + fn from(h: XRHandedness) -> Self { + match h { + XRHandedness::None => Handedness::None, + XRHandedness::Left => Handedness::Left, + XRHandedness::Right => Handedness::Right, + } + } +} + +impl From for TargetRayMode { + fn from(t: XRTargetRayMode) -> Self { + match t { + XRTargetRayMode::Gaze => TargetRayMode::Gaze, + XRTargetRayMode::Tracked_pointer => TargetRayMode::TrackedPointer, + XRTargetRayMode::Screen => TargetRayMode::Screen, + } + } +} diff --git a/components/script/dom/webidls/FakeXRDevice.webidl b/components/script/dom/webidls/FakeXRDevice.webidl index 8d981c4182a..856df51cc7a 100644 --- a/components/script/dom/webidls/FakeXRDevice.webidl +++ b/components/script/dom/webidls/FakeXRDevice.webidl @@ -21,8 +21,7 @@ interface FakeXRDevice { // void setBoundsGeometry(sequence boundsCoodinates); - // Promise - // simulateInputSourceConnection(FakeXRInputSourceInit); + [Throws] FakeXRInputController simulateInputSourceConnection(FakeXRInputSourceInit init); // behaves as if device was disconnected Promise disconnect(); From e03fd0ef1c40e8840e59c15e649c102e7f80b81d Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 17:15:46 +0530 Subject: [PATCH 07/15] Add pointer/grip mocking --- .../script/dom/fakexrinputcontroller.rs | 34 +++++++++++++++++-- .../dom/webidls/FakeXRInputController.webidl | 6 ++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs index 274039c2fd2..63c0084fb6e 100644 --- a/components/script/dom/fakexrinputcontroller.rs +++ b/components/script/dom/fakexrinputcontroller.rs @@ -2,13 +2,18 @@ * 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 crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{self}; +use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::FakeXRRigidTransformInit; +use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{ + self, FakeXRInputControllerMethods, +}; +use crate::dom::bindings::error::Fallible; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; +use crate::dom::fakexrdevice::get_origin; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; -use webxr_api::{InputId, MockDeviceMsg}; +use webxr_api::{InputId, MockDeviceMsg, MockInputMsg}; #[dom_struct] pub struct FakeXRInputController { @@ -39,4 +44,29 @@ impl FakeXRInputController { FakeXRInputControllerBinding::Wrap, ) } + + fn send_message(&self, msg: MockInputMsg) { + let _ = self + .sender + .send(MockDeviceMsg::MessageInputSource(self.id, msg)); + } +} + +impl FakeXRInputControllerMethods for FakeXRInputController { + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-setpointerorigin + fn SetPointerOrigin(&self, origin: &FakeXRRigidTransformInit, _emulated: bool) -> Fallible<()> { + self.send_message(MockInputMsg::SetPointerOrigin(Some(get_origin(origin)?))); + Ok(()) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-setgriporigin + fn SetGripOrigin(&self, origin: &FakeXRRigidTransformInit, _emulated: bool) -> Fallible<()> { + self.send_message(MockInputMsg::SetGripOrigin(Some(get_origin(origin)?))); + Ok(()) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-cleargriporigin + fn ClearGripOrigin(&self) { + self.send_message(MockInputMsg::SetGripOrigin(None)) + } } diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl index b4022d5d404..165b768c0a5 100644 --- a/components/script/dom/webidls/FakeXRInputController.webidl +++ b/components/script/dom/webidls/FakeXRInputController.webidl @@ -9,9 +9,9 @@ interface FakeXRInputController { // void setHandedness(XRHandedness handedness); // void setTargetRayMode(XRTargetRayMode targetRayMode); // void setProfiles(sequence profiles); - // void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false); - // void clearGripOrigin(); - // void setPointerOrigin(FakeXRRigidTransformInit pointerOrigin, optional boolean emulatedPosition = false); + [Throws] void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false); + void clearGripOrigin(); + [Throws] void setPointerOrigin(FakeXRRigidTransformInit pointerOrigin, optional boolean emulatedPosition = false); // void disconnect(); // void reconnect(); From 225254a6b357609129cb636d128b36d0ae4d7692 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 17:19:09 +0530 Subject: [PATCH 08/15] Add disconnect()/reconnect() --- components/script/dom/fakexrinputcontroller.rs | 10 ++++++++++ .../script/dom/webidls/FakeXRInputController.webidl | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs index 63c0084fb6e..4756baf5f0a 100644 --- a/components/script/dom/fakexrinputcontroller.rs +++ b/components/script/dom/fakexrinputcontroller.rs @@ -69,4 +69,14 @@ impl FakeXRInputControllerMethods for FakeXRInputController { fn ClearGripOrigin(&self) { self.send_message(MockInputMsg::SetGripOrigin(None)) } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-disconnect + fn Disconnect(&self) { + self.send_message(MockInputMsg::Disconnect) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-reconnect + fn Reconnect(&self) { + self.send_message(MockInputMsg::Reconnect) + } } diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl index 165b768c0a5..bdfd00a6f91 100644 --- a/components/script/dom/webidls/FakeXRInputController.webidl +++ b/components/script/dom/webidls/FakeXRInputController.webidl @@ -13,8 +13,8 @@ interface FakeXRInputController { void clearGripOrigin(); [Throws] void setPointerOrigin(FakeXRRigidTransformInit pointerOrigin, optional boolean emulatedPosition = false); - // void disconnect(); - // void reconnect(); + void disconnect(); + void reconnect(); // void startSelection(); // void endSelection(); From 82002765beebed60b737d64b538bc0c33912f0e0 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 17:34:16 +0530 Subject: [PATCH 09/15] Add select events --- .../script/dom/fakexrinputcontroller.rs | 26 ++++++++++++++++++- .../dom/webidls/FakeXRInputController.webidl | 6 ++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs index 4756baf5f0a..67e6f72cf70 100644 --- a/components/script/dom/fakexrinputcontroller.rs +++ b/components/script/dom/fakexrinputcontroller.rs @@ -13,7 +13,7 @@ use crate::dom::fakexrdevice::get_origin; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; -use webxr_api::{InputId, MockDeviceMsg, MockInputMsg}; +use webxr_api::{InputId, MockDeviceMsg, MockInputMsg, SelectEvent, SelectKind}; #[dom_struct] pub struct FakeXRInputController { @@ -79,4 +79,28 @@ impl FakeXRInputControllerMethods for FakeXRInputController { fn Reconnect(&self) { self.send_message(MockInputMsg::Reconnect) } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-startselection + fn StartSelection(&self) { + self.send_message(MockInputMsg::TriggerSelect( + SelectKind::Select, + SelectEvent::Start, + )) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-endselection + fn EndSelection(&self) { + self.send_message(MockInputMsg::TriggerSelect( + SelectKind::Select, + SelectEvent::End, + )) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-simulateselect + fn SimulateSelect(&self) { + self.send_message(MockInputMsg::TriggerSelect( + SelectKind::Select, + SelectEvent::Select, + )) + } } diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl index bdfd00a6f91..a50950cdee3 100644 --- a/components/script/dom/webidls/FakeXRInputController.webidl +++ b/components/script/dom/webidls/FakeXRInputController.webidl @@ -16,9 +16,9 @@ interface FakeXRInputController { void disconnect(); void reconnect(); - // void startSelection(); - // void endSelection(); - // void simulateSelect(); + void startSelection(); + void endSelection(); + void simulateSelect(); // void setSupportedButtons(sequence supportedButtons); // void updateButtonState(FakeXRButtonStateInit buttonState); From a90a42012bfcd4393ac447938efadfd5b4583be0 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 18:14:10 +0530 Subject: [PATCH 10/15] Add XRInputSourcesChangeEvent --- components/script/dom/mod.rs | 1 + .../webidls/XRInputSourcesChangeEvent.webidl | 19 +++ .../script/dom/xrinputsourceschangeevent.rs | 116 ++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 components/script/dom/webidls/XRInputSourcesChangeEvent.webidl create mode 100644 components/script/dom/xrinputsourceschangeevent.rs diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 014a82e8a73..0fdf4a80b69 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -565,6 +565,7 @@ pub mod xrframe; pub mod xrinputsource; pub mod xrinputsourcearray; pub mod xrinputsourceevent; +pub mod xrinputsourceschangeevent; pub mod xrpose; pub mod xrreferencespace; pub mod xrrenderstate; diff --git a/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl b/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl new file mode 100644 index 00000000000..aba56f8b0a6 --- /dev/null +++ b/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +// https://immersive-web.github.io/webxr/#xrinputsourceschangedevent-interface + +[SecureContext, Exposed=Window, Pref="dom.webxr.test"] +interface XRInputSourcesChangeEvent : Event { + constructor(DOMString type, XRInputSourcesChangeEventInit eventInitDict); + [SameObject] readonly attribute XRSession session; + /* [SameObject] */ readonly attribute /* FrozenArray */ any added; + /* [SameObject] */ readonly attribute /* FrozenArray */ any removed; +}; + +dictionary XRInputSourcesChangeEventInit : EventInit { + required XRSession session; + required sequence added; + required sequence removed; +}; diff --git a/components/script/dom/xrinputsourceschangeevent.rs b/components/script/dom/xrinputsourceschangeevent.rs new file mode 100644 index 00000000000..f89bdeba9d1 --- /dev/null +++ b/components/script/dom/xrinputsourceschangeevent.rs @@ -0,0 +1,116 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods; +use crate::dom::bindings::codegen::Bindings::XRInputSourcesChangeEventBinding::{ + self, XRInputSourcesChangeEventMethods, +}; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::str::DOMString; +use crate::dom::event::Event; +use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; +use crate::dom::xrinputsource::XRInputSource; +use crate::dom::xrsession::XRSession; +use crate::script_runtime::JSContext; +use dom_struct::dom_struct; +use js::conversions::ToJSValConvertible; +use js::jsapi::Heap; +use js::jsval::{JSVal, UndefinedValue}; +use servo_atoms::Atom; + +#[dom_struct] +pub struct XRInputSourcesChangeEvent { + event: Event, + session: Dom, + #[ignore_malloc_size_of = "mozjs"] + added: Heap, + #[ignore_malloc_size_of = "mozjs"] + removed: Heap, +} + +impl XRInputSourcesChangeEvent { + #[allow(unrooted_must_root)] + fn new_inherited(session: &XRSession) -> XRInputSourcesChangeEvent { + XRInputSourcesChangeEvent { + event: Event::new_inherited(), + session: Dom::from_ref(session), + added: Heap::default(), + removed: Heap::default(), + } + } + + #[allow(unsafe_code)] + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: bool, + cancelable: bool, + session: &XRSession, + added: &[DomRoot], + removed: &[DomRoot], + ) -> DomRoot { + let changeevent = reflect_dom_object( + Box::new(XRInputSourcesChangeEvent::new_inherited(session)), + global, + XRInputSourcesChangeEventBinding::Wrap, + ); + { + let event = changeevent.upcast::(); + event.init_event(type_, bubbles, cancelable); + } + + let cx = global.get_cx(); + unsafe { + rooted!(in(*cx) let mut added_val = UndefinedValue()); + rooted!(in(*cx) let mut removed_val = UndefinedValue()); + added.to_jsval(*cx, added_val.handle_mut()); + removed.to_jsval(*cx, removed_val.handle_mut()); + changeevent.added.set(added_val.get()); + changeevent.added.set(removed_val.get()); + } + + changeevent + } + + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &XRInputSourcesChangeEventBinding::XRInputSourcesChangeEventInit, + ) -> DomRoot { + XRInputSourcesChangeEvent::new( + &window.global(), + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + &init.session, + &*init.added, + &*init.removed, + ) + } +} + +impl XRInputSourcesChangeEventMethods for XRInputSourcesChangeEvent { + // https://immersive-web.github.io/webxr/#dom-xrinputsourceschangeevent-session + fn Session(&self) -> DomRoot { + DomRoot::from_ref(&*self.session) + } + + // https://immersive-web.github.io/webxr/#dom-xrinputsourceschangeevent-added + fn Added(&self, _cx: JSContext) -> JSVal { + self.added.get() + } + + // https://immersive-web.github.io/webxr/#dom-xrinputsourceschangeevent-removed + fn Removed(&self, _cx: JSContext) -> JSVal { + self.removed.get() + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.event.IsTrusted() + } +} From f721113f8d2b6bae00b9be280d80c6a7d16861b6 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 17:54:26 +0530 Subject: [PATCH 11/15] Handle AddInput/RemoveInput events --- components/atoms/static_atoms.txt | 1 + .../script/dom/webidls/XRSession.webidl | 2 +- components/script/dom/xrinputsourcearray.rs | 55 ++++++++++++++++++- .../script/dom/xrinputsourceschangeevent.rs | 4 +- components/script/dom/xrsession.rs | 14 ++++- 5 files changed, 71 insertions(+), 5 deletions(-) diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index bf50e2e9acd..65ca743ed90 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -44,6 +44,7 @@ iceconnectionstatechange icegatheringstatechange image input +inputsourceschange invalid keydown keypress diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index e726a500cb7..a00e0c4cd3d 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -40,7 +40,7 @@ interface XRSession : EventTarget { attribute EventHandler onend; attribute EventHandler onselect; attribute EventHandler onsqueeze; - // attribute EventHandler oninputsourceschange; + attribute EventHandler oninputsourceschange; attribute EventHandler onselectstart; attribute EventHandler onselectend; attribute EventHandler onsqueezestart; diff --git a/components/script/dom/xrinputsourcearray.rs b/components/script/dom/xrinputsourcearray.rs index 48f84991db0..45e0f2851e4 100644 --- a/components/script/dom/xrinputsourcearray.rs +++ b/components/script/dom/xrinputsourcearray.rs @@ -5,13 +5,16 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::XRInputSourceArrayBinding; use crate::dom::bindings::codegen::Bindings::XRInputSourceArrayBinding::XRInputSourceArrayMethods; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::event::Event; use crate::dom::globalscope::GlobalScope; use crate::dom::xrinputsource::XRInputSource; +use crate::dom::xrinputsourceschangeevent::XRInputSourcesChangeEvent; use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; -use webxr_api::InputId; +use webxr_api::{InputId, InputSource}; #[dom_struct] pub struct XRInputSourceArray { @@ -48,6 +51,56 @@ impl XRInputSourceArray { }); } + pub fn add_input_source(&self, session: &XRSession, info: InputSource) { + let mut input_sources = self.input_sources.borrow_mut(); + let global = self.global(); + let input = XRInputSource::new(&global, &session, info); + debug_assert!( + input_sources.iter().find(|i| i.id() == info.id).is_none(), + "Should never add a duplicate input id!" + ); + input_sources.push(Dom::from_ref(&input)); + + let added = [input]; + + let event = XRInputSourcesChangeEvent::new( + &global, + atom!("inputsourceschange"), + false, + true, + session, + &added, + &[], + ); + // Release the refcell guard + drop(input_sources); + event.upcast::().fire(session.upcast()); + } + + pub fn remove_input_source(&self, session: &XRSession, id: InputId) { + let mut input_sources = self.input_sources.borrow_mut(); + let global = self.global(); + let removed = if let Some(i) = input_sources.iter().find(|i| i.id() == id) { + [DomRoot::from_ref(&**i)] + } else { + return; + }; + + let event = XRInputSourcesChangeEvent::new( + &global, + atom!("inputsourceschange"), + false, + true, + session, + &[], + &removed, + ); + input_sources.retain(|i| i.id() != id); + // release the refcell guard + drop(input_sources); + event.upcast::().fire(session.upcast()); + } + pub fn find(&self, id: InputId) -> Option> { self.input_sources .borrow() diff --git a/components/script/dom/xrinputsourceschangeevent.rs b/components/script/dom/xrinputsourceschangeevent.rs index f89bdeba9d1..02e81e4bf53 100644 --- a/components/script/dom/xrinputsourceschangeevent.rs +++ b/components/script/dom/xrinputsourceschangeevent.rs @@ -66,10 +66,10 @@ impl XRInputSourcesChangeEvent { let cx = global.get_cx(); unsafe { rooted!(in(*cx) let mut added_val = UndefinedValue()); - rooted!(in(*cx) let mut removed_val = UndefinedValue()); added.to_jsval(*cx, added_val.handle_mut()); - removed.to_jsval(*cx, removed_val.handle_mut()); changeevent.added.set(added_val.get()); + rooted!(in(*cx) let mut removed_val = UndefinedValue()); + removed.to_jsval(*cx, removed_val.handle_mut()); changeevent.added.set(removed_val.get()); } diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index a4ced8689a5..4979835fc42 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -289,7 +289,12 @@ impl XRSession { ); event.upcast::().fire(self.upcast()); }, - _ => (), // XXXManishearth TBD + XREvent::AddInput(info) => { + self.input_sources.add_input_source(self, info); + }, + XREvent::RemoveInput(id) => { + self.input_sources.remove_input_source(self, id); + }, } } @@ -432,6 +437,13 @@ impl XRSessionMethods for XRSession { SetOnvisibilitychange ); + /// https://immersive-web.github.io/webxr/#eventdef-xrsession-inputsourceschange + event_handler!( + inputsourceschange, + GetOninputsourceschange, + SetOninputsourceschange + ); + // https://immersive-web.github.io/webxr/#dom-xrsession-renderstate fn RenderState(&self) -> DomRoot { self.active_render_state.get() From c89f79b132e0bf2a5ad3462f2ce695039dec67a2 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 19:48:55 +0530 Subject: [PATCH 12/15] Add a realm --- components/script/dom/xrinputsourceschangeevent.rs | 3 ++- components/script/dom/xrviewerpose.rs | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/components/script/dom/xrinputsourceschangeevent.rs b/components/script/dom/xrinputsourceschangeevent.rs index 02e81e4bf53..f5a2e6f33ad 100644 --- a/components/script/dom/xrinputsourceschangeevent.rs +++ b/components/script/dom/xrinputsourceschangeevent.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 crate::compartments::enter_realm; use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::XRInputSourcesChangeEventBinding::{ self, XRInputSourcesChangeEventMethods, @@ -62,7 +63,7 @@ impl XRInputSourcesChangeEvent { let event = changeevent.upcast::(); event.init_event(type_, bubbles, cancelable); } - + let _ac = enter_realm(&*global); let cx = global.get_cx(); unsafe { rooted!(in(*cx) let mut added_val = UndefinedValue()); diff --git a/components/script/dom/xrviewerpose.rs b/components/script/dom/xrviewerpose.rs index 0e64613294b..6e11944b788 100644 --- a/components/script/dom/xrviewerpose.rs +++ b/components/script/dom/xrviewerpose.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 crate::compartments::enter_realm; use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; use crate::dom::bindings::codegen::Bindings::XRViewerPoseBinding; use crate::dom::bindings::codegen::Bindings::XRViewerPoseBinding::XRViewerPoseMethods; @@ -40,6 +41,7 @@ impl XRViewerPose { session: &XRSession, pose: ApiViewerPose, ) -> DomRoot { + let _ac = enter_realm(&*global); rooted_vec!(let mut views); session.with_session(|s| match s.views() { Views::Inline => views.push(XRView::new( From b10ba77a2319e305d45d45c9bf00e8c567a21687 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 19:53:16 +0530 Subject: [PATCH 13/15] Update test to use newer API --- tests/wpt/metadata/MANIFEST.json | 2 +- .../webxr/xrInputSource_add_remove.https.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 0942f7eec75..446128fe629 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -733190,7 +733190,7 @@ "testharness" ], "webxr/xrInputSource_add_remove.https.html": [ - "4c50670c70ec87754a777cc0bcfe8272e794ca07", + "33264ddd68ab09e2ed6a596614116bd1225f2665", "testharness" ], "webxr/xrInputSource_emulatedPosition.https.html": [ diff --git a/tests/wpt/web-platform-tests/webxr/xrInputSource_add_remove.https.html b/tests/wpt/web-platform-tests/webxr/xrInputSource_add_remove.https.html index 4c50670c70e..33264ddd68a 100644 --- a/tests/wpt/web-platform-tests/webxr/xrInputSource_add_remove.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrInputSource_add_remove.https.html @@ -46,7 +46,7 @@ let testFunction = (session, fakeDeviceController, t) => new Promise((resolve) = assert_equals(input_sources[1].handedness, "none"); }); - fakeDeviceController.removeInputSource(input_source_1); + input_source_1.disconnect(); session.requestAnimationFrame((time, xrFrame) => { let input_sources = session.inputSources; From 77d90d64fc2add0addc94000349ca4d80b8e9358 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 19:57:24 +0530 Subject: [PATCH 14/15] Update WPT expectations --- ...nts_input_source_recreation.https.html.ini | 1 + .../events_session_select.https.html.ini | 4 --- ...nts_session_select_subframe.https.html.ini | 4 --- ...utSource_gamepad_disconnect.https.html.ini | 1 + ...ce_gamepad_input_registered.https.html.ini | 1 + .../getInputPose_handedness.https.html.ini | 3 +- .../webxr/idlharness.https.window.js.ini | 33 ------------------- .../xrInputSource_add_remove.https.html.ini | 4 --- .../xrInputSource_sameObject.https.html.ini | 4 --- ...xrPose_transform_sameObject.https.html.ini | 4 --- ...ceSpace_originOffsetBounded.https.html.ini | 3 +- .../webxr/xrSession_sameObject.https.html.ini | 3 +- 12 files changed, 9 insertions(+), 56 deletions(-) delete mode 100644 tests/wpt/metadata/webxr/events_session_select.https.html.ini delete mode 100644 tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini delete mode 100644 tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini delete mode 100644 tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini delete mode 100644 tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini diff --git a/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini b/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini index 976a3ad323d..82ce39a5108 100644 --- a/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini +++ b/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini @@ -1,4 +1,5 @@ [events_input_source_recreation.https.html] + expected: ERROR [Input sources are re-created when handedness or target ray mode changes] expected: FAIL diff --git a/tests/wpt/metadata/webxr/events_session_select.https.html.ini b/tests/wpt/metadata/webxr/events_session_select.https.html.ini deleted file mode 100644 index 59dac282700..00000000000 --- a/tests/wpt/metadata/webxr/events_session_select.https.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[events_session_select.https.html] - [XRInputSources primary input presses properly fires off the right events] - expected: FAIL - diff --git a/tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini b/tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini deleted file mode 100644 index d2dbc3fef51..00000000000 --- a/tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[events_session_select_subframe.https.html] - [Ensures that an XRInputSources primary input being pressed and released in the space of a single frame properly fires off the right events] - expected: FAIL - diff --git a/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini b/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini index 325a0bb6738..fd1e62fe01b 100644 --- a/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini +++ b/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini @@ -1,4 +1,5 @@ [xrInputSource_gamepad_disconnect.https.html] + expected: ERROR [WebXR InputSource's gamepad gets disconnected when the input source is removed] expected: FAIL diff --git a/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini b/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini index 3735666ae5e..21d7102822a 100644 --- a/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini +++ b/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini @@ -1,4 +1,5 @@ [xrInputSource_gamepad_input_registered.https.html] + expected: ERROR [WebXR InputSource's gamepad properly registers input] expected: FAIL diff --git a/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini b/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini index 0f61faf25dc..f10131010ef 100644 --- a/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini +++ b/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini @@ -1,4 +1,5 @@ [getInputPose_handedness.https.html] + expected: ERROR [XRInputSources properly communicate their handedness] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini index a1d256fabfd..1b47a7ad858 100644 --- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini @@ -2,21 +2,12 @@ [XR interface: attribute ondevicechange] expected: FAIL - [XRInputSourcesChangeEvent interface: attribute session] - expected: FAIL - - [XRInputSourcesChangeEvent interface object name] - expected: FAIL - [XRInputSourceArray interface: iterable] expected: FAIL [XR interface: calling supportsSession(XRSessionMode) on navigator.xr with too few arguments must throw TypeError] expected: FAIL - [XRInputSourcesChangeEvent interface object length] - expected: FAIL - [XRReferenceSpaceEvent interface: attribute referenceSpace] expected: FAIL @@ -32,9 +23,6 @@ [XRPose interface: attribute emulatedPosition] expected: FAIL - [XRInputSource interface: attribute targetRayMode] - expected: FAIL - [XRBoundedReferenceSpace interface object length] expected: FAIL @@ -50,15 +38,9 @@ [WebGLRenderingContext interface: operation makeXRCompatible()] expected: FAIL - [XRInputSourcesChangeEvent interface: attribute added] - expected: FAIL - [XRBoundedReferenceSpace interface: existence and properties of interface prototype object's "constructor" property] expected: FAIL - [XRInputSourcesChangeEvent interface: attribute removed] - expected: FAIL - [XRReferenceSpaceEvent interface: existence and properties of interface object] expected: FAIL @@ -83,9 +65,6 @@ [XRBoundedReferenceSpace interface: existence and properties of interface prototype object's @@unscopables property] expected: FAIL - [XRInputSourcesChangeEvent interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - [XRBoundedReferenceSpace interface: attribute boundsGeometry] expected: FAIL @@ -98,12 +77,6 @@ [XRInputSource interface: attribute gamepad] expected: FAIL - [XRInputSourcesChangeEvent interface: existence and properties of interface prototype object] - expected: FAIL - - [XRInputSourcesChangeEvent interface: existence and properties of interface object] - expected: FAIL - [XRReferenceSpace interface: attribute onreset] expected: FAIL @@ -125,9 +98,6 @@ [XRInputSource interface: attribute profiles] expected: FAIL - [XRInputSourcesChangeEvent interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - [XR interface: operation requestSession(XRSessionMode, XRSessionInit)] expected: FAIL @@ -140,9 +110,6 @@ [XRWebGLLayer interface: attribute ignoreDepthValues] expected: FAIL - [XRSession interface: attribute oninputsourceschange] - expected: FAIL - [XRBoundedReferenceSpace interface: existence and properties of interface prototype object] expected: FAIL diff --git a/tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini b/tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini deleted file mode 100644 index d6125717313..00000000000 --- a/tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[xrInputSource_add_remove.https.html] - [XRInputSources can be properly added and removed from the session] - expected: FAIL - diff --git a/tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini deleted file mode 100644 index 980f9d31c32..00000000000 --- a/tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[xrInputSource_sameObject.https.html] - [XRInputSource attributes meet [SameObject\] requirement] - expected: FAIL - diff --git a/tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini deleted file mode 100644 index 3e442625aa8..00000000000 --- a/tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[xrPose_transform_sameObject.https.html] - [XRPose.transform meets [SameObject\] requirement] - expected: FAIL - diff --git a/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini index a3fb0379bb0..21b3815f4da 100644 --- a/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini +++ b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini @@ -1,4 +1,5 @@ [xrReferenceSpace_originOffsetBounded.https.html] + expected: ERROR [Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry.] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini index 09170ad4d6a..0013dc7b4cc 100644 --- a/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini +++ b/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini @@ -1,4 +1,5 @@ [xrSession_sameObject.https.html] + expected: ERROR [XRSession attributes meet [SameObject\] requirement] - expected: FAIL + expected: TIMEOUT From 94e8ce5739677db8bd4c0ffbe50d035b37fafe51 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 23:44:56 +0530 Subject: [PATCH 15/15] Make next_input_id an InputId --- components/script/dom/fakexrdevice.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/script/dom/fakexrdevice.rs b/components/script/dom/fakexrdevice.rs index 7b55cb44b86..f43b0b1155b 100644 --- a/components/script/dom/fakexrdevice.rs +++ b/components/script/dom/fakexrdevice.rs @@ -37,7 +37,8 @@ pub struct FakeXRDevice { reflector: Reflector, #[ignore_malloc_size_of = "defined in ipc-channel"] sender: IpcSender, - next_input_id: Cell, + #[ignore_malloc_size_of = "defined in webxr-api"] + next_input_id: Cell, } impl FakeXRDevice { @@ -45,7 +46,7 @@ impl FakeXRDevice { FakeXRDevice { reflector: Reflector::new(), sender, - next_input_id: Cell::new(0), + next_input_id: Cell::new(InputId(0)), } } @@ -191,8 +192,7 @@ impl FakeXRDeviceMethods for FakeXRDevice { init: &FakeXRInputSourceInit, ) -> Fallible> { let id = self.next_input_id.get(); - self.next_input_id.set(id + 1); - let id = InputId(id); + self.next_input_id.set(InputId(id.0 + 1)); let handedness = init.handedness.into(); let target_ray_mode = init.targetRayMode.into();