diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-07-27 09:19:31 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-27 09:19:31 -0400 |
commit | dcc5ae9fdf70691bade2fd19e2ce21b96c64a33c (patch) | |
tree | f6815f6c6f9d6f18940a12e3234fa479b8506476 /components/script/dom | |
parent | f78dd6142e0b87492e0f8d5668c333a18a0cf780 (diff) | |
parent | 133a17e15c4110fe7a5f0933bb50842bb3eeeccb (diff) | |
download | servo-dcc5ae9fdf70691bade2fd19e2ce21b96c64a33c.tar.gz servo-dcc5ae9fdf70691bade2fd19e2ce21b96c64a33c.zip |
Auto merge of #23848 - asajeffrey:webxr-moar-channels, r=Manishearth
Replace use of callbacks in webxr by channels
<!-- Please describe your changes on the following line: -->
Use senders rather than callbacks in webxr.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes do not require tests because it's an internal change
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23848)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 8 | ||||
-rw-r--r-- | components/script/dom/xr.rs | 35 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 44 | ||||
-rw-r--r-- | components/script/dom/xrtest.rs | 16 |
4 files changed, 17 insertions, 86 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 743a2adec84..3a273f3cfa3 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -328,6 +328,10 @@ impl WebGLRenderingContext { self.webgl_sender.clone() } + pub fn context_id(&self) -> WebGLContextId { + self.webgl_sender.context_id() + } + #[inline] pub fn send_command(&self, command: WebGLCommand) { self.webgl_sender @@ -4377,8 +4381,4 @@ impl WebGLMessageSender { pub fn send_dom_to_texture(&self, command: DOMToTextureCommand) -> WebGLSendResult { self.wake_after_send(|| self.sender.send_dom_to_texture(command)) } - - pub fn webxr_external_image_api(&self) -> impl webxr_api::WebGLExternalImageApi { - self.sender.webxr_external_image_api() - } } diff --git a/components/script/dom/xr.rs b/components/script/dom/xr.rs index d24e8f144cd..8deead58b92 100644 --- a/components/script/dom/xr.rs +++ b/components/script/dom/xr.rs @@ -108,18 +108,6 @@ impl Into<SessionMode> for XRSessionMode { impl XRMethods for XR { /// https://immersive-web.github.io/webxr/#dom-xr-supportssessionmode fn SupportsSession(&self, mode: XRSessionMode) -> Rc<Promise> { - #[derive(serde::Serialize, serde::Deserialize)] - pub struct SupportsSession { - sender: IpcSender<bool>, - } - - #[typetag::serde] - impl webxr_api::SessionSupportCallback for SupportsSession { - fn callback(&mut self, result: Result<(), XRError>) { - let _ = self.sender.send(result.is_ok()); - } - } - // XXXManishearth this should select an XR device first let promise = Promise::new(&self.global()); let mut trusted = Some(TrustedPromise::new(promise.clone())); @@ -139,13 +127,13 @@ impl XRMethods for XR { error!("supportsSession callback called twice!"); return; }; - let message = if let Ok(message) = message.to() { + let message: Result<(), webxr_api::Error> = if let Ok(message) = message.to() { message } else { error!("supportsSession callback given incorrect payload"); return; }; - if message { + if let Ok(()) = message { let _ = task_source.queue_with_canceller(trusted.resolve_task(()), &canceller); } else { let _ = task_source @@ -155,7 +143,7 @@ impl XRMethods for XR { ); window .webxr_registry() - .supports_session(mode.into(), SupportsSession { sender }); + .supports_session(mode.into(), sender); promise } @@ -167,17 +155,6 @@ impl XRMethods for XR { _: &XRSessionInit, comp: InCompartment, ) -> Rc<Promise> { - #[derive(serde::Serialize, serde::Deserialize)] - pub struct RequestSession { - sender: IpcSender<Result<Session, XRError>>, - } - - #[typetag::serde] - impl webxr_api::SessionRequestCallback for RequestSession { - fn callback(&mut self, result: Result<Session, XRError>) { - let _ = self.sender.send(result); - } - } let promise = Promise::new_in_current_compartment(&self.global(), comp); if mode != XRSessionMode::Immersive_vr { promise.reject_error(Error::NotSupported); @@ -206,7 +183,7 @@ impl XRMethods for XR { // router doesn't know this is only called once let trusted = trusted.take().unwrap(); let this = this.clone(); - let message = if let Ok(message) = message.to() { + let message: Result<Session, webxr_api::Error> = if let Ok(message) = message.to() { message } else { error!("requestSession callback given incorrect payload"); @@ -220,9 +197,7 @@ impl XRMethods for XR { ); }), ); - window - .webxr_registry() - .request_session(mode.into(), RequestSession { sender }); + window.webxr_registry().request_session(mode.into(), sender); promise } diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 9542486f3ae..0a9712bb92b 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -124,18 +124,6 @@ impl XRSession { } fn attach_event_handler(&self) { - #[derive(serde::Serialize, serde::Deserialize)] - pub struct EventCallback { - sender: IpcSender<XREvent>, - } - - #[typetag::serde] - impl webxr_api::EventCallback for EventCallback { - fn callback(&mut self, event: XREvent) { - let _ = self.sender.send(event); - } - } - let this = Trusted::new(self); let global = self.global(); let window = global.as_window(); @@ -143,6 +131,7 @@ impl XRSession { .task_manager() .dom_manipulation_task_source_with_canceller(); let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap(); + ROUTER.add_route( receiver.to_opaque(), Box::new(move |message| { @@ -157,9 +146,7 @@ impl XRSession { ); // request animation frame - self.session - .borrow_mut() - .set_event_callback(EventCallback { sender }); + self.session.borrow_mut().set_event_dest(sender); } fn event_callback(&self, event: XREvent) { @@ -195,13 +182,10 @@ impl XRSession { // Step 6-7: XXXManishearth handle inlineVerticalFieldOfView // XXXManishearth handle inline sessions and composition disabled flag - let layer = pending.GetBaseLayer(); - if let Some(layer) = layer { - let mut session = self.session.borrow_mut(); - session.update_webgl_external_image_api( - layer.Context().webgl_sender().webxr_external_image_api(), - ); - } + let context = pending + .GetBaseLayer() + .map(|layer| layer.Context().context_id().0); + self.session.borrow_mut().set_webgl_context(context); } // Step 2 @@ -289,18 +273,6 @@ impl XRSessionMethods for XRSession { /// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe fn RequestAnimationFrame(&self, callback: Rc<XRFrameRequestCallback>) -> i32 { - #[derive(serde::Serialize, serde::Deserialize)] - pub struct FrameCallback { - sender: IpcSender<(f64, Frame)>, - } - - #[typetag::serde] - impl webxr_api::FrameRequestCallback for FrameCallback { - fn callback(&mut self, time: f64, frame: Frame) { - let _ = self.sender.send((time, frame)); - } - } - // queue up RAF callback, obtain ID let raf_id = self.next_raf_id.get(); self.next_raf_id.set(raf_id + 1); @@ -334,9 +306,7 @@ impl XRSessionMethods for XRSession { let sender = self.raf_sender.borrow().clone().unwrap(); // request animation frame - self.session - .borrow_mut() - .request_animation_frame(FrameCallback { sender }); + self.session.borrow_mut().request_animation_frame(sender); raf_id } diff --git a/components/script/dom/xrtest.rs b/components/script/dom/xrtest.rs index c8f45b75b4f..3c376366faf 100644 --- a/components/script/dom/xrtest.rs +++ b/components/script/dom/xrtest.rs @@ -73,20 +73,6 @@ impl XRTest { impl XRTestMethods for XRTest { /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md fn SimulateDeviceConnection(&self, init: &FakeXRDeviceInit) -> Rc<Promise> { - #[derive(serde::Serialize, serde::Deserialize)] - pub struct MockDevice { - sender: IpcSender<Result<IpcSender<MockDeviceMsg>, XRError>>, - } - - #[typetag::serde] - impl webxr_api::MockDeviceCallback for MockDevice { - fn callback(&mut self, result: Result<IpcSender<MockDeviceMsg>, XRError>) { - self.sender - .send(result) - .expect("mock device callback failed"); - } - } - let p = Promise::new(&self.global()); if !init.supportsImmersive || self.session_started.get() { @@ -166,7 +152,7 @@ impl XRTestMethods for XRTest { ); window .webxr_registry() - .simulate_device_connection(init, MockDevice { sender }); + .simulate_device_connection(init, sender); p } |