diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs index 67e6f72cf708..7c145a3ed201 100644 --- a/components/script/dom/fakexrinputcontroller.rs +++ b/components/script/dom/fakexrinputcontroller.rs @@ -6,6 +6,9 @@ use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::FakeXRRigidTra use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{ self, FakeXRInputControllerMethods, }; +use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding::{ + XRHandedness, XRTargetRayMode, +}; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; @@ -13,7 +16,9 @@ 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, SelectEvent, SelectKind}; +use webxr_api::{ + Handedness, InputId, MockDeviceMsg, MockInputMsg, SelectEvent, SelectKind, TargetRayMode, +}; #[dom_struct] pub struct FakeXRInputController { @@ -103,4 +108,24 @@ impl FakeXRInputControllerMethods for FakeXRInputController { SelectEvent::Select, )) } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-sethandedness + fn SetHandedness(&self, handedness: XRHandedness) { + let h = match handedness { + XRHandedness::None => Handedness::None, + XRHandedness::Left => Handedness::Left, + XRHandedness::Right => Handedness::Right, + }; + let _ = self.send_message(MockInputMsg::SetHandedness(h)); + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-settargetraymode + fn SetTargetRayMode(&self, target_ray_mode: XRTargetRayMode) { + let t = match target_ray_mode { + XRTargetRayMode::Gaze => TargetRayMode::Gaze, + XRTargetRayMode::Tracked_pointer => TargetRayMode::TrackedPointer, + XRTargetRayMode::Screen => TargetRayMode::Screen, + }; + let _ = self.send_message(MockInputMsg::SetTargetRayMode(t)); + } } diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl index a50950cdee3c..164012f3d839 100644 --- a/components/script/dom/webidls/FakeXRInputController.webidl +++ b/components/script/dom/webidls/FakeXRInputController.webidl @@ -6,8 +6,8 @@ [Exposed=Window, Pref="dom.webxr.test"] interface FakeXRInputController { - // void setHandedness(XRHandedness handedness); - // void setTargetRayMode(XRTargetRayMode targetRayMode); + void setHandedness(XRHandedness handedness); + void setTargetRayMode(XRTargetRayMode targetRayMode); // void setProfiles(sequence profiles); [Throws] void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false); void clearGripOrigin(); diff --git a/components/script/dom/xrinputsourcearray.rs b/components/script/dom/xrinputsourcearray.rs index 45e0f2851e4c..66e4045e44a5 100644 --- a/components/script/dom/xrinputsourcearray.rs +++ b/components/script/dom/xrinputsourcearray.rs @@ -101,6 +101,37 @@ impl XRInputSourceArray { event.upcast::().fire(session.upcast()); } + pub fn add_remove_input_source(&self, session: &XRSession, id: InputId, info: InputSource) { + let mut input_sources = self.input_sources.borrow_mut(); + let global = self.global(); + let root; + let removed = if let Some(i) = input_sources.iter().find(|i| i.id() == id) { + root = [DomRoot::from_ref(&**i)]; + &root as &[_] + } else { + warn!("Could not find removed input source with id {:?}", id); + &[] + }; + input_sources.retain(|i| i.id() != id); + let input = XRInputSource::new(&global, &session, info); + input_sources.push(Dom::from_ref(&input)); + + let added = [input]; + + let event = XRInputSourcesChangeEvent::new( + &global, + atom!("inputsourceschange"), + false, + true, + session, + &added, + removed, + ); + // 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 3b68a3b8d2a7..b3275cd800cf 100644 --- a/components/script/dom/xrinputsourceschangeevent.rs +++ b/components/script/dom/xrinputsourceschangeevent.rs @@ -71,7 +71,7 @@ impl XRInputSourcesChangeEvent { 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()); + changeevent.removed.set(removed_val.get()); } changeevent diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 4979835fc429..e822a69eb8eb 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -295,6 +295,9 @@ impl XRSession { XREvent::RemoveInput(id) => { self.input_sources.remove_input_source(self, id); }, + XREvent::UpdateInput(id, source) => { + self.input_sources.add_remove_input_source(self, id, source); + }, } } 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 82ce39a51083..976a3ad323d1 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,5 +1,4 @@ [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/getInputPose_handedness.https.html.ini b/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini deleted file mode 100644 index f10131010efb..000000000000 --- a/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[getInputPose_handedness.https.html] - expected: ERROR - [XRInputSources properly communicate their handedness] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini b/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini index 1d6cd17924dd..739e7b4c112a 100644 --- a/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini +++ b/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini @@ -1,5 +1,4 @@ [xrSession_input_events_end.https.html] - expected: TIMEOUT [Calling end during an input callback stops processing at the right time] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini deleted file mode 100644 index 0013dc7b4cce..000000000000 --- a/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xrSession_sameObject.https.html] - expected: ERROR - [XRSession attributes meet [SameObject\] requirement] - expected: TIMEOUT -