summaryrefslogtreecommitdiff
path: root/mozilla-1708709.patch
diff options
context:
space:
mode:
Diffstat (limited to 'mozilla-1708709.patch')
-rw-r--r--mozilla-1708709.patch240
1 files changed, 240 insertions, 0 deletions
diff --git a/mozilla-1708709.patch b/mozilla-1708709.patch
new file mode 100644
index 0000000..8ee1b35
--- /dev/null
+++ b/mozilla-1708709.patch
@@ -0,0 +1,240 @@
+diff -up firefox-92.0/dom/xul/XULPopupElement.cpp.1708709 firefox-92.0/dom/xul/XULPopupElement.cpp
+--- firefox-92.0/dom/xul/XULPopupElement.cpp.1708709 2021-09-01 19:14:41.000000000 +0200
++++ firefox-92.0/dom/xul/XULPopupElement.cpp 2021-09-07 10:33:55.686223973 +0200
+@@ -271,8 +271,7 @@ already_AddRefed<DOMRect> XULPopupElemen
+ // For native menus we can't query the true size. Use the anchor rect
+ // instead, which at least has the position at which we were intending to
+ // open the menu.
+- screenRect = Some(CSSRect(
+- CSSIntRect::FromUnknownRect(menuPopupFrame->GetScreenAnchorRect())));
++ screenRect = Some(CSSRect(menuPopupFrame->GetScreenAnchorRect()));
+ } else {
+ // For non-native menus, query the bounds from the widget.
+ if (nsView* view = menuPopupFrame->GetView()) {
+diff -up firefox-92.0/layout/xul/nsMenuPopupFrame.cpp.1708709 firefox-92.0/layout/xul/nsMenuPopupFrame.cpp
+--- firefox-92.0/layout/xul/nsMenuPopupFrame.cpp.1708709 2021-09-01 19:15:06.000000000 +0200
++++ firefox-92.0/layout/xul/nsMenuPopupFrame.cpp 2021-09-07 10:33:55.686223973 +0200
+@@ -868,8 +868,9 @@ void nsMenuPopupFrame::InitializePopup(n
+ InitPositionFromAnchorAlign(anchor, align);
+ }
+ }
+-
+- mScreenRect = nsIntRect(-1, -1, 0, 0);
++ // When converted back to CSSIntRect it is (-1, -1, 0, 0) - as expected in
++ // nsXULPopupManager::Rollup
++ mScreenRect = nsRect(-AppUnitsPerCSSPixel(), -AppUnitsPerCSSPixel(), 0, 0);
+
+ if (aAttributesOverride) {
+ // Use |left| and |top| dimension attributes to position the popup if
+@@ -881,11 +882,15 @@ void nsMenuPopupFrame::InitializePopup(n
+ nsresult err;
+ if (!left.IsEmpty()) {
+ int32_t x = left.ToInteger(&err);
+- if (NS_SUCCEEDED(err)) mScreenRect.x = x;
++ if (NS_SUCCEEDED(err)) {
++ mScreenRect.x = CSSPixel::ToAppUnits(x);
++ }
+ }
+ if (!top.IsEmpty()) {
+ int32_t y = top.ToInteger(&err);
+- if (NS_SUCCEEDED(err)) mScreenRect.y = y;
++ if (NS_SUCCEEDED(err)) {
++ mScreenRect.y = CSSPixel::ToAppUnits(y);
++ }
+ }
+ }
+ }
+@@ -900,7 +905,8 @@ void nsMenuPopupFrame::InitializePopupAt
+ mPopupState = ePopupShowing;
+ mAnchorContent = nullptr;
+ mTriggerContent = aTriggerContent;
+- mScreenRect = nsIntRect(aXPos, aYPos, 0, 0);
++ mScreenRect =
++ nsRect(CSSPixel::ToAppUnits(aXPos), CSSPixel::ToAppUnits(aYPos), 0, 0);
+ mXPos = 0;
+ mYPos = 0;
+ mFlip = FlipType_Default;
+@@ -920,7 +926,8 @@ void nsMenuPopupFrame::InitializePopupAs
+ mTriggerContent = aTriggerContent;
+ mPopupState = ePopupShowing;
+ mAnchorContent = nullptr;
+- mScreenRect = nsIntRect(aXPos, aYPos, 0, 0);
++ mScreenRect =
++ nsRect(CSSPixel::ToAppUnits(aXPos), CSSPixel::ToAppUnits(aYPos), 0, 0);
+ mXPos = 0;
+ mYPos = 0;
+ mFlip = FlipType_Default;
+@@ -941,7 +948,7 @@ void nsMenuPopupFrame::InitializePopupAt
+ bool aAttributesOverride) {
+ InitializePopup(nullptr, aTriggerContent, aPosition, 0, 0,
+ MenuPopupAnchorType_Rect, aAttributesOverride);
+- mScreenRect = aRect;
++ mScreenRect = ToAppUnits(aRect, AppUnitsPerCSSPixel());
+ }
+
+ void nsMenuPopupFrame::ShowPopup(bool aIsContextMenu) {
+@@ -1430,7 +1437,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit
+ // If anchored to a rectangle, use that rectangle. Otherwise, determine the
+ // rectangle from the anchor.
+ if (mAnchorType == MenuPopupAnchorType_Rect) {
+- anchorRect = ToAppUnits(mScreenRect, AppUnitsPerCSSPixel());
++ anchorRect = mScreenRect;
+ } else {
+ // if the frame is not specified, use the anchor node passed to OpenPopup.
+ // If that wasn't specified either, use the root frame. Note that
+@@ -1517,7 +1524,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit
+ // mXPos and mYPos specify an additonal offset passed to OpenPopup that
+ // should be added to the position. We also add the offset to the anchor
+ // pos so a later flip/resize takes the offset into account.
+- nscoord anchorXOffset = nsPresContext::CSSPixelsToAppUnits(mXPos);
++ nscoord anchorXOffset = CSSPixel::ToAppUnits(mXPos);
+ if (IsDirectionRTL()) {
+ screenPoint.x -= anchorXOffset;
+ anchorRect.x -= anchorXOffset;
+@@ -1525,7 +1532,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit
+ screenPoint.x += anchorXOffset;
+ anchorRect.x += anchorXOffset;
+ }
+- nscoord anchorYOffset = nsPresContext::CSSPixelsToAppUnits(mYPos);
++ nscoord anchorYOffset = CSSPixel::ToAppUnits(mYPos);
+ screenPoint.y += anchorYOffset;
+ anchorRect.y += anchorYOffset;
+
+@@ -1539,10 +1546,8 @@ nsresult nsMenuPopupFrame::SetPopupPosit
+ // Account for the margin that will end up being added to the screen
+ // coordinate the next time SetPopupPosition is called.
+ mAnchorType = MenuPopupAnchorType_Point;
+- mScreenRect.x =
+- nsPresContext::AppUnitsToIntCSSPixels(screenPoint.x - margin.left);
+- mScreenRect.y =
+- nsPresContext::AppUnitsToIntCSSPixels(screenPoint.y - margin.top);
++ mScreenRect.x = screenPoint.x - margin.left;
++ mScreenRect.y = screenPoint.y - margin.top;
+ }
+ } else {
+ // The popup is positioned at a screen coordinate.
+@@ -1557,11 +1562,11 @@ nsresult nsMenuPopupFrame::SetPopupPosit
+ if (mAdjustOffsetForContextMenu) {
+ nsPoint offsetForContextMenuDev;
+ offsetForContextMenuDev.x =
+- nsPresContext::CSSPixelsToAppUnits(LookAndFeel::GetInt(
++ CSSPixel::ToAppUnits(LookAndFeel::GetInt(
+ LookAndFeel::IntID::ContextMenuOffsetHorizontal)) /
+ factor;
+ offsetForContextMenuDev.y =
+- nsPresContext::CSSPixelsToAppUnits(LookAndFeel::GetInt(
++ CSSPixel::ToAppUnits(LookAndFeel::GetInt(
+ LookAndFeel::IntID::ContextMenuOffsetVertical)) /
+ factor;
+ offsetForContextMenu.x =
+@@ -1571,10 +1576,8 @@ nsresult nsMenuPopupFrame::SetPopupPosit
+ }
+
+ // next, convert into app units accounting for the zoom
+- screenPoint.x = presContext->DevPixelsToAppUnits(
+- nsPresContext::CSSPixelsToAppUnits(mScreenRect.x) / factor);
+- screenPoint.y = presContext->DevPixelsToAppUnits(
+- nsPresContext::CSSPixelsToAppUnits(mScreenRect.y) / factor);
++ screenPoint.x = presContext->DevPixelsToAppUnits(mScreenRect.x / factor);
++ screenPoint.y = presContext->DevPixelsToAppUnits(mScreenRect.y / factor);
+ anchorRect = nsRect(screenPoint, nsSize(0, 0));
+
+ // add the margins on the popup
+@@ -2377,9 +2380,10 @@ void nsMenuPopupFrame::DestroyFrom(nsIFr
+ nsBoxFrame::DestroyFrom(aDestructRoot, aPostDestroyData);
+ }
+
+-void nsMenuPopupFrame::MoveTo(const CSSIntPoint& aPos, bool aUpdateAttrs) {
++void nsMenuPopupFrame::MoveTo(const CSSPoint& aPos, bool aUpdateAttrs) {
+ nsIWidget* widget = GetWidget();
+- if ((mScreenRect.x == aPos.x && mScreenRect.y == aPos.y) &&
++ nsPoint appUnitsPos = CSSPixel::ToAppUnits(aPos);
++ if ((mScreenRect.x == appUnitsPos.x && mScreenRect.y == appUnitsPos.y) &&
+ (!widget || widget->GetClientOffset() == mLastClientOffset)) {
+ return;
+ }
+@@ -2393,15 +2397,15 @@ void nsMenuPopupFrame::MoveTo(const CSSI
+
+ // Workaround for bug 788189. See also bug 708278 comment #25 and following.
+ if (mAdjustOffsetForContextMenu) {
+- margin.left += nsPresContext::CSSPixelsToAppUnits(
++ margin.left += CSSPixel::ToAppUnits(
+ LookAndFeel::GetInt(LookAndFeel::IntID::ContextMenuOffsetHorizontal));
+- margin.top += nsPresContext::CSSPixelsToAppUnits(
++ margin.top += CSSPixel::ToAppUnits(
+ LookAndFeel::GetInt(LookAndFeel::IntID::ContextMenuOffsetVertical));
+ }
+
+ mAnchorType = MenuPopupAnchorType_Point;
+- mScreenRect.x = aPos.x - nsPresContext::AppUnitsToIntCSSPixels(margin.left);
+- mScreenRect.y = aPos.y - nsPresContext::AppUnitsToIntCSSPixels(margin.top);
++ mScreenRect.x = appUnitsPos.x - margin.left;
++ mScreenRect.y = appUnitsPos.y - margin.top;
+
+ SetPopupPosition(nullptr, true, false);
+
+@@ -2409,8 +2413,8 @@ void nsMenuPopupFrame::MoveTo(const CSSI
+ if (aUpdateAttrs && (popup->HasAttr(kNameSpaceID_None, nsGkAtoms::left) ||
+ popup->HasAttr(kNameSpaceID_None, nsGkAtoms::top))) {
+ nsAutoString left, top;
+- left.AppendInt(aPos.x);
+- top.AppendInt(aPos.y);
++ left.AppendInt(RoundedToInt(aPos).x);
++ top.AppendInt(RoundedToInt(aPos).y);
+ popup->SetAttr(kNameSpaceID_None, nsGkAtoms::left, left, false);
+ popup->SetAttr(kNameSpaceID_None, nsGkAtoms::top, top, false);
+ }
+diff -up firefox-92.0/layout/xul/nsMenuPopupFrame.h.1708709 firefox-92.0/layout/xul/nsMenuPopupFrame.h
+--- firefox-92.0/layout/xul/nsMenuPopupFrame.h.1708709 2021-09-01 19:15:06.000000000 +0200
++++ firefox-92.0/layout/xul/nsMenuPopupFrame.h 2021-09-07 10:46:10.360036429 +0200
+@@ -321,7 +321,7 @@ class nsMenuPopupFrame final : public ns
+ // 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::CSSIntPoint& aPos, bool aUpdateAttrs);
++ void MoveTo(const mozilla::CSSPoint& aPos, bool aUpdateAttrs);
+
+ void MoveToAnchor(nsIContent* aAnchorContent, const nsAString& aPosition,
+ int32_t aXPos, int32_t aYPos, bool aAttributesOverride);
+@@ -370,7 +370,9 @@ class nsMenuPopupFrame final : public ns
+
+ // Return the screen coordinates in CSS pixels of the popup,
+ // or (-1, -1, 0, 0) if anchored.
+- nsIntRect GetScreenAnchorRect() const { return mScreenRect; }
++ mozilla::CSSIntRect GetScreenAnchorRect() const {
++ return mozilla::CSSRect::FromAppUnitsRounded(mScreenRect);
++ }
+
+ mozilla::LayoutDeviceIntPoint GetLastClientOffset() const {
+ return mLastClientOffset;
+@@ -557,7 +559,7 @@ class nsMenuPopupFrame final : public ns
+ // override mXPos and mYPos.
+ int32_t mXPos;
+ int32_t mYPos;
+- nsIntRect mScreenRect;
++ nsRect mScreenRect;
+ // Used for store rectangle which the popup is going to be anchored to,
+ // we need that for Wayland
+ #ifdef MOZ_WAYLAND
+diff -up firefox-92.0/layout/xul/nsXULPopupManager.cpp.1708709 firefox-92.0/layout/xul/nsXULPopupManager.cpp
+--- firefox-92.0/layout/xul/nsXULPopupManager.cpp.1708709 2021-09-01 19:15:01.000000000 +0200
++++ firefox-92.0/layout/xul/nsXULPopupManager.cpp 2021-09-07 10:33:55.686223973 +0200
+@@ -343,8 +343,7 @@ bool nsXULPopupManager::Rollup(uint32_t
+ if (popupFrame->IsAnchored()) {
+ // Check if the popup has a screen anchor rectangle. If not, get the
+ // rectangle from the anchor element.
+- anchorRect =
+- CSSIntRect::FromUnknownRect(popupFrame->GetScreenAnchorRect());
++ anchorRect = popupFrame->GetScreenAnchorRect();
+ if (anchorRect.x == -1 || anchorRect.y == -1) {
+ nsCOMPtr<nsIContent> anchor = popupFrame->GetAnchor();
+
+@@ -581,7 +580,7 @@ void nsXULPopupManager::PopupMoved(nsIFr
+ } else {
+ CSSPoint cssPos = LayoutDeviceIntPoint::FromUnknownPoint(aPnt) /
+ menuPopupFrame->PresContext()->CSSToDevPixelScale();
+- menuPopupFrame->MoveTo(RoundedToInt(cssPos), false);
++ menuPopupFrame->MoveTo(cssPos, false);
+ }
+ }
+
bgstack15