diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 5eb728dfec5b9..102c7040b6d8d 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc @@ -987,16 +987,17 @@ ScriptPromise WebGLRenderingContextBase::makeXRCompatible( if (xr_compatible_) return ToResolvedUndefinedPromise(script_state); - // If there's a request currently in progress, return the same promise. - if (make_xr_compatible_resolver_) - return make_xr_compatible_resolver_->Promise(); + auto* resolver = MakeGarbageCollected>( + script_state, exception_state.GetContext()); + auto promise = resolver->Promise(); - make_xr_compatible_resolver_ = - MakeGarbageCollected>( - script_state, exception_state.GetContext()); - auto promise = make_xr_compatible_resolver_->Promise(); - - MakeXrCompatibleAsync(); + // If there's a request currently in progress, share its result; otherwise + // start a new one. + bool request_in_progress = !make_xr_compatible_resolvers_.empty(); + make_xr_compatible_resolvers_.push_back(resolver); + if (!request_in_progress) { + MakeXrCompatibleAsync(); + } return promise; } @@ -1096,17 +1097,16 @@ void WebGLRenderingContextBase::OnMakeXrCompatibleFinished( void WebGLRenderingContextBase::CompleteXrCompatiblePromiseIfPending( DOMExceptionCode exception_code) { - if (make_xr_compatible_resolver_) { + HeapVector>> resolvers; + resolvers.swap(make_xr_compatible_resolvers_); + for (auto& resolver : resolvers) { if (xr_compatible_) { DCHECK(exception_code == DOMExceptionCode::kNoError); - make_xr_compatible_resolver_->Resolve(); + resolver->Resolve(); } else { DCHECK(exception_code != DOMExceptionCode::kNoError); - make_xr_compatible_resolver_->Reject( - MakeGarbageCollected(exception_code)); + resolver->Reject(MakeGarbageCollected(exception_code)); } - - make_xr_compatible_resolver_ = nullptr; } } @@ -7596,10 +7596,9 @@ void WebGLRenderingContextBase::ForceLostContext( tracker->LoseExtension(false); } - // This resolver is non-null during a makeXRCompatible call, while waiting - // for a response from the browser and XR process. If the WebGL context is - // lost before we get a response, the resolver has to be rejected to be - // be properly disposed of. + // makeXRCompatible() resolvers are pending while waiting for a response from + // the browser and XR process. If the WebGL context is lost before we get a + // response, the resolvers have to be rejected to be properly disposed of. xr_compatible_ = false; CompleteXrCompatiblePromiseIfPending(DOMExceptionCode::kInvalidStateError); @@ -9298,7 +9297,7 @@ void WebGLRenderingContextBase::Trace(Visitor* visitor) const { visitor->Trace(texture_units_); visitor->Trace(extensions_); visitor->Trace(buffers_); - visitor->Trace(make_xr_compatible_resolver_); + visitor->Trace(make_xr_compatible_resolvers_); visitor->Trace(program_completion_query_list_); visitor->Trace(program_completion_query_map_); WebGLContextObjectSupport::Trace(visitor); diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index 6257ff047ec70..1fc5b8f00fc10 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h @@ -885,7 +885,8 @@ class MODULES_EXPORT WebGLRenderingContextBase device::mojom::blink::XrCompatibleResult xr_compatible_result); void CompleteXrCompatiblePromiseIfPending(DOMExceptionCode exception_code); bool xr_compatible_; - Member> make_xr_compatible_resolver_; + HeapVector>> + make_xr_compatible_resolvers_; HeapVector texture_units_; wtf_size_t active_texture_unit_; diff --git a/third_party/blink/web_tests/wpt_internal/webxr/webGLCanvasContext_makecompatible_isolated_world.https.html b/third_party/blink/web_tests/wpt_internal/webxr/webGLCanvasContext_makecompatible_isolated_world.https.html new file mode 100644 index 0000000000000..2b2c675d6965b --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/webxr/webGLCanvasContext_makecompatible_isolated_world.https.html @@ -0,0 +1,47 @@ + + + + + +