[tbb-commits] [tor-browser] 42/73: Bug 1787684. Only return views with widgets from FindFloatingViewContaining. r=emilio, a=RyanVM
gitolite role
git at cupani.torproject.org
Wed Sep 21 20:17:35 UTC 2022
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch geckoview-102.3.0esr-12.0-1
in repository tor-browser.
commit 3be2527950f266f76f9f3c31cbe34df813e6270e
Author: Timothy Nikkel <tnikkel at gmail.com>
AuthorDate: Mon Aug 29 09:58:11 2022 +0000
Bug 1787684. Only return views with widgets from FindFloatingViewContaining. r=emilio, a=RyanVM
The code that bug 1754436 deleted checked to make sure there was a widget for the returned view, but it looks like it's possible in some edge cases to have an open popup that doesn't have a widget (most likely just for a split second). We need a widget to dispatch the event, and if it doesn't have a widget it's not visible so no point in touching it at all anyways.
Differential Revision: https://phabricator.services.mozilla.com/D155819
---
layout/base/PresShell.cpp | 5 +++--
layout/base/nsLayoutUtils.cpp | 17 +++++++++++++----
layout/base/nsLayoutUtils.h | 7 ++++++-
3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp
index 51da6729aacfc..8cecd2497fc33 100644
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -5635,8 +5635,9 @@ void PresShell::SynthesizeMouseMove(bool aFromScroll) {
static nsView* FindFloatingViewContaining(nsPresContext* aRootPresContext,
nsIWidget* aRootWidget,
const LayoutDeviceIntPoint& aPt) {
- nsIFrame* popupFrame =
- nsLayoutUtils::GetPopupFrameForPoint(aRootPresContext, aRootWidget, aPt);
+ nsIFrame* popupFrame = nsLayoutUtils::GetPopupFrameForPoint(
+ aRootPresContext, aRootWidget, aPt,
+ nsLayoutUtils::GetPopupFrameForPointFlags::OnlyReturnFramesWithWidgets);
return popupFrame ? popupFrame->GetView() : nullptr;
}
diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp
index d9d8036382d5d..4cae8e948de7b 100644
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -1756,7 +1756,8 @@ nsIFrame* nsLayoutUtils::GetPopupFrameForEventCoordinates(
nsIFrame* nsLayoutUtils::GetPopupFrameForPoint(
nsPresContext* aRootPresContext, nsIWidget* aWidget,
- const mozilla::LayoutDeviceIntPoint& aPoint) {
+ const mozilla::LayoutDeviceIntPoint& aPoint,
+ GetPopupFrameForPointFlags aFlags /* = GetPopupFrameForPointFlags(0) */) {
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
if (!pm) {
return nullptr;
@@ -1765,11 +1766,19 @@ nsIFrame* nsLayoutUtils::GetPopupFrameForPoint(
pm->GetVisiblePopups(popups);
// Search from top to bottom
for (nsIFrame* popup : popups) {
- if (popup->PresContext()->GetRootPresContext() == aRootPresContext &&
- popup->ScrollableOverflowRect().Contains(GetEventCoordinatesRelativeTo(
+ if (popup->PresContext()->GetRootPresContext() != aRootPresContext) {
+ continue;
+ }
+ if (!popup->ScrollableOverflowRect().Contains(GetEventCoordinatesRelativeTo(
aWidget, aPoint, RelativeTo{popup}))) {
- return popup;
+ continue;
+ }
+ if (aFlags & GetPopupFrameForPointFlags::OnlyReturnFramesWithWidgets) {
+ if (!popup->HasView() || !popup->GetView()->HasWidget()) {
+ continue;
+ }
}
+ return popup;
}
return nullptr;
}
diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h
index e4ed53fea274a..fef3dd5329a71 100644
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -750,9 +750,13 @@ class nsLayoutUtils {
* @return Null, if there is no popup frame at the point, otherwise,
* returns top-most popup frame at the point.
*/
+ enum class GetPopupFrameForPointFlags : uint8_t {
+ OnlyReturnFramesWithWidgets = 0x1,
+ };
static nsIFrame* GetPopupFrameForPoint(
nsPresContext* aRootPresContext, nsIWidget* aWidget,
- const mozilla::LayoutDeviceIntPoint& aPoint);
+ const mozilla::LayoutDeviceIntPoint& aPoint,
+ GetPopupFrameForPointFlags aFlags = GetPopupFrameForPointFlags(0));
/**
* Get container and offset if aEvent collapses Selection.
@@ -3018,6 +3022,7 @@ class nsLayoutUtils {
};
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(nsLayoutUtils::PaintFrameFlags)
+MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(nsLayoutUtils::GetPopupFrameForPointFlags)
template <typename PointType, typename RectType, typename CoordType>
/* static */ bool nsLayoutUtils::PointIsCloserToRect(
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the tbb-commits
mailing list