Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a sessionavailable event that allows content to enter an XR session without a user gesture #27235

Merged
merged 2 commits into from Jul 10, 2020
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -115,6 +115,7 @@ selectend
selectionchange
selectstart
serif
sessionavailable
signalingstatechange
squeeze
squeezeend
@@ -281,7 +281,8 @@ mod gen {
},
layers: {
enabled: bool,
}
},
sessionavailable: bool,
},
worklet: {
blockingsleep: {
@@ -17,6 +17,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMe
use crate::dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementBinding::HTMLIFrameElementMethods;
use crate::dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
use crate::dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods;
use crate::dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorBinding::NavigatorMethods;
use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use crate::dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter;
use crate::dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods;
@@ -2267,6 +2268,17 @@ impl Document {
// Step 11.
// TODO: ready for post-load tasks.

// The dom.webxr.sessionavailable pref allows webxr
// content to immediately begin a session without waiting for a user gesture.
// TODO: should this only happen on the first document loaded?
// https://immersive-web.github.io/webxr/#user-intention
// https://github.com/immersive-web/navigation/issues/10
if pref!(dom.webxr.sessionavailable) {
if self.window.is_top_level() {
self.window.Navigator().Xr().dispatch_sessionavailable();
}
}

// Step 12: completely loaded.
// https://html.spec.whatwg.org/multipage/#completely-loaded
// TODO: fully implement "completely loaded".
@@ -7,6 +7,7 @@ use crate::dom::bindings::codegen::Bindings::XRSystemBinding::XRSessionInit;
use crate::dom::bindings::codegen::Bindings::XRSystemBinding::{XRSessionMode, XRSystemMethods};
use crate::dom::bindings::conversions::{ConversionResult, FromJSValConvertible};
use crate::dom::bindings::error::Error;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::refcounted::{Trusted, TrustedPromise};
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
@@ -289,4 +290,26 @@ impl XRSystem {
// This must be called _after_ the promise is resolved
session.setup_initial_inputs();
}

// https://github.com/immersive-web/navigation/issues/10
pub fn dispatch_sessionavailable(&self) {
let xr = Trusted::new(self);
let global = self.global();
let window = global.as_window();
window
.task_manager()
.dom_manipulation_task_source()
.queue(
task!(fire_sessionavailable_event: move || {
// The sessionavailable event indicates user intent to enter an XR session
let xr = xr.root();
let interacting = ScriptThread::is_user_interacting();
ScriptThread::set_user_interacting(true);
xr.upcast::<EventTarget>().fire_bubbling_event(atom!("sessionavailable"));
ScriptThread::set_user_interacting(interacting);
}),
window.upcast(),
)
.unwrap();
}
}
@@ -41,6 +41,7 @@
"dom.webxr.glwindow.spherical": false,
"dom.webxr.hands.enabled": false,
"dom.webxr.layers.enabled": false,
"dom.webxr.sessionavailable": false,
"dom.webxr.test": false,
"dom.worklet.timeout_ms": 10,
"gfx.subpixel-text-antialiasing.enabled": true,
@@ -14731,6 +14731,13 @@
null,
{}
]
],
"sessionavailable.html": [
"dd9a071d05c4d696471be87428c12cea573cba60",
[
null,
{}
]
]
}
}
@@ -0,0 +1,2 @@
prefs: [dom.webxr.sessionavailable:true]

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="./resources/webxr-util.js"></script>
<script>
navigator.xr.test.simulateDeviceConnection({
supportedModes: ["immersive-vr"],
views: TEST_VIEWS,
});
async_test((t) => {
navigator.xr.addEventListener("sessionavailable", (evt) => {
navigator.xr.requestSession("immersive-vr")
.then((session) => {
t.done();
})
});
}, "Requesting immersive session in a sessionavailable handler should succeed");
</script>
</body>
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.