diff --git a/layout/xul/nsMenuPopupFrame.cpp b/layout/xul/nsMenuPopupFrame.cpp index d48599b70124..ab7c30629253 100644 --- a/layout/xul/nsMenuPopupFrame.cpp +++ b/layout/xul/nsMenuPopupFrame.cpp @@ -819,7 +819,6 @@ void nsMenuPopupFrame::InitializePopup(nsIContent* aAnchorContent, mHFlip = false; mAlignmentOffset = 0; mPositionedOffset = 0; - mPositionedByMoveToRect = false; mAnchorType = aAnchorType; @@ -1538,16 +1537,12 @@ nsresult nsMenuPopupFrame::SetPopupPosition(nsIFrame* aAnchorFrame, // tell us which axis the popup is flush against in case we have to move // it around later. The AdjustPositionForAnchorAlign method accounts for // the popup's margin. - if (!mPositionedByMoveToRect) { - mUntransformedAnchorRect = anchorRect; - } + mUntransformedAnchorRect = anchorRect; screenPoint = AdjustPositionForAnchorAlign(anchorRect, hFlip, vFlip); } else { // with no anchor, the popup is positioned relative to the root frame anchorRect = rootScreenRect; - if (!mPositionedByMoveToRect) { - mUntransformedAnchorRect = anchorRect; - } + mUntransformedAnchorRect = anchorRect; screenPoint = anchorRect.TopLeft() + nsPoint(margin.left, margin.top); } @@ -1584,9 +1579,7 @@ nsresult nsMenuPopupFrame::SetPopupPosition(nsIFrame* aAnchorFrame, } else { screenPoint = mScreenRect.TopLeft(); anchorRect = nsRect(screenPoint, nsSize()); - if (!mPositionedByMoveToRect) { - mUntransformedAnchorRect = anchorRect; - } + mUntransformedAnchorRect = anchorRect; // Right-align RTL context menus, and apply margin and offsets as per the // platform conventions. @@ -2415,8 +2408,7 @@ nsMargin nsMenuPopupFrame::GetMargin() const { return margin; } -void nsMenuPopupFrame::MoveTo(const CSSPoint& aPos, bool aUpdateAttrs, - bool aByMoveToRect) { +void nsMenuPopupFrame::MoveTo(const CSSPoint& aPos, bool aUpdateAttrs) { nsIWidget* widget = GetWidget(); nsPoint appUnitsPos = CSSPixel::ToAppUnits(aPos); @@ -2441,7 +2433,6 @@ void nsMenuPopupFrame::MoveTo(const CSSPoint& aPos, bool aUpdateAttrs, return; } - mPositionedByMoveToRect = aByMoveToRect; mScreenRect.MoveTo(appUnitsPos); if (mAnchorType == MenuPopupAnchorType_Rect) { // This ensures that the anchor width is still honored, to prevent it from diff --git a/layout/xul/nsMenuPopupFrame.h b/layout/xul/nsMenuPopupFrame.h index 66bbb404b52d..19a94cf1c3dc 100644 --- a/layout/xul/nsMenuPopupFrame.h +++ b/layout/xul/nsMenuPopupFrame.h @@ -318,8 +318,7 @@ class nsMenuPopupFrame final : public nsBoxFrame, // If aUpdateAttrs is true, and the popup already has left or top attributes, // then those attributes are updated to the new location. // The frame may be destroyed by this method. - void MoveTo(const mozilla::CSSPoint& aPos, bool aUpdateAttrs, - bool aByMoveToRect = false); + void MoveTo(const mozilla::CSSPoint& aPos, bool aUpdateAttrs); void MoveToAnchor(nsIContent* aAnchorContent, const nsAString& aPosition, int32_t aXPos, int32_t aYPos, bool aAttributesOverride); @@ -569,11 +568,6 @@ class nsMenuPopupFrame final : public nsBoxFrame, // without margins applied, as GTK is what takes care of determining how to // flip etc. on Wayland. nsRect mUntransformedAnchorRect; - - // Whether we were moved by the move-to-rect Wayland callback. In that case, - // we stop updating the anchor so that we can end up with a stable position. - bool mPositionedByMoveToRect = false; - // Store SizedToPopup attribute for MoveTo call to avoid // unwanted popup resize there. bool mSizedToPopup = false; diff --git a/layout/xul/nsXULPopupManager.cpp b/layout/xul/nsXULPopupManager.cpp index 2a514fbe2de3..2c66a1e0dca5 100644 --- a/layout/xul/nsXULPopupManager.cpp +++ b/layout/xul/nsXULPopupManager.cpp @@ -558,8 +558,7 @@ static nsMenuPopupFrame* GetPopupToMoveOrResize(nsIFrame* aFrame) { return menuPopupFrame; } -void nsXULPopupManager::PopupMoved(nsIFrame* aFrame, nsIntPoint aPnt, - bool aByMoveToRect) { +void nsXULPopupManager::PopupMoved(nsIFrame* aFrame, nsIntPoint aPnt) { nsMenuPopupFrame* menuPopupFrame = GetPopupToMoveOrResize(aFrame); if (!menuPopupFrame) { return; @@ -592,7 +591,7 @@ void nsXULPopupManager::PopupMoved(nsIFrame* aFrame, nsIntPoint aPnt, } else { CSSPoint cssPos = LayoutDeviceIntPoint::FromUnknownPoint(aPnt) / menuPopupFrame->PresContext()->CSSToDevPixelScale(); - menuPopupFrame->MoveTo(cssPos, false, aByMoveToRect); + menuPopupFrame->MoveTo(cssPos, false); } } diff --git a/layout/xul/nsXULPopupManager.h b/layout/xul/nsXULPopupManager.h index f50394e21f40..c3395b2bb13e 100644 --- a/layout/xul/nsXULPopupManager.h +++ b/layout/xul/nsXULPopupManager.h @@ -659,9 +659,9 @@ class nsXULPopupManager final : public nsIDOMEventListener, /** * Indicate that the popup associated with aView has been moved to the - * specified screen coordinates. + * specified screen coordiates. */ - void PopupMoved(nsIFrame* aFrame, nsIntPoint aPoint, bool aByMoveToRect); + void PopupMoved(nsIFrame* aFrame, nsIntPoint aPoint); /** * Indicate that the popup associated with aView has been resized to the diff --git a/view/nsView.cpp b/view/nsView.cpp index 28aecf9ff437..a1cdea2b6740 100644 --- a/view/nsView.cpp +++ b/view/nsView.cpp @@ -919,12 +919,10 @@ static bool IsPopupWidget(nsIWidget* aWidget) { PresShell* nsView::GetPresShell() { return GetViewManager()->GetPresShell(); } -bool nsView::WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y, - ByMoveToRect aByMoveToRect) { +bool nsView::WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y) { nsXULPopupManager* pm = nsXULPopupManager::GetInstance(); if (pm && IsPopupWidget(aWidget)) { - pm->PopupMoved(mFrame, nsIntPoint(x, y), - aByMoveToRect == ByMoveToRect::Yes); + pm->PopupMoved(mFrame, nsIntPoint(x, y)); return true; } diff --git a/view/nsView.h b/view/nsView.h index d45fa678d152..cac279047c66 100644 --- a/view/nsView.h +++ b/view/nsView.h @@ -444,8 +444,7 @@ class nsView final : public nsIWidgetListener { // nsIWidgetListener virtual mozilla::PresShell* GetPresShell() override; virtual nsView* GetView() override { return this; } - virtual bool WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y, - ByMoveToRect) override; + virtual bool WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y) override; virtual bool WindowResized(nsIWidget* aWidget, int32_t aWidth, int32_t aHeight) override; #if defined(MOZ_WIDGET_ANDROID) diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp index 81eb9e737395..d969a7578b06 100644 --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -1897,7 +1897,12 @@ void nsWindow::WaylandPopupPropagateChangesToLayout(bool aMove, bool aResize) { } if (aMove) { LOG(" needPositionUpdate, bounds [%d, %d]", mBounds.x, mBounds.y); - NotifyWindowMoved(mBounds.x, mBounds.y, ByMoveToRect::Yes); + NotifyWindowMoved(mBounds.x, mBounds.y); + if (nsMenuPopupFrame* popupFrame = GetMenuPopupFrame(GetFrame())) { + auto p = CSSIntPoint::Round( + mBounds.TopLeft() / popupFrame->PresContext()->CSSToDevPixelScale()); + popupFrame->MoveTo(p, true); + } } } diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp index 8800c7d5b562..e0c4b7d63d41 100644 --- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -1641,10 +1641,9 @@ void nsBaseWidget::NotifyWindowDestroyed() { } } -void nsBaseWidget::NotifyWindowMoved(int32_t aX, int32_t aY, - ByMoveToRect aByMoveToRect) { +void nsBaseWidget::NotifyWindowMoved(int32_t aX, int32_t aY) { if (mWidgetListener) { - mWidgetListener->WindowMoved(this, aX, aY, aByMoveToRect); + mWidgetListener->WindowMoved(this, aX, aY); } if (mIMEHasFocus && IMENotificationRequestsRef().WantPositionChanged()) { diff --git a/widget/nsBaseWidget.h b/widget/nsBaseWidget.h index eb188356a0bd..cf42a3480245 100644 --- a/widget/nsBaseWidget.h +++ b/widget/nsBaseWidget.h @@ -355,10 +355,7 @@ class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference { void NotifyWindowDestroyed(); void NotifySizeMoveDone(); - - using ByMoveToRect = nsIWidgetListener::ByMoveToRect; - void NotifyWindowMoved(int32_t aX, int32_t aY, - ByMoveToRect = ByMoveToRect::No); + void NotifyWindowMoved(int32_t aX, int32_t aY); void SetNativeData(uint32_t aDataType, uintptr_t aVal) override {} diff --git a/widget/nsIWidgetListener.cpp b/widget/nsIWidgetListener.cpp index c96baa4a7309..b7f9fb335632 100644 --- a/widget/nsIWidgetListener.cpp +++ b/widget/nsIWidgetListener.cpp @@ -21,8 +21,8 @@ nsView* nsIWidgetListener::GetView() { return nullptr; } PresShell* nsIWidgetListener::GetPresShell() { return nullptr; } -bool nsIWidgetListener::WindowMoved(nsIWidget* aWidget, int32_t aX, int32_t aY, - ByMoveToRect) { +bool nsIWidgetListener::WindowMoved(nsIWidget* aWidget, int32_t aX, + int32_t aY) { return false; } diff --git a/widget/nsIWidgetListener.h b/widget/nsIWidgetListener.h index 3a8f5d2dafa4..878f3cb6754f 100644 --- a/widget/nsIWidgetListener.h +++ b/widget/nsIWidgetListener.h @@ -65,9 +65,7 @@ class nsIWidgetListener { * Called when a window is moved to location (x, y). Returns true if the * notification was handled. Coordinates are outer window screen coordinates. */ - enum class ByMoveToRect : bool { No, Yes }; - virtual bool WindowMoved(nsIWidget* aWidget, int32_t aX, int32_t aY, - ByMoveToRect); + virtual bool WindowMoved(nsIWidget* aWidget, int32_t aX, int32_t aY); /** * Called when a window is resized to (width, height). Returns true if the diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp index 9569d44b1875..19f371d10587 100644 --- a/xpfe/appshell/AppWindow.cpp +++ b/xpfe/appshell/AppWindow.cpp @@ -113,8 +113,11 @@ using dom::AutoNoJSAPI; using dom::BrowserHost; using dom::BrowsingContext; using dom::Document; +using dom::DocumentL10n; using dom::Element; using dom::EventTarget; +using dom::LoadURIOptions; +using dom::Promise; AppWindow::AppWindow(uint32_t aChromeFlags) : mChromeTreeOwner(nullptr), @@ -3327,8 +3330,7 @@ PresShell* AppWindow::WidgetListenerDelegate::GetPresShell() { } bool AppWindow::WidgetListenerDelegate::WindowMoved(nsIWidget* aWidget, - int32_t aX, int32_t aY, - ByMoveToRect) { + int32_t aX, int32_t aY) { RefPtr holder = mAppWindow; return holder->WindowMoved(aWidget, aX, aY); } diff --git a/xpfe/appshell/AppWindow.h b/xpfe/appshell/AppWindow.h index 4ae07d226ac3..d089f7156715 100644 --- a/xpfe/appshell/AppWindow.h +++ b/xpfe/appshell/AppWindow.h @@ -91,8 +91,7 @@ class AppWindow final : public nsIBaseWindow, MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual mozilla::PresShell* GetPresShell() override; MOZ_CAN_RUN_SCRIPT_BOUNDARY - virtual bool WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y, - ByMoveToRect) override; + virtual bool WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y) override; MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual bool WindowResized(nsIWidget* aWidget, int32_t aWidth, int32_t aHeight) override;