Security drop fullscreen for any nested WebContents level.
This relands 3dcaec6e30feebefc11e with a fix to the test.
BUG=873080
TEST=as in bug
Change-Id: Ie68b197fc6b92447e9633f233354a68fefcf20c7
Reviewed-on: https://chromium-review.googlesource.com/1175925
Reviewed-by: Sidney San MartÃn <[email protected]>
Commit-Queue: Avi Drissman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#583335}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 5fde7258..f3b718d 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2695,8 +2695,7 @@
// Any new WebContents opened while this WebContents is in fullscreen can be
// used to confuse the user, so drop fullscreen.
- if (IsFullscreenForCurrentTab())
- ExitFullscreen(true);
+ ForSecurityDropFullscreen();
if (params.opener_suppressed) {
// When the opener is suppressed, the original renderer cannot access the
@@ -4366,8 +4365,7 @@
// Any new WebContents opened while this WebContents is in fullscreen can be
// used to confuse the user, so drop fullscreen.
- if (IsFullscreenForCurrentTab())
- ExitFullscreen(true);
+ ForSecurityDropFullscreen();
// We intentionally don't share the SiteInstance with the original frame so
// that view source has a consistent process model and always ends up in a new
@@ -5084,8 +5082,7 @@
// Running a dialog causes an exit to webpage-initiated fullscreen.
// http://crbug.com/728276
- if (IsFullscreenForCurrentTab())
- ExitFullscreen(true);
+ ForSecurityDropFullscreen();
auto callback =
base::BindOnce(&WebContentsImpl::OnDialogClosed, base::Unretained(this),
@@ -5154,8 +5151,7 @@
// Running a dialog causes an exit to webpage-initiated fullscreen.
// http://crbug.com/728276
- if (IsFullscreenForCurrentTab())
- ExitFullscreen(true);
+ ForSecurityDropFullscreen();
RenderFrameHostImpl* rfhi =
static_cast<RenderFrameHostImpl*>(render_frame_host);
@@ -5737,6 +5733,15 @@
}
}
+void WebContentsImpl::ForSecurityDropFullscreen() {
+ WebContentsImpl* web_contents = this;
+ while (web_contents) {
+ if (web_contents->IsFullscreenForCurrentTab())
+ web_contents->ExitFullscreen(true);
+ web_contents = web_contents->GetOuterWebContents();
+ }
+}
+
void WebContentsImpl::SetAsFocusedWebContentsIfNecessary() {
// Only change focus if we are not currently focused.
WebContentsImpl* old_contents = GetFocusedWebContents();
@@ -5804,8 +5809,7 @@
void WebContentsImpl::DidCallFocus() {
// Any explicit focusing of another window while this WebContents is in
// fullscreen can be used to confuse the user, so drop fullscreen.
- if (IsFullscreenForCurrentTab())
- ExitFullscreen(true);
+ ForSecurityDropFullscreen();
}
RenderFrameHost* WebContentsImpl::GetFocusedFrameIncludingInnerWebContents() {