|
1 Index: firefox-91.0.2/dom/xul/XULPopupElement.cpp |
|
2 =================================================================== |
|
3 --- firefox-91.0.2.orig/dom/xul/XULPopupElement.cpp |
|
4 +++ firefox-91.0.2/dom/xul/XULPopupElement.cpp |
|
5 @@ -271,8 +271,7 @@ already_AddRefed<DOMRect> XULPopupElemen |
|
6 // For native menus we can't query the true size. Use the anchor rect |
|
7 // instead, which at least has the position at which we were intending to |
|
8 // open the menu. |
|
9 - screenRect = Some(CSSRect( |
|
10 - CSSIntRect::FromUnknownRect(menuPopupFrame->GetScreenAnchorRect()))); |
|
11 + screenRect = Some(CSSRect(menuPopupFrame->GetScreenAnchorRect())); |
|
12 } else { |
|
13 // For non-native menus, query the bounds from the widget. |
|
14 if (nsView* view = menuPopupFrame->GetView()) { |
|
15 Index: firefox-91.0.2/layout/xul/nsMenuPopupFrame.h |
|
16 =================================================================== |
|
17 --- firefox-91.0.2.orig/layout/xul/nsMenuPopupFrame.h |
|
18 +++ firefox-91.0.2/layout/xul/nsMenuPopupFrame.h |
|
19 @@ -321,7 +321,7 @@ class nsMenuPopupFrame final : public ns |
|
20 // If aUpdateAttrs is true, and the popup already has left or top attributes, |
|
21 // then those attributes are updated to the new location. |
|
22 // The frame may be destroyed by this method. |
|
23 - void MoveTo(const mozilla::CSSIntPoint& aPos, bool aUpdateAttrs); |
|
24 + void MoveTo(const mozilla::CSSPoint& aPos, bool aUpdateAttrs); |
|
25 |
|
26 void MoveToAnchor(nsIContent* aAnchorContent, const nsAString& aPosition, |
|
27 int32_t aXPos, int32_t aYPos, bool aAttributesOverride); |
|
28 @@ -370,7 +370,9 @@ class nsMenuPopupFrame final : public ns |
|
29 |
|
30 // Return the screen coordinates in CSS pixels of the popup, |
|
31 // or (-1, -1, 0, 0) if anchored. |
|
32 - nsIntRect GetScreenAnchorRect() const { return mScreenRect; } |
|
33 + mozilla::CSSIntRect GetScreenAnchorRect() const { |
|
34 + return mozilla::CSSRect::FromAppUnitsRounded(mScreenRect); |
|
35 + } |
|
36 |
|
37 mozilla::LayoutDeviceIntPoint GetLastClientOffset() const { |
|
38 return mLastClientOffset; |
|
39 @@ -557,7 +559,7 @@ class nsMenuPopupFrame final : public ns |
|
40 // override mXPos and mYPos. |
|
41 int32_t mXPos; |
|
42 int32_t mYPos; |
|
43 - nsIntRect mScreenRect; |
|
44 + nsRect mScreenRect; |
|
45 // Used for store rectangle which the popup is going to be anchored to, |
|
46 // we need that for Wayland |
|
47 #ifdef MOZ_WAYLAND |
|
48 Index: firefox-91.0.2/layout/xul/nsMenuPopupFrame.cpp |
|
49 =================================================================== |
|
50 --- firefox-91.0.2.orig/layout/xul/nsMenuPopupFrame.cpp |
|
51 +++ firefox-91.0.2/layout/xul/nsMenuPopupFrame.cpp |
|
52 @@ -868,8 +868,9 @@ void nsMenuPopupFrame::InitializePopup(n |
|
53 InitPositionFromAnchorAlign(anchor, align); |
|
54 } |
|
55 } |
|
56 - |
|
57 - mScreenRect = nsIntRect(-1, -1, 0, 0); |
|
58 + // When converted back to CSSIntRect it is (-1, -1, 0, 0) - as expected in |
|
59 + // nsXULPopupManager::Rollup |
|
60 + mScreenRect = nsRect(-AppUnitsPerCSSPixel(), -AppUnitsPerCSSPixel(), 0, 0); |
|
61 |
|
62 if (aAttributesOverride) { |
|
63 // Use |left| and |top| dimension attributes to position the popup if |
|
64 @@ -881,11 +882,13 @@ void nsMenuPopupFrame::InitializePopup(n |
|
65 nsresult err; |
|
66 if (!left.IsEmpty()) { |
|
67 int32_t x = left.ToInteger(&err); |
|
68 - if (NS_SUCCEEDED(err)) mScreenRect.x = x; |
|
69 + if (NS_SUCCEEDED(err)) |
|
70 + mScreenRect.x = nsPresContext::CSSPixelsToAppUnits(x); |
|
71 } |
|
72 if (!top.IsEmpty()) { |
|
73 int32_t y = top.ToInteger(&err); |
|
74 - if (NS_SUCCEEDED(err)) mScreenRect.y = y; |
|
75 + if (NS_SUCCEEDED(err)) |
|
76 + mScreenRect.y = nsPresContext::CSSPixelsToAppUnits(y); |
|
77 } |
|
78 } |
|
79 } |
|
80 @@ -900,7 +903,8 @@ void nsMenuPopupFrame::InitializePopupAt |
|
81 mPopupState = ePopupShowing; |
|
82 mAnchorContent = nullptr; |
|
83 mTriggerContent = aTriggerContent; |
|
84 - mScreenRect = nsIntRect(aXPos, aYPos, 0, 0); |
|
85 + mScreenRect = nsRect(nsPresContext::CSSPixelsToAppUnits(aXPos), |
|
86 + nsPresContext::CSSPixelsToAppUnits(aYPos), 0, 0); |
|
87 mXPos = 0; |
|
88 mYPos = 0; |
|
89 mFlip = FlipType_Default; |
|
90 @@ -920,7 +924,8 @@ void nsMenuPopupFrame::InitializePopupAs |
|
91 mTriggerContent = aTriggerContent; |
|
92 mPopupState = ePopupShowing; |
|
93 mAnchorContent = nullptr; |
|
94 - mScreenRect = nsIntRect(aXPos, aYPos, 0, 0); |
|
95 + mScreenRect = nsRect(nsPresContext::CSSPixelsToAppUnits(aXPos), |
|
96 + nsPresContext::CSSPixelsToAppUnits(aYPos), 0, 0); |
|
97 mXPos = 0; |
|
98 mYPos = 0; |
|
99 mFlip = FlipType_Default; |
|
100 @@ -941,7 +946,7 @@ void nsMenuPopupFrame::InitializePopupAt |
|
101 bool aAttributesOverride) { |
|
102 InitializePopup(nullptr, aTriggerContent, aPosition, 0, 0, |
|
103 MenuPopupAnchorType_Rect, aAttributesOverride); |
|
104 - mScreenRect = aRect; |
|
105 + mScreenRect = ToAppUnits(aRect, AppUnitsPerCSSPixel()); |
|
106 } |
|
107 |
|
108 void nsMenuPopupFrame::ShowPopup(bool aIsContextMenu) { |
|
109 @@ -1430,7 +1435,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit |
|
110 // If anchored to a rectangle, use that rectangle. Otherwise, determine the |
|
111 // rectangle from the anchor. |
|
112 if (mAnchorType == MenuPopupAnchorType_Rect) { |
|
113 - anchorRect = ToAppUnits(mScreenRect, AppUnitsPerCSSPixel()); |
|
114 + anchorRect = mScreenRect; |
|
115 } else { |
|
116 // if the frame is not specified, use the anchor node passed to OpenPopup. |
|
117 // If that wasn't specified either, use the root frame. Note that |
|
118 @@ -1539,10 +1544,8 @@ nsresult nsMenuPopupFrame::SetPopupPosit |
|
119 // Account for the margin that will end up being added to the screen |
|
120 // coordinate the next time SetPopupPosition is called. |
|
121 mAnchorType = MenuPopupAnchorType_Point; |
|
122 - mScreenRect.x = |
|
123 - nsPresContext::AppUnitsToIntCSSPixels(screenPoint.x - margin.left); |
|
124 - mScreenRect.y = |
|
125 - nsPresContext::AppUnitsToIntCSSPixels(screenPoint.y - margin.top); |
|
126 + mScreenRect.x = screenPoint.x - margin.left; |
|
127 + mScreenRect.y = screenPoint.y - margin.top; |
|
128 } |
|
129 } else { |
|
130 // The popup is positioned at a screen coordinate. |
|
131 @@ -1571,10 +1574,8 @@ nsresult nsMenuPopupFrame::SetPopupPosit |
|
132 } |
|
133 |
|
134 // next, convert into app units accounting for the zoom |
|
135 - screenPoint.x = presContext->DevPixelsToAppUnits( |
|
136 - nsPresContext::CSSPixelsToAppUnits(mScreenRect.x) / factor); |
|
137 - screenPoint.y = presContext->DevPixelsToAppUnits( |
|
138 - nsPresContext::CSSPixelsToAppUnits(mScreenRect.y) / factor); |
|
139 + screenPoint.x = presContext->DevPixelsToAppUnits(mScreenRect.x / factor); |
|
140 + screenPoint.y = presContext->DevPixelsToAppUnits(mScreenRect.y / factor); |
|
141 anchorRect = nsRect(screenPoint, nsSize(0, 0)); |
|
142 |
|
143 // add the margins on the popup |
|
144 @@ -2377,9 +2378,10 @@ void nsMenuPopupFrame::DestroyFrom(nsIFr |
|
145 nsBoxFrame::DestroyFrom(aDestructRoot, aPostDestroyData); |
|
146 } |
|
147 |
|
148 -void nsMenuPopupFrame::MoveTo(const CSSIntPoint& aPos, bool aUpdateAttrs) { |
|
149 +void nsMenuPopupFrame::MoveTo(const CSSPoint& aPos, bool aUpdateAttrs) { |
|
150 nsIWidget* widget = GetWidget(); |
|
151 - if ((mScreenRect.x == aPos.x && mScreenRect.y == aPos.y) && |
|
152 + nsPoint appUnitsPos = mozilla::CSSPixel::ToAppUnits(aPos); |
|
153 + if ((mScreenRect.x == appUnitsPos.x && mScreenRect.y == appUnitsPos.y) && |
|
154 (!widget || widget->GetClientOffset() == mLastClientOffset)) { |
|
155 return; |
|
156 } |
|
157 @@ -2400,8 +2402,8 @@ void nsMenuPopupFrame::MoveTo(const CSSI |
|
158 } |
|
159 |
|
160 mAnchorType = MenuPopupAnchorType_Point; |
|
161 - mScreenRect.x = aPos.x - nsPresContext::AppUnitsToIntCSSPixels(margin.left); |
|
162 - mScreenRect.y = aPos.y - nsPresContext::AppUnitsToIntCSSPixels(margin.top); |
|
163 + mScreenRect.x = appUnitsPos.x - margin.left; |
|
164 + mScreenRect.y = appUnitsPos.y - margin.top; |
|
165 |
|
166 SetPopupPosition(nullptr, true, false); |
|
167 |
|
168 @@ -2409,8 +2411,8 @@ void nsMenuPopupFrame::MoveTo(const CSSI |
|
169 if (aUpdateAttrs && (popup->HasAttr(kNameSpaceID_None, nsGkAtoms::left) || |
|
170 popup->HasAttr(kNameSpaceID_None, nsGkAtoms::top))) { |
|
171 nsAutoString left, top; |
|
172 - left.AppendInt(aPos.x); |
|
173 - top.AppendInt(aPos.y); |
|
174 + left.AppendInt(RoundedToInt(aPos).x); |
|
175 + top.AppendInt(RoundedToInt(aPos).y); |
|
176 popup->SetAttr(kNameSpaceID_None, nsGkAtoms::left, left, false); |
|
177 popup->SetAttr(kNameSpaceID_None, nsGkAtoms::top, top, false); |
|
178 } |
|
179 Index: firefox-91.0.2/layout/xul/nsXULPopupManager.cpp |
|
180 =================================================================== |
|
181 --- firefox-91.0.2.orig/layout/xul/nsXULPopupManager.cpp |
|
182 +++ firefox-91.0.2/layout/xul/nsXULPopupManager.cpp |
|
183 @@ -269,8 +269,7 @@ bool nsXULPopupManager::Rollup(uint32_t |
|
184 if (popupFrame->IsAnchored()) { |
|
185 // Check if the popup has a screen anchor rectangle. If not, get the |
|
186 // rectangle from the anchor element. |
|
187 - anchorRect = |
|
188 - CSSIntRect::FromUnknownRect(popupFrame->GetScreenAnchorRect()); |
|
189 + anchorRect = popupFrame->GetScreenAnchorRect(); |
|
190 if (anchorRect.x == -1 || anchorRect.y == -1) { |
|
191 nsCOMPtr<nsIContent> anchor = popupFrame->GetAnchor(); |
|
192 |
|
193 @@ -507,7 +506,7 @@ void nsXULPopupManager::PopupMoved(nsIFr |
|
194 } else { |
|
195 CSSPoint cssPos = LayoutDeviceIntPoint::FromUnknownPoint(aPnt) / |
|
196 menuPopupFrame->PresContext()->CSSToDevPixelScale(); |
|
197 - menuPopupFrame->MoveTo(RoundedToInt(cssPos), false); |
|
198 + menuPopupFrame->MoveTo(cssPos, false); |
|
199 } |
|
200 } |
|
201 |