Chrome · FullScreen
CVE-2026-87653
Logic Error in FullScreen
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.ccchrome/browser/ui/views/frame/browser_view.cc
Patch
From 20d7987766164047277a239abad097365106b413 Mon Sep 17 00:00:00 2001 From: Jordan Bayles <[email protected]> Date: Thu, 30 Jul 2026 11:43:58 -0700 Subject: [PATCH] [security] drop fullscreen when showing emoji panel in BrowserView Ensure showing the emoji panel drops HTML fullscreen on the active WebContents in BrowserView::ShowEmojiPanel(). Unlike modal dialogs (which automatically drop fullscreen via SetWebContentsBlocked), the emoji panel is modeless UI. Dropping fullscreen when the emoji panel is invoked prevents webpage UI spoofing under the emoji overlay. Added interactive browser test FullscreenControllerInteractiveTest.ShowEmojiPanelExitsFullscreen to verify the behavior. Fixed: 40058710 Change-Id: I1c1faf1d21911886b74732216137dab459a00753 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8166148 Reviewed-by: Avi Drissman <[email protected]> Commit-Queue: Jordan Bayles <[email protected]> Cr-Commit-Position: refs/heads/main@{#1671281} --- diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc index f5c1ba5..c339bf7 100644 --- a/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc +++ b/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc @@ -948,6 +948,18 @@ } IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, + ShowEmojiPanelExitsFullscreen) { + ASSERT_NO_FATAL_FAILURE(ToggleTabFullscreen(true)); + ASSERT_TRUE(IsWindowFullscreenForTabOrPending()); + + ui_test_utils::FullscreenWaiter waiter(browser(), {.tab_fullscreen = false}); + BrowserWindow::FromBrowser(browser()->GetBrowserForMigrationOnly()) + ->ShowEmojiPanel(); + waiter.Wait(); + EXPECT_FALSE(IsWindowFullscreenForTabOrPending()); +} + +IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, CapturedContentEntersFullscreenWithinTab) { SetDisableFullscreenWithinTab(false); // Simulate tab capture, as used by getDisplayMedia() content sharing. diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index f46ffa0..14ee3061 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -5792,6 +5792,15 @@ } void BrowserView::ShowEmojiPanel() { + // Unlike modal dialogs (which drop fullscreen via SetWebContentsBlocked), + // the emoji panel is non-modal UI that can interfere with the fullscreen + // bubble. Drop fullscreen when showing the emoji panel to prevent UI + // spoofing. + if (content::WebContents* web_contents = GetActiveWebContents()) { + if (!web_contents->ForSecurityDropFullscreen(display::kInvalidDisplayId)) { + return; + } + } GetWidget()->ShowEmojiPanel(); }
Loading diff…
Regression Test / PoC
shipped with the fix
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc
index f5c1ba5..c339bf7 100644
--- a/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc
+++ b/chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc
@@ -948,6 +948,18 @@
}
IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest,
+ ShowEmojiPanelExitsFullscreen) {
+ ASSERT_NO_FATAL_FAILURE(ToggleTabFullscreen(true));
+ ASSERT_TRUE(IsWindowFullscreenForTabOrPending());
+
+ ui_test_utils::FullscreenWaiter waiter(browser(), {.tab_fullscreen = false});
+ BrowserWindow::FromBrowser(browser()->GetBrowserForMigrationOnly())
+ ->ShowEmojiPanel();
+ waiter.Wait();
+ EXPECT_FALSE(IsWindowFullscreenForTabOrPending());
+}
+
+IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest,
CapturedContentEntersFullscreenWithinTab) {
SetDisableFullscreenWithinTab(false);
// Simulate tab capture, as used by getDisplayMedia() content sharing.
Loading diff…
Original Bug Report
reported by [email protected]
Issue 1170584: UI/URL Spoofing by putting the page into fullscreen when a user opens the emoji dialog
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36
Steps to reproduce the problem: https://crbug.com/chromium/1170584: UI/URL Spoofing by putting the page into fullscreen when a user opens the emoji dialog is not resolved
What is the expected behavior?
What went wrong? UI/URL Spoofing by putting the page into fullscreen when a user opens the emoji dialog is not resolved in new version
Did this work before? N/A
Chrome version: 98.0.4758.82 Channel: n/a OS Version: 10.0
References
On This Page