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..32616bc8b47f0 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 @@ -988,8 +988,21 @@ ScriptPromise WebGLRenderingContextBase::makeXRCompatible( return ToResolvedUndefinedPromise(script_state); // If there's a request currently in progress, return the same promise. - if (make_xr_compatible_resolver_) + if (make_xr_compatible_resolver_) { + // The cached resolver is bound to the world that initiated the original + // request. Returning its v8::Promise to a caller from a different world + // would leak a cross-world JS object and break isolated-world isolation. + // Reject in the caller's world instead. + if (&make_xr_compatible_resolver_->GetScriptState()->World() != + &script_state->World()) { + exception_state.ThrowDOMException( + DOMExceptionCode::kInvalidStateError, + "A makeXRCompatible request from another execution world is already " + "in progress."); + return EmptyPromise(); + } return make_xr_compatible_resolver_->Promise(); + } make_xr_compatible_resolver_ = MakeGarbageCollected>(