aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-07-19 19:10:20 -0700
committerManish Goregaokar <manishsmail@gmail.com>2019-07-22 09:32:01 -0700
commitb0002a003d3222b01d20f781cf9ca28a01bda22f (patch)
tree317a5e59885b88e2efb495947876a9b8a39d8d25 /components/script
parentb66cbd364a2352a15f772355cc0d978c8ddda908 (diff)
downloadservo-b0002a003d3222b01d20f781cf9ca28a01bda22f.tar.gz
servo-b0002a003d3222b01d20f781cf9ca28a01bda22f.zip
Make use of ended flag, get rid of XRLayer
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/webidls/XRLayer.webidl8
-rw-r--r--components/script/dom/webidls/XRRenderState.webidl4
-rw-r--r--components/script/dom/webidls/XRSession.webidl2
-rw-r--r--components/script/dom/webidls/XRWebGLLayer.webidl2
-rw-r--r--components/script/dom/xrlayer.rs19
-rw-r--r--components/script/dom/xrrenderstate.rs12
-rw-r--r--components/script/dom/xrsession.rs50
-rw-r--r--components/script/dom/xrwebgllayer.rs18
9 files changed, 52 insertions, 64 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 60701755ec8..b1f001b1322 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -546,7 +546,6 @@ pub mod xmlserializer;
pub mod xr;
pub mod xrframe;
pub mod xrinputsource;
-pub mod xrlayer;
pub mod xrpose;
pub mod xrreferencespace;
pub mod xrrenderstate;
diff --git a/components/script/dom/webidls/XRLayer.webidl b/components/script/dom/webidls/XRLayer.webidl
deleted file mode 100644
index 69c65da6143..00000000000
--- a/components/script/dom/webidls/XRLayer.webidl
+++ /dev/null
@@ -1,8 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-
-// https://immersive-web.github.io/webxr/#xrlayer-interface
-
-[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
-interface XRLayer {};
diff --git a/components/script/dom/webidls/XRRenderState.webidl b/components/script/dom/webidls/XRRenderState.webidl
index 195d5acf3ac..01d7fd39191 100644
--- a/components/script/dom/webidls/XRRenderState.webidl
+++ b/components/script/dom/webidls/XRRenderState.webidl
@@ -7,11 +7,11 @@
dictionary XRRenderStateInit {
double depthNear;
double depthFar;
- XRLayer baseLayer;
+ XRWebGLLayer baseLayer;
};
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRRenderState {
readonly attribute double depthNear;
readonly attribute double depthFar;
- readonly attribute XRLayer? baseLayer;
+ readonly attribute XRWebGLLayer? baseLayer;
};
diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl
index 105a4b374ff..6d946ccef55 100644
--- a/components/script/dom/webidls/XRSession.webidl
+++ b/components/script/dom/webidls/XRSession.webidl
@@ -29,7 +29,7 @@ interface XRSession : EventTarget {
// FrozenArray<XRInputSource> getInputSources();
sequence<XRInputSource> getInputSources();
- void updateRenderState(optional XRRenderStateInit state = {});
+ [Throws] void updateRenderState(optional XRRenderStateInit state = {});
long requestAnimationFrame(XRFrameRequestCallback callback);
void cancelAnimationFrame(long handle);
diff --git a/components/script/dom/webidls/XRWebGLLayer.webidl b/components/script/dom/webidls/XRWebGLLayer.webidl
index f83e1e4c35a..769b3e9b567 100644
--- a/components/script/dom/webidls/XRWebGLLayer.webidl
+++ b/components/script/dom/webidls/XRWebGLLayer.webidl
@@ -21,7 +21,7 @@ dictionary XRWebGLLayerInit {
XRWebGLRenderingContext context,
optional XRWebGLLayerInit layerInit = {}),
Pref="dom.webxr.enabled"]
-interface XRWebGLLayer : XRLayer {
+interface XRWebGLLayer {
// // Attributes
readonly attribute XRWebGLRenderingContext context;
diff --git a/components/script/dom/xrlayer.rs b/components/script/dom/xrlayer.rs
deleted file mode 100644
index d17704be28f..00000000000
--- a/components/script/dom/xrlayer.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-
-use crate::dom::bindings::reflector::Reflector;
-use dom_struct::dom_struct;
-
-#[dom_struct]
-pub struct XRLayer {
- reflector_: Reflector,
-}
-
-impl XRLayer {
- pub fn new_inherited() -> XRLayer {
- XRLayer {
- reflector_: Reflector::new(),
- }
- }
-}
diff --git a/components/script/dom/xrrenderstate.rs b/components/script/dom/xrrenderstate.rs
index 824b7a6d37a..2aba4e46493 100644
--- a/components/script/dom/xrrenderstate.rs
+++ b/components/script/dom/xrrenderstate.rs
@@ -7,7 +7,7 @@ use crate::dom::bindings::num::Finite;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::globalscope::GlobalScope;
-use crate::dom::xrlayer::XRLayer;
+use crate::dom::xrwebgllayer::XRWebGLLayer;
use dom_struct::dom_struct;
use std::cell::Cell;
@@ -17,14 +17,14 @@ pub struct XRRenderState {
reflector_: Reflector,
depth_near: Cell<f64>,
depth_far: Cell<f64>,
- layer: MutNullableDom<XRLayer>,
+ layer: MutNullableDom<XRWebGLLayer>,
}
impl XRRenderState {
pub fn new_inherited(
depth_near: f64,
depth_far: f64,
- layer: Option<&XRLayer>,
+ layer: Option<&XRWebGLLayer>,
) -> XRRenderState {
XRRenderState {
reflector_: Reflector::new(),
@@ -38,7 +38,7 @@ impl XRRenderState {
global: &GlobalScope,
depth_near: f64,
depth_far: f64,
- layer: Option<&XRLayer>,
+ layer: Option<&XRWebGLLayer>,
) -> DomRoot<XRRenderState> {
reflect_dom_object(
Box::new(XRRenderState::new_inherited(depth_near, depth_far, layer)),
@@ -62,7 +62,7 @@ impl XRRenderState {
pub fn set_depth_far(&self, depth: f64) {
self.depth_far.set(depth)
}
- pub fn set_layer(&self, layer: Option<&XRLayer>) {
+ pub fn set_layer(&self, layer: Option<&XRWebGLLayer>) {
self.layer.set(layer)
}
}
@@ -79,7 +79,7 @@ impl XRRenderStateMethods for XRRenderState {
}
/// https://immersive-web.github.io/webxr/#dom-xrrenderstate-baselayer
- fn GetBaseLayer(&self) -> Option<DomRoot<XRLayer>> {
+ fn GetBaseLayer(&self) -> Option<DomRoot<XRWebGLLayer>> {
self.layer.get()
}
}
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs
index 841b0110d4d..e6ca700d0e7 100644
--- a/components/script/dom/xrsession.rs
+++ b/components/script/dom/xrsession.rs
@@ -17,7 +17,7 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlen
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback;
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods;
use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods;
-use crate::dom::bindings::error::Error;
+use crate::dom::bindings::error::{Error, ErrorResult};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::refcounted::Trusted;
@@ -31,7 +31,6 @@ use crate::dom::node::NodeDamage;
use crate::dom::promise::Promise;
use crate::dom::xrframe::XRFrame;
use crate::dom::xrinputsource::XRInputSource;
-use crate::dom::xrlayer::XRLayer;
use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrrenderstate::XRRenderState;
use crate::dom::xrsessionevent::XRSessionEvent;
@@ -51,7 +50,7 @@ use webxr_api::{self, Event as XREvent, Frame, Session};
#[dom_struct]
pub struct XRSession {
eventtarget: EventTarget,
- base_layer: MutNullableDom<XRLayer>,
+ base_layer: MutNullableDom<XRWebGLLayer>,
blend_mode: XREnvironmentBlendMode,
viewer_space: MutNullableDom<XRSpace>,
#[ignore_malloc_size_of = "defined in webxr"]
@@ -120,6 +119,10 @@ impl XRSession {
with(&session)
}
+ pub fn is_ended(&self) -> bool {
+ self.ended.get()
+ }
+
fn attach_event_handler(&self) {
#[derive(serde::Serialize, serde::Deserialize)]
pub struct EventCallback {
@@ -195,13 +198,9 @@ impl XRSession {
let layer = pending.GetBaseLayer();
if let Some(layer) = layer {
let mut session = self.session.borrow_mut();
- if let Some(layer) = layer.downcast::<XRWebGLLayer>() {
- session.update_webgl_external_image_api(
- layer.Context().webgl_sender().webxr_external_image_api(),
- );
- } else {
- error!("updateRenderState() called with unknown layer type")
- }
+ session.update_webgl_external_image_api(
+ layer.Context().webgl_sender().webxr_external_image_api(),
+ );
}
}
@@ -233,13 +232,11 @@ impl XRSession {
// If the canvas element is attached to the DOM, it is now dirty,
// and we need to trigger a reflow.
- if let Some(webgl_layer) = base_layer.downcast::<XRWebGLLayer>() {
- webgl_layer
- .Context()
- .Canvas()
- .upcast::<Node>()
- .dirty(NodeDamage::OtherNodeDamage);
- }
+ base_layer
+ .Context()
+ .Canvas()
+ .upcast::<Node>()
+ .dirty(NodeDamage::OtherNodeDamage);
}
}
@@ -258,11 +255,19 @@ impl XRSessionMethods for XRSession {
}
/// https://immersive-web.github.io/webxr/#dom-xrsession-updaterenderstate
- fn UpdateRenderState(&self, init: &XRRenderStateInit, _: InCompartment) {
- // XXXManishearth various checks:
- // If session’s ended value is true, throw an InvalidStateError and abort these steps
- // If newState’s baseLayer's was created with an XRSession other than session,
- // throw an InvalidStateError and abort these steps
+ fn UpdateRenderState(&self, init: &XRRenderStateInit, _: InCompartment) -> ErrorResult {
+ // Step 2
+ if self.ended.get() {
+ return Err(Error::InvalidState);
+ }
+ // Step 3:
+ if let Some(ref layer) = init.baseLayer {
+ if Dom::from_ref(layer.session()) != Dom::from_ref(self) {
+ return Err(Error::InvalidState);
+ }
+ }
+
+ // XXXManishearth step 4:
// If newState’s inlineVerticalFieldOfView is set and session is an
// immersive session, throw an InvalidStateError and abort these steps.
@@ -279,6 +284,7 @@ impl XRSessionMethods for XRSession {
pending.set_layer(Some(&layer))
}
// XXXManishearth handle inlineVerticalFieldOfView
+ Ok(())
}
/// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe
diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs
index a2a7c93f37c..a5f06df0e52 100644
--- a/components/script/dom/xrwebgllayer.rs
+++ b/components/script/dom/xrwebgllayer.rs
@@ -10,14 +10,13 @@ use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGL
use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use crate::dom::bindings::error::Error;
use crate::dom::bindings::error::Fallible;
-use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
+use crate::dom::bindings::reflector::{reflect_dom_object, Reflector, DomObject};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::globalscope::GlobalScope;
use crate::dom::webgl_validations::types::TexImageTarget;
use crate::dom::webglframebuffer::WebGLFramebuffer;
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
use crate::dom::window::Window;
-use crate::dom::xrlayer::XRLayer;
use crate::dom::xrsession::XRSession;
use crate::dom::xrview::XRView;
use crate::dom::xrviewport::XRViewport;
@@ -28,7 +27,7 @@ use webxr_api::Views;
#[dom_struct]
pub struct XRWebGLLayer {
- xrlayer: XRLayer,
+ reflector_: Reflector,
antialias: bool,
depth: bool,
stencil: bool,
@@ -46,7 +45,7 @@ impl XRWebGLLayer {
framebuffer: &WebGLFramebuffer,
) -> XRWebGLLayer {
XRWebGLLayer {
- xrlayer: XRLayer::new_inherited(),
+ reflector_: Reflector::new(),
antialias: init.antialias,
depth: init.depth,
stencil: init.stencil,
@@ -83,6 +82,13 @@ impl XRWebGLLayer {
context: &WebGLRenderingContext,
init: &XRWebGLLayerInit,
) -> Fallible<DomRoot<Self>> {
+ // Step 2
+ if session.is_ended() {
+ return Err(Error::InvalidState);
+ }
+ // XXXManishearth step 3: throw error if context is lost
+ // XXXManishearth step 4: check XR compat flag for immersive sessions
+
let cx = global.get_cx();
let old_fbo = context.bound_framebuffer();
let old_texture = context
@@ -139,6 +145,10 @@ impl XRWebGLLayer {
&framebuffer,
))
}
+
+ pub fn session(&self) -> &XRSession {
+ &self.session
+ }
}
impl XRWebGLLayerMethods for XRWebGLLayer {