diff --git a/components/config/prefs.rs b/components/config/prefs.rs index 9fa4075f606c..a6d519431909 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -300,6 +300,8 @@ mod gen { enabled: bool, }, sessionavailable: bool, + #[serde(rename = "dom.webxr.unsafe-assume-user-intent")] + unsafe_assume_user_intent: bool, }, worklet: { blockingsleep: { diff --git a/components/script/dom/xrsystem.rs b/components/script/dom/xrsystem.rs index 798ba502aebf..29ecf4aa91f4 100644 --- a/components/script/dom/xrsystem.rs +++ b/components/script/dom/xrsystem.rs @@ -26,6 +26,7 @@ use ipc_channel::ipc::{self as ipc_crate, IpcReceiver}; use ipc_channel::router::ROUTER; use msg::constellation_msg::PipelineId; use profile_traits::ipc; +use servo_config::pref; use std::cell::Cell; use std::rc::Rc; use webxr_api::{Error as XRError, Frame, Session, SessionInit, SessionMode}; @@ -161,8 +162,12 @@ impl XRSystemMethods for XRSystem { if mode != XRSessionMode::Inline { if !ScriptThread::is_user_interacting() { - promise.reject_error(Error::Security); - return promise; + if pref!(dom.webxr.unsafe_assume_user_intent) { + warn!("The dom.webxr.unsafe-assume-user-intent preference assumes user intent to enter WebXR."); + } else { + promise.reject_error(Error::Security); + return promise; + } } if self.pending_or_active_session() { diff --git a/ports/gstplugin/servowebsrc.rs b/ports/gstplugin/servowebsrc.rs index 90a69b2967cd..6302131e163b 100644 --- a/ports/gstplugin/servowebsrc.rs +++ b/ports/gstplugin/servowebsrc.rs @@ -218,6 +218,7 @@ impl ServoThread { None => Some(webrender_swap_chain), Some(..) => { set_pref!(dom.webxr.sessionavailable, true); + set_pref!(dom.webxr.unsafe_assume_user_intent, true); servo.handle_events(vec![WindowEvent::ChangeBrowserVisibility(id, false)]); None }, diff --git a/resources/prefs.json b/resources/prefs.json index 219e9dda3940..8ea63008560a 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -49,6 +49,7 @@ "dom.webxr.layers.enabled": false, "dom.webxr.sessionavailable": false, "dom.webxr.test": false, + "dom.webxr.unsafe-assume-user-intent": false, "dom.worklet.timeout_ms": 10, "gfx.subpixel-text-antialiasing.enabled": true, "gfx.texture-swizzling.enabled": true,