diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 7d120ba2eba..731960518ea 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -59,6 +59,10 @@ impl Navigator { pub fn new(window: &Window) -> DomRoot { reflect_dom_object(Box::new(Navigator::new_inherited()), window) } + + pub fn xr(&self) -> Option> { + self.xr.get() + } } impl NavigatorMethods for Navigator { diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 33000497abf..ff4dea4fdb3 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -502,6 +502,12 @@ impl WebGLRenderingContext { return; } + // Dirtying the canvas is unnecessary if we're actively displaying immersive + // XR content right now. + if self.global().as_window().in_immersive_xr_session() { + return; + } + self.canvas .upcast::() .dirty(NodeDamage::OtherNodeDamage); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 89a49de8d9c..36916f3ef51 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -2252,6 +2252,14 @@ impl Window { pub fn webrender_document(&self) -> DocumentId { self.webrender_document } + + pub fn in_immersive_xr_session(&self) -> bool { + self.navigator + .get() + .as_ref() + .and_then(|nav| nav.xr()) + .map_or(false, |xr| xr.pending_or_active_session()) + } } impl Window {