Overview

Low
Severity
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactUI misrepresentation in FullScreen
DescriptionUI misrepresentation in FullScreen
ComponentFullScreen
Bug ClassLogic Error
Tracker40058710
Fix commit20d798776616 (chromium/src) +21/-0
CISA KEVNot listed
CreditedLijo A.T
Disclosed2026-09-08

Files Changed

  • chrome/browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc
  • chrome/browser/ui/views/frame/browser_view.cc
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

View on issue tracker