From e208782cd3644510aeedee12aa27abef069aecbd Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Fri, 20 Dec 2024 22:12:06 +0000 Subject: [PATCH] Bug 1778923, set pointer-events: none; on xul:browser when select popup is open, r=edgar,emilio,desktop-theme-reviewers Differential Revision: https://phabricator.services.mozilla.com/D232557 --- dom/events/EventStateManager.cpp | 15 ++++++++++++++- toolkit/actors/SelectParent.sys.mjs | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index 2f453aba9b51..2b0634bb03b0 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -1923,7 +1923,20 @@ static void DispatchCrossProcessMouseExitEvents(WidgetMouseEvent* aMouseEvent, mouseExitEvent->mExitFrom = Some(aIsReallyExit ? WidgetMouseEvent::ePuppet : WidgetMouseEvent::ePuppetParentToPuppetChild); - aRemoteTarget->SendRealMouseEvent(*mouseExitEvent); + + auto ContentReactsToPointerEvents = [](BrowserParent* aRemoteTarget) { + if (Element* owner = aRemoteTarget->GetOwnerElement()) { + if (nsSubDocumentFrame* subDocFrame = + do_QueryFrame(owner->GetPrimaryFrame())) { + return subDocFrame->ContentReactsToPointerEvents(); + } + } + return true; + }; + + if (ContentReactsToPointerEvents(aRemoteTarget)) { + aRemoteTarget->SendRealMouseEvent(*mouseExitEvent); + } aRemoteTarget = GetBrowserParentAncestor(aRemoteTarget); } diff --git a/toolkit/actors/SelectParent.sys.mjs b/toolkit/actors/SelectParent.sys.mjs index 2db3e3250c0d..3e1d4b73b3d8 100644 --- a/toolkit/actors/SelectParent.sys.mjs +++ b/toolkit/actors/SelectParent.sys.mjs @@ -319,6 +319,7 @@ export var SelectParentHelper = { let win = menulist.ownerGlobal; if (browser) { browser.constrainPopup(menupopup); + browser.style.pointerEvents = "none"; } else { menupopup.setConstraintRect(new win.DOMRect(0, 0, 0, 0)); } @@ -405,7 +406,10 @@ export var SelectParentHelper = { let popup = event.target; this._unregisterListeners(popup); popup.parentNode.hidden = true; - this._currentBrowser = null; + if (this._currentBrowser) { + this._currentBrowser.style.pointerEvents = ""; + this._currentBrowser = null; + } this._currentMenulist = null; this._selectRect = null; this._currentZoom = 1;