aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-07-27 09:19:31 -0400
committerGitHub <noreply@github.com>2019-07-27 09:19:31 -0400
commitdcc5ae9fdf70691bade2fd19e2ce21b96c64a33c (patch)
treef6815f6c6f9d6f18940a12e3234fa479b8506476 /components/script/dom
parentf78dd6142e0b87492e0f8d5668c333a18a0cf780 (diff)
parent133a17e15c4110fe7a5f0933bb50842bb3eeeccb (diff)
downloadservo-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.rs8
-rw-r--r--components/script/dom/xr.rs35
-rw-r--r--components/script/dom/xrsession.rs44
-rw-r--r--components/script/dom/xrtest.rs16
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
}