aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrinputsourcearray.rs
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2020-01-08 17:54:26 +0530
committerManish Goregaokar <manishsmail@gmail.com>2020-01-09 08:16:25 +0530
commitf721113f8d2b6bae00b9be280d80c6a7d16861b6 (patch)
tree24a068413b582f9695ec1cb5d377449a3a2bff14 /components/script/dom/xrinputsourcearray.rs
parenta90a42012bfcd4393ac447938efadfd5b4583be0 (diff)
downloadservo-f721113f8d2b6bae00b9be280d80c6a7d16861b6.tar.gz
servo-f721113f8d2b6bae00b9be280d80c6a7d16861b6.zip
Handle AddInput/RemoveInput events
Diffstat (limited to 'components/script/dom/xrinputsourcearray.rs')
-rw-r--r--components/script/dom/xrinputsourcearray.rs55
1 files changed, 54 insertions, 1 deletions
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::<Event>().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::<Event>().fire(session.upcast());
+ }
+
pub fn find(&self, id: InputId) -> Option<DomRoot<XRInputSource>> {
self.input_sources
.borrow()