mirror of
https://github.com/servo/servo.git
synced 2025-06-10 17:43:16 +00:00
Handle SetTargetRayMode and SetHandedness
This commit is contained in:
parent
e9221e6ce0
commit
9c34a6585b
9 changed files with 64 additions and 17 deletions
|
@ -6,6 +6,9 @@ use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::FakeXRRigidTra
|
||||||
use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{
|
use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{
|
||||||
self, FakeXRInputControllerMethods,
|
self, FakeXRInputControllerMethods,
|
||||||
};
|
};
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding::{
|
||||||
|
XRHandedness, XRTargetRayMode,
|
||||||
|
};
|
||||||
use crate::dom::bindings::error::Fallible;
|
use crate::dom::bindings::error::Fallible;
|
||||||
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
||||||
use crate::dom::bindings::root::DomRoot;
|
use crate::dom::bindings::root::DomRoot;
|
||||||
|
@ -13,7 +16,9 @@ use crate::dom::fakexrdevice::get_origin;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use ipc_channel::ipc::IpcSender;
|
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]
|
#[dom_struct]
|
||||||
pub struct FakeXRInputController {
|
pub struct FakeXRInputController {
|
||||||
|
@ -103,4 +108,24 @@ impl FakeXRInputControllerMethods for FakeXRInputController {
|
||||||
SelectEvent::Select,
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
[Exposed=Window, Pref="dom.webxr.test"]
|
[Exposed=Window, Pref="dom.webxr.test"]
|
||||||
interface FakeXRInputController {
|
interface FakeXRInputController {
|
||||||
// void setHandedness(XRHandedness handedness);
|
void setHandedness(XRHandedness handedness);
|
||||||
// void setTargetRayMode(XRTargetRayMode targetRayMode);
|
void setTargetRayMode(XRTargetRayMode targetRayMode);
|
||||||
// void setProfiles(sequence<DOMString> profiles);
|
// void setProfiles(sequence<DOMString> profiles);
|
||||||
[Throws] void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false);
|
[Throws] void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false);
|
||||||
void clearGripOrigin();
|
void clearGripOrigin();
|
||||||
|
|
|
@ -101,6 +101,37 @@ impl XRInputSourceArray {
|
||||||
event.upcast::<Event>().fire(session.upcast());
|
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>> {
|
pub fn find(&self, id: InputId) -> Option<DomRoot<XRInputSource>> {
|
||||||
self.input_sources
|
self.input_sources
|
||||||
.borrow()
|
.borrow()
|
||||||
|
|
|
@ -71,7 +71,7 @@ impl XRInputSourcesChangeEvent {
|
||||||
changeevent.added.set(added_val.get());
|
changeevent.added.set(added_val.get());
|
||||||
rooted!(in(*cx) let mut removed_val = UndefinedValue());
|
rooted!(in(*cx) let mut removed_val = UndefinedValue());
|
||||||
removed.to_jsval(*cx, removed_val.handle_mut());
|
removed.to_jsval(*cx, removed_val.handle_mut());
|
||||||
changeevent.added.set(removed_val.get());
|
changeevent.removed.set(removed_val.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
changeevent
|
changeevent
|
||||||
|
|
|
@ -295,6 +295,9 @@ impl XRSession {
|
||||||
XREvent::RemoveInput(id) => {
|
XREvent::RemoveInput(id) => {
|
||||||
self.input_sources.remove_input_source(self, id);
|
self.input_sources.remove_input_source(self, id);
|
||||||
},
|
},
|
||||||
|
XREvent::UpdateInput(id, source) => {
|
||||||
|
self.input_sources.add_remove_input_source(self, id, source);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[events_input_source_recreation.https.html]
|
[events_input_source_recreation.https.html]
|
||||||
expected: ERROR
|
|
||||||
[Input sources are re-created when handedness or target ray mode changes]
|
[Input sources are re-created when handedness or target ray mode changes]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[getInputPose_handedness.https.html]
|
|
||||||
expected: ERROR
|
|
||||||
[XRInputSources properly communicate their handedness]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
[xrSession_input_events_end.https.html]
|
[xrSession_input_events_end.https.html]
|
||||||
expected: TIMEOUT
|
|
||||||
[Calling end during an input callback stops processing at the right time]
|
[Calling end during an input callback stops processing at the right time]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[xrSession_sameObject.https.html]
|
|
||||||
expected: ERROR
|
|
||||||
[XRSession attributes meet [SameObject\] requirement]
|
|
||||||
expected: TIMEOUT
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue