diff --git a/components/config/prefs.rs b/components/config/prefs.rs index 38ee3eb6f91..26aec4d39d0 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -301,6 +301,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 9703a58bad1..23235c1d95a 100644 --- a/components/script/dom/xrsystem.rs +++ b/components/script/dom/xrsystem.rs @@ -162,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 90a69b2967c..6302131e163 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 205750845f4..6aef2c5f292 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -50,6 +50,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,