mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Replace use of callbacks in webxr by channels
This commit is contained in:
parent
5c8fee4e0b
commit
133a17e15c
11 changed files with 109 additions and 190 deletions
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue