Skip to content

Commit

Permalink
Handle SetTargetRayMode and SetHandedness
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Jan 21, 2020
1 parent e9221e6 commit 9c34a65
Show file tree
Hide file tree
Showing 9 changed files with 64 additions and 17 deletions.
27 changes: 26 additions & 1 deletion components/script/dom/fakexrinputcontroller.rs
Expand Up @@ -6,14 +6,19 @@ 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;
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 {
Expand Down Expand Up @@ -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));
}
}
4 changes: 2 additions & 2 deletions components/script/dom/webidls/FakeXRInputController.webidl
Expand Up @@ -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<DOMString> profiles);
[Throws] void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false);
void clearGripOrigin();
Expand Down
31 changes: 31 additions & 0 deletions components/script/dom/xrinputsourcearray.rs
Expand Up @@ -101,6 +101,37 @@ impl XRInputSourceArray {
event.upcast::<Event>().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::<Event>().fire(session.upcast());
}

pub fn find(&self, id: InputId) -> Option<DomRoot<XRInputSource>> {
self.input_sources
.borrow()
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/xrinputsourceschangeevent.rs
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions components/script/dom/xrsession.rs
Expand Up @@ -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);
},
}
}

Expand Down
@@ -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

This file was deleted.

@@ -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

5 changes: 0 additions & 5 deletions tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini

This file was deleted.

0 comments on commit 9c34a65

Please sign in to comment.