Commit 48729246 authored by Klaus Weidner's avatar Klaus Weidner Committed by Commit Bot

WebXR: handle DOM overlay from OOPIF fullscreen

If entering WebXR mode using DOM Overlay when we're already in
fullscreen mode, and if we have a remote ancestor frame that's
in another process, the ancestor frame didn't get set to transparent
since fullscreen_controller ignores changes to fullscreen options.

As a workaround, exit fullscreen mode in this case before proceeding
with the session request.

Bug: 1101193
Change-Id: I36b9918717abf6c5d462b7c78d545ae53fc5391e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2358493Reviewed-by: default avatarPiotr Bialecki <bialpio@chromium.org>
Commit-Queue: Klaus Weidner <klausw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799401}
parent 519c4a1a
...@@ -996,6 +996,37 @@ void XRSystem::RequestImmersiveSession(LocalFrame* frame, ...@@ -996,6 +996,37 @@ void XRSystem::RequestImmersiveSession(LocalFrame* frame,
outstanding_request_queries_.insert(query); outstanding_request_queries_.insert(query);
auto session_options = XRSessionOptionsFromQuery(*query); auto session_options = XRSessionOptionsFromQuery(*query);
// If using DOM Overlay, if we're already in fullscreen mode, and if this
// frame has a remote ancestor (OOPIF with the ancestor in another process),
// we need to exit and re-enter fullscreen mode to properly apply the
// is_xr_overlay property. Request a fullscreen exit, and continue with
// the session request once that completes.
if (query->DOMOverlayElement() && Fullscreen::FullscreenElementFrom(*doc)) {
bool has_remote_ancestor = false;
for (Frame* f = GetFrame(); f; f = f->Tree().Parent()) {
if (f->IsRemoteFrame()) {
has_remote_ancestor = true;
break;
}
}
DVLOG(2) << __func__ << ": has_remote_ancestor=" << has_remote_ancestor;
if (has_remote_ancestor) {
fullscreen_exit_observer_ =
MakeGarbageCollected<OverlayFullscreenExitObserver>(this);
base::OnceClosure callback =
WTF::Bind(&XRSystem::DoRequestSession, WrapWeakPersistent(this),
WrapPersistent(query), std::move(session_options));
fullscreen_exit_observer_->ExitFullscreen(doc, std::move(callback));
return;
}
}
DoRequestSession(std::move(query), std::move(session_options));
}
void XRSystem::DoRequestSession(
PendingRequestSessionQuery* query,
device::mojom::blink::XRSessionOptionsPtr session_options) {
// In DOM overlay mode, there's an additional step before an immersive-ar // In DOM overlay mode, there's an additional step before an immersive-ar
// session can start, we need to enter fullscreen mode by setting the // session can start, we need to enter fullscreen mode by setting the
// appropriate element as fullscreen from the Renderer, then waiting for the // appropriate element as fullscreen from the Renderer, then waiting for the
......
...@@ -318,7 +318,7 @@ class XRSystem final : public EventTargetWithInlineData, ...@@ -318,7 +318,7 @@ class XRSystem final : public EventTargetWithInlineData,
}; };
// Native event listener used when waiting for fullscreen mode to fully exit // Native event listener used when waiting for fullscreen mode to fully exit
// when ending an XR session. // when starting or ending an XR session.
class OverlayFullscreenExitObserver : public NativeEventListener { class OverlayFullscreenExitObserver : public NativeEventListener {
public: public:
explicit OverlayFullscreenExitObserver(XRSystem* xr); explicit OverlayFullscreenExitObserver(XRSystem* xr);
...@@ -366,6 +366,9 @@ class XRSystem final : public EventTargetWithInlineData, ...@@ -366,6 +366,9 @@ class XRSystem final : public EventTargetWithInlineData,
PendingRequestSessionQuery* query, PendingRequestSessionQuery* query,
ExceptionState* exception_state); ExceptionState* exception_state);
void DoRequestSession(
PendingRequestSessionQuery* query,
device::mojom::blink::XRSessionOptionsPtr session_options);
void OnRequestSessionSetupForDomOverlay( void OnRequestSessionSetupForDomOverlay(
PendingRequestSessionQuery*, PendingRequestSessionQuery*,
device::mojom::blink::RequestSessionResultPtr result); device::mojom::blink::RequestSessionResultPtr result);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment