Bug 1358758 - Use CSSIntRect for nsIFrame::GetScreenRect. r?kats
MozReview-Commit-ID: KXPL1ERbFDa
--- a/accessible/xul/XULTreeAccessible.cpp
+++ b/accessible/xul/XULTreeAccessible.cpp
@@ -186,17 +186,17 @@ XULTreeAccessible::ChildAtPoint(int32_t
return nullptr;
nsPresContext *presContext = frame->PresContext();
nsIPresShell* presShell = presContext->PresShell();
nsIFrame *rootFrame = presShell->GetRootFrame();
NS_ENSURE_TRUE(rootFrame, nullptr);
- nsIntRect rootRect = rootFrame->GetScreenRect();
+ CSSIntRect rootRect = rootFrame->GetScreenRect();
int32_t clientX = presContext->DevPixelsToIntCSSPixels(aX) - rootRect.x;
int32_t clientY = presContext->DevPixelsToIntCSSPixels(aY) - rootRect.y;
int32_t row = -1;
nsCOMPtr<nsITreeColumn> column;
nsAutoString childEltUnused;
mTree->GetCellAt(clientX, clientY, &row, getter_AddRefs(column),
--- a/accessible/xul/XULTreeGridAccessible.cpp
+++ b/accessible/xul/XULTreeGridAccessible.cpp
@@ -320,17 +320,17 @@ XULTreeGridRowAccessible::ChildAtPoint(i
return nullptr;
nsPresContext *presContext = frame->PresContext();
nsIPresShell* presShell = presContext->PresShell();
nsIFrame *rootFrame = presShell->GetRootFrame();
NS_ENSURE_TRUE(rootFrame, nullptr);
- nsIntRect rootRect = rootFrame->GetScreenRect();
+ CSSIntRect rootRect = rootFrame->GetScreenRect();
int32_t clientX = presContext->DevPixelsToIntCSSPixels(aX) - rootRect.x;
int32_t clientY = presContext->DevPixelsToIntCSSPixels(aY) - rootRect.y;
int32_t row = -1;
nsCOMPtr<nsITreeColumn> column;
nsAutoString childEltUnused;
mTree->GetCellAt(clientX, clientY, &row, getter_AddRefs(column),
--- a/dom/events/ContentEventHandler.cpp
+++ b/dom/events/ContentEventHandler.cpp
@@ -2649,17 +2649,17 @@ ContentEventHandler::OnQueryDOMWidgetHit
nsIDocument* doc = mPresShell->GetDocument();
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
nsIFrame* docFrame = mPresShell->GetRootFrame();
NS_ENSURE_TRUE(docFrame, NS_ERROR_FAILURE);
LayoutDeviceIntPoint eventLoc =
aEvent->mRefPoint + aEvent->mWidget->WidgetToScreenOffset();
- nsIntRect docFrameRect = docFrame->GetScreenRect(); // Returns CSS pixels
+ CSSIntRect docFrameRect = docFrame->GetScreenRect();
CSSIntPoint eventLocCSS(
mPresContext->DevPixelsToIntCSSPixels(eventLoc.x) - docFrameRect.x,
mPresContext->DevPixelsToIntCSSPixels(eventLoc.y) - docFrameRect.y);
Element* contentUnderMouse =
doc->ElementFromPointHelper(eventLocCSS.x, eventLocCSS.y, false, false);
if (contentUnderMouse) {
nsIWidget* targetWidget = nullptr;
--- a/dom/events/WheelHandlingHelper.cpp
+++ b/dom/events/WheelHandlingHelper.cpp
@@ -229,18 +229,20 @@ WheelTransaction::OnEvent(WidgetEvent* a
}
return;
case eMouseMove:
case eDragOver: {
WidgetMouseEvent* mouseEvent = aEvent->AsMouseEvent();
if (mouseEvent->IsReal()) {
// If the cursor is moving to be outside the frame,
// terminate the scrollwheel transaction.
- nsIntPoint pt = GetScreenPoint(mouseEvent);
- nsIntRect r = sTargetFrame->GetScreenRect();
+ LayoutDeviceIntPoint pt = GetScreenPoint(mouseEvent);
+ auto r = LayoutDeviceIntRect::FromAppUnitsToNearest(
+ sTargetFrame->GetScreenRectInAppUnits(),
+ sTargetFrame->PresContext()->AppUnitsPerDevPixel());
if (!r.Contains(pt)) {
EndTransaction();
return;
}
// If the cursor is moving inside the frame, and it is less than
// ignoremovedelay milliseconds since the last scroll operation, ignore
// the mouse move; otherwise, record the current mouse move time to be
@@ -331,23 +333,22 @@ WheelTransaction::SetTimeout()
sTimer->Cancel();
DebugOnly<nsresult> rv =
sTimer->InitWithFuncCallback(OnTimeout, nullptr, GetTimeoutTime(),
nsITimer::TYPE_ONE_SHOT);
NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
"nsITimer::InitWithFuncCallback failed");
}
-/* static */ nsIntPoint
+/* static */ LayoutDeviceIntPoint
WheelTransaction::GetScreenPoint(WidgetGUIEvent* aEvent)
{
NS_ASSERTION(aEvent, "aEvent is null");
NS_ASSERTION(aEvent->mWidget, "aEvent-mWidget is null");
- return (aEvent->mRefPoint + aEvent->mWidget->WidgetToScreenOffset())
- .ToUnknownPoint();
+ return aEvent->mRefPoint + aEvent->mWidget->WidgetToScreenOffset();
}
/* static */ uint32_t
WheelTransaction::GetTimeoutTime()
{
return Preferences::GetUint("mousewheel.transaction.timeout", 1500);
}
--- a/dom/events/WheelHandlingHelper.h
+++ b/dom/events/WheelHandlingHelper.h
@@ -153,17 +153,17 @@ public:
protected:
static void BeginTransaction(nsIFrame* aTargetFrame,
WidgetWheelEvent* aEvent);
// Be careful, UpdateTransaction may fire a DOM event, therefore, the target
// frame might be destroyed in the event handler.
static bool UpdateTransaction(WidgetWheelEvent* aEvent);
static void MayEndTransaction();
- static nsIntPoint GetScreenPoint(WidgetGUIEvent* aEvent);
+ static LayoutDeviceIntPoint GetScreenPoint(WidgetGUIEvent* aEvent);
static void OnFailToScrollTarget();
static void OnTimeout(nsITimer* aTimer, void* aClosure);
static void SetTimeout();
static uint32_t GetIgnoreMoveDelayTime();
static int32_t GetAccelerationStart();
static int32_t GetAccelerationFactor();
static DeltaValues OverrideSystemScrollSpeed(WidgetWheelEvent* aEvent);
static double ComputeAcceleratedWheelDelta(double aDelta, int32_t aFactor);
--- a/dom/plugins/base/nsPluginInstanceOwner.cpp
+++ b/dom/plugins/base/nsPluginInstanceOwner.cpp
@@ -100,20 +100,16 @@ using namespace mozilla::dom;
#include <android/log.h>
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "GeckoPlugins" , ## args)
#endif
using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::layers;
-static inline nsPoint AsNsPoint(const nsIntPoint &p) {
- return nsPoint(p.x, p.y);
-}
-
// special class for handeling DOM context menu events because for
// some reason it starves other mouse events if implemented on the
// same class
class nsPluginDOMContextMenuListener : public nsIDOMEventListener
{
virtual ~nsPluginDOMContextMenuListener();
public:
@@ -1061,81 +1057,88 @@ NPBool nsPluginInstanceOwner::ConvertPoi
}
if (destY) {
*destY = sourceY;
}
return true;
}
nsPresContext* presContext = pluginFrame->PresContext();
- double scaleFactor = double(nsPresContext::AppUnitsPerCSSPixel())/
- presContext->DeviceContext()->AppUnitsPerDevPixelAtUnitFullZoom();
+ CSSToLayoutDeviceScale scaleFactor(
+ double(nsPresContext::AppUnitsPerCSSPixel()) /
+ presContext->DeviceContext()->AppUnitsPerDevPixelAtUnitFullZoom());
PuppetWidget *puppetWidget = static_cast<PuppetWidget*>(widget);
PuppetWidget *rootWidget = static_cast<PuppetWidget*>(widget->GetTopLevelWidget());
if (!rootWidget) {
return false;
}
- nsPoint chromeSize = AsNsPoint(rootWidget->GetChromeDimensions()) / scaleFactor;
+ CSSIntPoint chromeSize = CSSIntPoint::Truncate(
+ LayoutDeviceIntPoint::FromUnknownPoint(rootWidget->GetChromeDimensions()) /
+ scaleFactor);
nsIntSize intScreenDims = rootWidget->GetScreenDimensions();
- nsSize screenDims = nsSize(intScreenDims.width / scaleFactor,
- intScreenDims.height / scaleFactor);
+ CSSIntSize screenDims = CSSIntSize::Truncate(
+ LayoutDeviceIntSize::FromUnknownSize(intScreenDims) / scaleFactor);
int32_t screenH = screenDims.height;
- nsPoint windowPosition = AsNsPoint(rootWidget->GetWindowPosition()) / scaleFactor;
+ CSSIntPoint windowPosition = CSSIntPoint::Truncate(
+ LayoutDeviceIntPoint::FromUnknownPoint(rootWidget->GetWindowPosition()) /
+ scaleFactor);
// Window size is tab size + chrome size.
LayoutDeviceIntRect tabContentBounds = puppetWidget->GetBounds();
- tabContentBounds.ScaleInverseRoundOut(scaleFactor);
+ tabContentBounds.ScaleInverseRoundOut(scaleFactor.scale);
int32_t windowH = tabContentBounds.height + int(chromeSize.y);
- nsPoint pluginPosition = AsNsPoint(pluginFrame->GetScreenRect().TopLeft());
+ CSSIntPoint pluginPosition = pluginFrame->GetScreenRect().TopLeft();
// Convert (sourceX, sourceY) to 'real' (not PuppetWidget) screen space.
// In OSX, the Y-axis increases upward, which is the reverse of ours.
// We want OSX coordinates for window and screen so those equations are swapped.
- nsPoint sourcePoint(sourceX, sourceY);
- nsPoint screenPoint;
+ CSSIntPoint sourcePoint = CSSIntPoint::Truncate(sourceX, sourceY);
+ CSSIntPoint screenPoint;
switch (sourceSpace) {
case NPCoordinateSpacePlugin:
screenPoint = sourcePoint + pluginPosition +
- pluginFrame->GetContentRectRelativeToSelf().TopLeft() / nsPresContext::AppUnitsPerCSSPixel();
+ CSSIntPoint::Truncate(CSSPoint::FromAppUnits(
+ pluginFrame->GetContentRectRelativeToSelf().TopLeft()));
break;
case NPCoordinateSpaceWindow:
- screenPoint = nsPoint(sourcePoint.x, windowH-sourcePoint.y) +
+ screenPoint = CSSIntPoint(sourcePoint.x, windowH-sourcePoint.y) +
windowPosition;
break;
case NPCoordinateSpaceFlippedWindow:
screenPoint = sourcePoint + windowPosition;
break;
case NPCoordinateSpaceScreen:
- screenPoint = nsPoint(sourcePoint.x, screenH-sourcePoint.y);
+ screenPoint = CSSIntPoint(sourcePoint.x, screenH-sourcePoint.y);
break;
case NPCoordinateSpaceFlippedScreen:
screenPoint = sourcePoint;
break;
default:
return false;
}
// Convert from screen to dest space.
- nsPoint destPoint;
+ CSSIntPoint destPoint;
switch (destSpace) {
case NPCoordinateSpacePlugin:
destPoint = screenPoint - pluginPosition -
- pluginFrame->GetContentRectRelativeToSelf().TopLeft() / nsPresContext::AppUnitsPerCSSPixel();
+ CSSIntPoint::Truncate(CSSPoint::FromAppUnits(
+ pluginFrame->GetContentRectRelativeToSelf().TopLeft()));
break;
case NPCoordinateSpaceWindow:
destPoint = screenPoint - windowPosition;
destPoint.y = windowH - destPoint.y;
break;
case NPCoordinateSpaceFlippedWindow:
destPoint = screenPoint - windowPosition;
break;
case NPCoordinateSpaceScreen:
- destPoint = nsPoint(screenPoint.x, screenH-screenPoint.y);
+ destPoint = CSSIntPoint(screenPoint.x, screenH-screenPoint.y);
break;
case NPCoordinateSpaceFlippedScreen:
destPoint = screenPoint;
break;
default:
return false;
}
@@ -1184,17 +1187,17 @@ NPBool nsPluginInstanceOwner::ConvertPoi
screenHeight /= scaleFactor;
LayoutDeviceIntRect windowScreenBounds = widget->GetScreenBounds();
windowScreenBounds.ScaleInverseRoundOut(scaleFactor);
int32_t windowX = windowScreenBounds.x;
int32_t windowY = windowScreenBounds.y;
int32_t windowHeight = windowScreenBounds.height;
- nsIntRect pluginScreenRect = pluginFrame->GetScreenRect();
+ CSSIntRect pluginScreenRect = pluginFrame->GetScreenRect();
double screenXGecko, screenYGecko;
switch (sourceSpace) {
case NPCoordinateSpacePlugin:
screenXGecko = pluginScreenRect.x + sourceX;
screenYGecko = pluginScreenRect.y + sourceY;
break;
case NPCoordinateSpaceWindow:
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -8444,18 +8444,19 @@ PresShell::AdjustContextMenuKeyEvent(Wid
nsIFrame* itemFrame =
(static_cast<nsMenuPopupFrame *>(popupFrame))->GetCurrentMenuItem();
if (!itemFrame)
itemFrame = popupFrame;
nsCOMPtr<nsIWidget> widget = popupFrame->GetNearestWidget();
aEvent->mWidget = widget;
LayoutDeviceIntPoint widgetPoint = widget->WidgetToScreenOffset();
- aEvent->mRefPoint = LayoutDeviceIntPoint::FromUnknownPoint(
- itemFrame->GetScreenRect().BottomLeft()) - widgetPoint;
+ aEvent->mRefPoint = LayoutDeviceIntPoint::FromAppUnitsToNearest(
+ itemFrame->GetScreenRectInAppUnits().BottomLeft(),
+ itemFrame->PresContext()->AppUnitsPerDevPixel()) - widgetPoint;
mCurrentEventContent = itemFrame->GetContent();
mCurrentEventFrame = itemFrame;
return true;
}
}
#endif
--- a/layout/base/Units.h
+++ b/layout/base/Units.h
@@ -235,16 +235,20 @@ struct CSSPixel {
static CSSIntRect FromAppUnitsRounded(const nsRect& aRect) {
return CSSIntRect(NSAppUnitsToIntPixels(aRect.x, float(AppUnitsPerCSSPixel())),
NSAppUnitsToIntPixels(aRect.y, float(AppUnitsPerCSSPixel())),
NSAppUnitsToIntPixels(aRect.width, float(AppUnitsPerCSSPixel())),
NSAppUnitsToIntPixels(aRect.height, float(AppUnitsPerCSSPixel())));
}
+ static CSSIntRect FromAppUnitsToNearest(const nsRect& aRect) {
+ return CSSIntRect::FromUnknownRect(aRect.ToNearestPixels(AppUnitsPerCSSPixel()));
+ }
+
// Conversions to app units
static nscoord ToAppUnits(CSSCoord aCoord) {
return NSToCoordRoundWithClamp(aCoord * float(AppUnitsPerCSSPixel()));
}
static nsPoint ToAppUnits(const CSSPoint& aPoint) {
return nsPoint(NSToCoordRoundWithClamp(aPoint.x * float(AppUnitsPerCSSPixel())),
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -6093,19 +6093,19 @@ nsIFrame::GetOffsetToCrossDoc(const nsIF
// aOther.
nsPoint negOffset = aOther->GetOffsetToCrossDoc(root, aAPD);
offset -= negOffset;
}
return offset;
}
-nsIntRect nsIFrame::GetScreenRect() const
-{
- return GetScreenRectInAppUnits().ToNearestPixels(PresContext()->AppUnitsPerCSSPixel());
+CSSIntRect nsIFrame::GetScreenRect() const
+{
+ return CSSIntRect::FromAppUnitsToNearest(GetScreenRectInAppUnits());
}
nsRect nsIFrame::GetScreenRectInAppUnits() const
{
nsPresContext* presContext = PresContext();
nsIFrame* rootFrame =
presContext->PresShell()->FrameManager()->GetRootFrame();
nsPoint rootScreenPos(0, 0);
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -2577,20 +2577,22 @@ public:
/**
* Like GetOffsetToCrossDoc, but the caller can specify which appunits
* to return the result in.
*/
nsPoint GetOffsetToCrossDoc(const nsIFrame* aOther, const int32_t aAPD) const;
/**
- * Get the screen rect of the frame in pixels.
- * @return the pixel rect of the frame in screen coordinates.
+ * Get the rect of the frame relative to the top-left corner of the
+ * screen in CSS pixels.
+ * @return the CSS pixel rect of the frame relative to the top-left
+ * corner of the screen.
*/
- nsIntRect GetScreenRect() const;
+ mozilla::CSSIntRect GetScreenRect() const;
/**
* Get the screen rect of the frame in app units.
* @return the app unit rect of the frame in screen coordinates.
*/
nsRect GetScreenRectInAppUnits() const;
/**
--- a/layout/xul/BoxObject.cpp
+++ b/layout/xul/BoxObject.cpp
@@ -212,17 +212,17 @@ BoxObject::GetScreenPosition(nsIntPoint&
{
aPoint.x = aPoint.y = 0;
if (!mContent)
return NS_ERROR_NOT_INITIALIZED;
nsIFrame* frame = GetFrame(true);
if (frame) {
- nsIntRect rect = frame->GetScreenRect();
+ CSSIntRect rect = frame->GetScreenRect();
aPoint.x = rect.x;
aPoint.y = rect.y;
}
return NS_OK;
}
NS_IMETHODIMP
--- a/layout/xul/nsResizerFrame.cpp
+++ b/layout/xul/nsResizerFrame.cpp
@@ -197,17 +197,17 @@ nsResizerFrame::HandleEvent(nsPresContex
sizeConstraints.mMaxSize.height, mouseMove.y, direction.mVertical);
// Don't allow resizing a window or a popup past the edge of the screen,
// so adjust the rectangle to fit within the available screen area.
if (window) {
nsCOMPtr<nsIScreen> screen;
nsCOMPtr<nsIScreenManager> sm(do_GetService("@mozilla.org/gfx/screenmanager;1"));
if (sm) {
- nsIntRect frameRect = GetScreenRect();
+ CSSIntRect frameRect = GetScreenRect();
// ScreenForRect requires display pixels, so scale from device pix
double scale;
window->GetUnscaledDevicePixelsPerCSSPixel(&scale);
sm->ScreenForRect(NSToIntRound(frameRect.x / scale),
NSToIntRound(frameRect.y / scale), 1, 1,
getter_AddRefs(screen));
if (screen) {
LayoutDeviceIntRect screenRect;
--- a/layout/xul/nsXULPopupManager.cpp
+++ b/layout/xul/nsXULPopupManager.cpp
@@ -257,21 +257,21 @@ nsXULPopupManager::Rollup(uint32_t aCoun
item->Frame()->GetContent()->AttrValueIs(kNameSpaceID_None,
nsGkAtoms::norolluponanchor, nsGkAtoms::_true, eCaseMatters));
// When ConsumeOutsideClicks_ParentOnly is used, always consume the click
// when the click was over the anchor. This way, clicking on a menu doesn't
// reopen the menu.
if ((consumeResult == ConsumeOutsideClicks_ParentOnly || noRollupOnAnchor) && pos) {
nsMenuPopupFrame* popupFrame = item->Frame();
- nsIntRect anchorRect;
+ CSSIntRect anchorRect;
if (popupFrame->IsAnchored()) {
// Check if the popup has a screen anchor rectangle. If not, get the rectangle
// from the anchor element.
- anchorRect = popupFrame->GetScreenAnchorRect();
+ anchorRect = CSSIntRect::FromUnknownRect(popupFrame->GetScreenAnchorRect());
if (anchorRect.x == -1 || anchorRect.y == -1) {
nsCOMPtr<nsIContent> anchor = popupFrame->GetAnchor();
// Check if the anchor has indicated another node to use for checking
// for roll-up. That way, we can anchor a popup on anonymous content or
// an individual icon, while clicking elsewhere within a button or other
// container doesn't result in us re-opening the popup.
if (anchor) {
@@ -293,18 +293,18 @@ nsXULPopupManager::Rollup(uint32_t aCoun
}
}
// It's possible that some other element is above the anchor at the same
// position, but the only thing that would happen is that the mouse
// event will get consumed, so here only a quick coordinates check is
// done rather than a slower complete check of what is at that location.
nsPresContext* presContext = item->Frame()->PresContext();
- nsIntPoint posCSSPixels(presContext->DevPixelsToIntCSSPixels(pos->x),
- presContext->DevPixelsToIntCSSPixels(pos->y));
+ CSSIntPoint posCSSPixels(presContext->DevPixelsToIntCSSPixels(pos->x),
+ presContext->DevPixelsToIntCSSPixels(pos->y));
if (anchorRect.Contains(posCSSPixels)) {
if (consumeResult == ConsumeOutsideClicks_ParentOnly) {
consume = true;
}
if (noRollupOnAnchor) {
rollup = false;
}
--- a/widget/nsBaseDragService.cpp
+++ b/widget/nsBaseDragService.cpp
@@ -583,38 +583,39 @@ nsBaseDragService::DrawDrag(nsIDOMNode*
// check if drag images are disabled
bool enableDragImages = Preferences::GetBool(DRAGIMAGES_PREF, true);
// didn't want an image, so just set the screen rectangle to the frame size
if (!enableDragImages || !mHasImage) {
// if a region was specified, set the screen rectangle to the area that
// the region occupies
- nsIntRect dragRect;
+ CSSIntRect dragRect;
if (aRegion) {
// the region's coordinates are relative to the root frame
aRegion->GetBoundingBox(&dragRect.x, &dragRect.y, &dragRect.width, &dragRect.height);
nsIFrame* rootFrame = presShell->GetRootFrame();
- nsIntRect screenRect = rootFrame->GetScreenRect();
+ CSSIntRect screenRect = rootFrame->GetScreenRect();
dragRect.MoveBy(screenRect.TopLeft());
}
else {
// otherwise, there was no region so just set the rectangle to
// the size of the primary frame of the content.
nsCOMPtr<nsIContent> content = do_QueryInterface(dragNode);
nsIFrame* frame = content->GetPrimaryFrame();
if (frame) {
dragRect = frame->GetScreenRect();
}
}
- dragRect = ToAppUnits(dragRect, nsPresContext::AppUnitsPerCSSPixel()).
- ToOutsidePixels((*aPresContext)->AppUnitsPerDevPixel());
- aScreenDragRect->SizeTo(dragRect.width, dragRect.height);
+ nsIntRect dragRectDev =
+ ToAppUnits(dragRect, nsPresContext::AppUnitsPerCSSPixel()).
+ ToOutsidePixels((*aPresContext)->AppUnitsPerDevPixel());
+ aScreenDragRect->SizeTo(dragRectDev.width, dragRectDev.height);
return NS_OK;
}
// draw the image for selections
if (mSelection) {
LayoutDeviceIntPoint pnt(aScreenDragRect->TopLeft());
*aSurface = presShell->RenderSelection(mSelection, pnt, aScreenDragRect,
mImage ? 0 : nsIPresShell::RENDER_AUTO_SCALE);