diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index efd287287807..0db907fcdf73 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -3229,7 +3229,8 @@ addonInfo: aMessage.data.addonInfo }; let popup = browser.ownerDocument.getElementById("contentAreaContextMenu"); let event = gContextMenuContentData.event; - popup.openPopupAtScreen(event.screenX, event.screenY, true); + let pos = browser.mapScreenCoordinatesFromContent(event.screenX, event.screenY); + popup.openPopupAtScreen(pos.x, pos.y, true); break; } case "DOMWebNotificationClicked": { diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index 982ec2eaeb91..4ac6eb6bb11c 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -914,7 +914,8 @@ nsFrameLoader::ShowRemoteFrame(const nsIntSize& size, // Don't show remote iframe if we are waiting for the completion of reflow. if (!aFrame || !(aFrame->GetStateBits() & NS_FRAME_FIRST_REFLOW)) { - mRemoteBrowser->UpdateDimensions(dimensions, size); + nsIntPoint chromeDisp = aFrame->GetChromeDisplacement(); + mRemoteBrowser->UpdateDimensions(dimensions, size, chromeDisp); } } @@ -1959,7 +1960,8 @@ nsFrameLoader::UpdatePositionAndSize(nsSubDocumentFrame *aIFrame) nsIntSize size = aIFrame->GetSubdocumentSize(); nsIntRect dimensions; NS_ENSURE_SUCCESS(GetWindowDimensions(dimensions), NS_ERROR_FAILURE); - mRemoteBrowser->UpdateDimensions(dimensions, size); + nsIntPoint chromeDisp = aIFrame->GetChromeDisplacement(); + mRemoteBrowser->UpdateDimensions(dimensions, size, chromeDisp); } return NS_OK; } diff --git a/dom/base/nsFrameLoader.h b/dom/base/nsFrameLoader.h index 0e02528e77a1..54a0ec50e276 100644 --- a/dom/base/nsFrameLoader.h +++ b/dom/base/nsFrameLoader.h @@ -227,9 +227,6 @@ public: void ActivateUpdateHitRegion(); void DeactivateUpdateHitRegion(); - // Properly retrieves documentSize of any subdocument type. - nsresult GetWindowDimensions(nsIntRect& aRect); - private: void SetOwnerContent(mozilla::dom::Element* aContent); @@ -285,6 +282,9 @@ private: nsresult MaybeCreateDocShell(); nsresult EnsureMessageManager(); + // Properly retrieves documentSize of any subdocument type. + nsresult GetWindowDimensions(nsIntRect& aRect); + // Updates the subdocument position and size. This gets called only // when we have our own in-process DocShell. void UpdateBaseWindowPositionAndSize(nsSubDocumentFrame *aIFrame); diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp index 1953d339bfae..43e710551a92 100644 --- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -2011,7 +2011,7 @@ TabChild::RecvUpdateDimensions(const nsIntRect& rect, const nsIntSize& size, ScreenIntSize oldScreenSize = mInnerSize; mInnerSize = ScreenIntSize::FromUnknownSize( gfx::IntSize(size.width, size.height)); - mWidget->Resize(rect.x + chromeDisp.x, rect.y + chromeDisp.y, size.width, size.height, + mWidget->Resize(0, 0, size.width, size.height, true); nsCOMPtr baseWin = do_QueryInterface(WebNavigation()); diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index fbda3eb2dde2..8169ebf4fdaf 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -80,7 +80,6 @@ #include "nsICancelable.h" #include "gfxPrefs.h" #include "nsILoginManagerPrompter.h" -#include "nsPIWindowRoot.h" #include using namespace mozilla::dom; @@ -322,27 +321,7 @@ TabParent::RemoveTabParentFromTable(uint64_t aLayersId) void TabParent::SetOwnerElement(Element* aElement) { - // If we held previous content then unregister for its events. - if (mFrameElement && mFrameElement->OwnerDoc()->GetWindow()) { - nsCOMPtr window = mFrameElement->OwnerDoc()->GetWindow(); - nsCOMPtr eventTarget = window->GetTopWindowRoot(); - if (eventTarget) { - eventTarget->RemoveEventListener(NS_LITERAL_STRING("MozUpdateWindowPos"), - this, false); - } - } - - // Update to the new content, and register to listen for events from it. mFrameElement = aElement; - if (mFrameElement && mFrameElement->OwnerDoc()->GetWindow()) { - nsCOMPtr window = mFrameElement->OwnerDoc()->GetWindow(); - nsCOMPtr eventTarget = window->GetTopWindowRoot(); - if (eventTarget) { - eventTarget->AddEventListener(NS_LITERAL_STRING("MozUpdateWindowPos"), - this, false, false); - } - } - TryCacheDPIAndScale(); } @@ -378,8 +357,6 @@ TabParent::Destroy() return; } - SetOwnerElement(nullptr); - // If this fails, it's most likely due to a content-process crash, // and auto-cleanup will kick in. Otherwise, the child side will // destroy itself and send back __delete__(). @@ -904,40 +881,9 @@ TabParent::RecvSetDimensions(const uint32_t& aFlags, return false; } -static nsIntPoint -GetChromeDisplacement(nsFrameLoader *aFrameLoader) -{ - if (!aFrameLoader) { - return nsIntPoint(); - } - - // Calculate the displacement from the primary frame of the tab - // content to the top-level frame of the widget we are in. - nsIFrame* contentFrame = aFrameLoader->GetPrimaryFrameOfOwningContent(); - if (!contentFrame) { - return nsIntPoint(); - } - - nsIFrame* nextFrame = nsLayoutUtils::GetCrossDocParentFrame(contentFrame); - if (!nextFrame) { - NS_WARNING("Couldn't find window chrome to calculate displacement to."); - return nsIntPoint(); - } - - nsIFrame* rootFrame = nextFrame; - while (nextFrame) { - rootFrame = nextFrame; - nextFrame = nsLayoutUtils::GetCrossDocParentFrame(rootFrame); - } - - nsPoint offset = contentFrame->GetOffsetToCrossDoc(rootFrame); - int32_t appUnitsPerDevPixel = rootFrame->PresContext()->AppUnitsPerDevPixel(); - return nsIntPoint((int)(offset.x/appUnitsPerDevPixel), - (int)(offset.y/appUnitsPerDevPixel)); -} - void -TabParent::UpdateDimensions(const nsIntRect& rect, const nsIntSize& size) +TabParent::UpdateDimensions(const nsIntRect& rect, const nsIntSize& size, + const nsIntPoint& aChromeDisp) { if (mIsDestroyed) { return; @@ -948,22 +894,12 @@ TabParent::UpdateDimensions(const nsIntRect& rect, const nsIntSize& size) if (!mUpdatedDimensions || mOrientation != orientation || mDimensions != size || !mRect.IsEqualEdges(rect)) { - nsCOMPtr widget = GetWidget(); - nsIntRect contentRect = rect; - if (widget) { - contentRect.x += widget->GetClientOffset().x; - contentRect.y += widget->GetClientOffset().y; - } - mUpdatedDimensions = true; - mRect = contentRect; + mRect = rect; mDimensions = size; mOrientation = orientation; - nsRefPtr frameLoader = GetFrameLoader(); - nsIntPoint chromeOffset = GetChromeDisplacement(frameLoader); - - unused << SendUpdateDimensions(mRect, mDimensions, mOrientation, chromeOffset); + unused << SendUpdateDimensions(mRect, mDimensions, mOrientation, aChromeDisp); } } @@ -2716,27 +2652,6 @@ TabParent::DeallocPPluginWidgetParent(mozilla::plugins::PPluginWidgetParent* aAc return true; } -nsresult -TabParent::HandleEvent(nsIDOMEvent* aEvent) -{ - nsAutoString eventType; - aEvent->GetType(eventType); - - if (eventType.EqualsLiteral("MozUpdateWindowPos")) { - // This event is sent when the widget moved. Therefore we only update - // the position. - nsRefPtr frameLoader = GetFrameLoader(); - if (!frameLoader) { - return NS_OK; - } - nsIntRect windowDims; - NS_ENSURE_SUCCESS(frameLoader->GetWindowDimensions(windowDims), NS_ERROR_FAILURE); - UpdateDimensions(windowDims, mDimensions); - return NS_OK; - } - return NS_OK; -} - class FakeChannel MOZ_FINAL : public nsIChannel, public nsIAuthPromptCallback, public nsIInterfaceRequestor, diff --git a/dom/ipc/TabParent.h b/dom/ipc/TabParent.h index 366af9ec3575..3a172fd6645a 100644 --- a/dom/ipc/TabParent.h +++ b/dom/ipc/TabParent.h @@ -22,7 +22,6 @@ #include "Units.h" #include "WritingModes.h" #include "js/TypeDecls.h" -#include "nsIDOMEventListener.h" class nsFrameLoader; class nsIFrameLoader; @@ -59,8 +58,7 @@ class nsIContentParent; class Element; struct StructuredCloneData; -class TabParent : public PBrowserParent - , public nsIDOMEventListener +class TabParent : public PBrowserParent , public nsITabParent , public nsIAuthPromptProvider , public nsISecureBrowserUI @@ -100,9 +98,6 @@ public: mBrowserDOMWindow = aBrowserDOMWindow; } - // nsIDOMEventListener interfaces - NS_DECL_NSIDOMEVENTLISTENER - already_AddRefed GetLoadContext(); nsIXULBrowserWindow* GetXULBrowserWindow(); @@ -246,7 +241,8 @@ public: // message-sending functions under a layer of indirection and // eating the return values void Show(const nsIntSize& size, bool aParentIsActive); - void UpdateDimensions(const nsIntRect& rect, const nsIntSize& size); + void UpdateDimensions(const nsIntRect& rect, const nsIntSize& size, + const nsIntPoint& chromeDisp); void UpdateFrame(const layers::FrameMetrics& aFrameMetrics); void UIResolutionChanged(); void AcknowledgeScrollUpdate(const ViewID& aScrollId, const uint32_t& aScrollGeneration); diff --git a/dom/plugins/base/nsPluginInstanceOwner.cpp b/dom/plugins/base/nsPluginInstanceOwner.cpp index 58d19381b309..8bdadc0f2d5e 100644 --- a/dom/plugins/base/nsPluginInstanceOwner.cpp +++ b/dom/plugins/base/nsPluginInstanceOwner.cpp @@ -789,6 +789,7 @@ NPBool nsPluginInstanceOwner::ConvertPointPuppet(PuppetWidget *widget, tabContentBounds.ScaleInverseRoundOut(scaleFactor); int32_t windowH = tabContentBounds.height + int(chromeSize.y); + // This is actually relative to window-chrome. nsPoint pluginPosition = AsNsPoint(pluginFrame->GetScreenRect().TopLeft()); // Convert (sourceX, sourceY) to 'real' (not PuppetWidget) screen space. @@ -798,8 +799,8 @@ NPBool nsPluginInstanceOwner::ConvertPointPuppet(PuppetWidget *widget, nsPoint screenPoint; switch (sourceSpace) { case NPCoordinateSpacePlugin: - screenPoint = sourcePoint + pluginPosition + - pluginFrame->GetContentRectRelativeToSelf().TopLeft() / nsPresContext::AppUnitsPerCSSPixel(); + screenPoint = sourcePoint + pluginFrame->GetContentRectRelativeToSelf().TopLeft() + + chromeSize + pluginPosition + windowPosition; break; case NPCoordinateSpaceWindow: screenPoint = nsPoint(sourcePoint.x, windowH-sourcePoint.y) + @@ -822,8 +823,8 @@ NPBool nsPluginInstanceOwner::ConvertPointPuppet(PuppetWidget *widget, nsPoint destPoint; switch (destSpace) { case NPCoordinateSpacePlugin: - destPoint = screenPoint - pluginPosition - - pluginFrame->GetContentRectRelativeToSelf().TopLeft() / nsPresContext::AppUnitsPerCSSPixel(); + destPoint = screenPoint - pluginFrame->GetContentRectRelativeToSelf().TopLeft() - + chromeSize - pluginPosition - windowPosition; break; case NPCoordinateSpaceWindow: destPoint = screenPoint - windowPosition; diff --git a/embedding/browser/nsDocShellTreeOwner.cpp b/embedding/browser/nsDocShellTreeOwner.cpp index fc0c7f58255c..4787a2c2408a 100644 --- a/embedding/browser/nsDocShellTreeOwner.cpp +++ b/embedding/browser/nsDocShellTreeOwner.cpp @@ -1453,15 +1453,9 @@ ChromeTooltipListener::sTooltipCallback(nsITimer *aTimer, if (textFound) { nsString tipText(tooltipText); LayoutDeviceIntPoint screenDot = widget->WidgetToScreenOffset(); - double scaleFactor = 1.0; - if (shell->GetPresContext()) { - scaleFactor = double(nsPresContext::AppUnitsPerCSSPixel())/ - shell->GetPresContext()->DeviceContext()->AppUnitsPerDevPixelAtUnitFullZoom(); - } - // ShowTooltip expects widget-relative position. - self->ShowTooltip(self->mMouseScreenX - screenDot.x / scaleFactor, - self->mMouseScreenY - screenDot.y / scaleFactor, - tipText); + self->ShowTooltip(self->mMouseScreenX - screenDot.x, + self->mMouseScreenY - screenDot.y, + tipText); } } diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp index a470a66b952c..4a74295513a1 100644 --- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -1274,3 +1274,24 @@ nsSubDocumentFrame::ObtainIntrinsicSizeFrame() } return nullptr; } + +nsIntPoint +nsSubDocumentFrame::GetChromeDisplacement() +{ + nsIFrame* nextFrame = nsLayoutUtils::GetCrossDocParentFrame(this); + if (!nextFrame) { + NS_WARNING("Couldn't find window chrome to calculate displacement to."); + return nsIntPoint(); + } + + nsIFrame* rootFrame = nextFrame; + while (nextFrame) { + rootFrame = nextFrame; + nextFrame = nsLayoutUtils::GetCrossDocParentFrame(rootFrame); + } + + nsPoint offset = GetOffsetToCrossDoc(rootFrame); + int32_t appUnitsPerDevPixel = rootFrame->PresContext()->AppUnitsPerDevPixel(); + return nsIntPoint((int)(offset.x/appUnitsPerDevPixel), + (int)(offset.y/appUnitsPerDevPixel)); +} diff --git a/layout/generic/nsSubDocumentFrame.h b/layout/generic/nsSubDocumentFrame.h index f409f3bd4759..788e4d8d9b63 100644 --- a/layout/generic/nsSubDocumentFrame.h +++ b/layout/generic/nsSubDocumentFrame.h @@ -127,6 +127,8 @@ public: */ bool PassPointerEventsToChildren(); + nsIntPoint GetChromeDisplacement(); + protected: friend class AsyncFrameInit; diff --git a/toolkit/components/satchel/AutoCompleteE10S.jsm b/toolkit/components/satchel/AutoCompleteE10S.jsm index 1e506fd97b27..3928b273dec2 100644 --- a/toolkit/components/satchel/AutoCompleteE10S.jsm +++ b/toolkit/components/satchel/AutoCompleteE10S.jsm @@ -81,8 +81,9 @@ this.AutoCompleteE10S = { this.popup.hidden = false; this.popup.setAttribute("width", rect.width); - this.x = rect.left; - this.y = rect.top + rect.height; + let {x, y} = this.browser.mapScreenCoordinatesFromContent(rect.left, rect.top + rect.height); + this.x = x; + this.y = y; }, _showPopup: function(results) { diff --git a/toolkit/content/widgets/browser.xml b/toolkit/content/widgets/browser.xml index 4122681e1c7f..e42c917683e0 100644 --- a/toolkit/content/widgets/browser.xml +++ b/toolkit/content/widgets/browser.xml @@ -877,7 +877,8 @@ if (!this.autoscrollEnabled) { return false; } - this.startScroll(data.scrolldir, data.screenX, data.screenY); + let pos = this.mapScreenCoordinatesFromContent(data.screenX, data.screenY); + this.startScroll(data.scrolldir, pos.x, pos.y); return true; } case "Autoscroll:Cancel": @@ -1058,6 +1059,25 @@ + + + + + + + + + diff --git a/toolkit/content/widgets/remote-browser.xml b/toolkit/content/widgets/remote-browser.xml index b1fbb32a9455..019446689078 100644 --- a/toolkit/content/widgets/remote-browser.xml +++ b/toolkit/content/widgets/remote-browser.xml @@ -391,6 +391,27 @@ ]]> + + + + + + + + + diff --git a/toolkit/modules/SelectParentHelper.jsm b/toolkit/modules/SelectParentHelper.jsm index 60a179fa0239..5d6b87425080 100644 --- a/toolkit/modules/SelectParentHelper.jsm +++ b/toolkit/modules/SelectParentHelper.jsm @@ -28,7 +28,8 @@ this.SelectParentHelper = { currentBrowser = browser; this._registerListeners(menulist.menupopup); - menulist.menupopup.openPopupAtScreen(rect.left, rect.top + rect.height); + let {x, y} = browser.mapScreenCoordinatesFromContent(rect.left, rect.top + rect.height); + menulist.menupopup.openPopupAtScreen(x, y); menulist.selectedItem.scrollIntoView(); }, diff --git a/widget/PuppetWidget.cpp b/widget/PuppetWidget.cpp index 54714b4a5e9a..acfe7001026a 100644 --- a/widget/PuppetWidget.cpp +++ b/widget/PuppetWidget.cpp @@ -965,13 +965,6 @@ PuppetWidget::GetWindowPosition() return nsIntPoint(winX, winY); } -NS_METHOD -PuppetWidget::GetScreenBounds(nsIntRect &aRect) { - aRect.MoveTo(LayoutDeviceIntPoint::ToUntyped(WidgetToScreenOffset())); - aRect.SizeTo(mBounds.Size()); - return NS_OK; -} - PuppetScreen::PuppetScreen(void *nativeScreen) { } diff --git a/widget/PuppetWidget.h b/widget/PuppetWidget.h index 5c566a16c56a..f6f82b8f9465 100644 --- a/widget/PuppetWidget.h +++ b/widget/PuppetWidget.h @@ -78,7 +78,7 @@ public: int32_t* aY) MOZ_OVERRIDE { *aX = kMaxDimension; *aY = kMaxDimension; return NS_OK; } - // Widget position is controlled by the parent process via TabChild. + // We're always at <0, 0>, and so ignore move requests. NS_IMETHOD Move(double aX, double aY) MOZ_OVERRIDE { return NS_OK; } @@ -90,14 +90,8 @@ public: double aWidth, double aHeight, bool aRepaint) MOZ_OVERRIDE - { - if (mBounds.x != aX || mBounds.y != aY) { - NotifyWindowMoved(aX, aY); - } - mBounds.x = aX; - mBounds.y = aY; - return Resize(aWidth, aHeight, aRepaint); - } + // (we're always at <0, 0>) + { return Resize(aWidth, aHeight, aRepaint); } // XXX/cjones: copying gtk behavior here; unclear what disabling a // widget is supposed to entail @@ -127,8 +121,9 @@ public: NS_IMETHOD SetTitle(const nsAString& aTitle) MOZ_OVERRIDE { return NS_ERROR_UNEXPECTED; } + // PuppetWidgets are always at <0, 0>. virtual mozilla::LayoutDeviceIntPoint WidgetToScreenOffset() MOZ_OVERRIDE - { return LayoutDeviceIntPoint::FromUntyped(GetWindowPosition() + GetChromeDimensions()); } + { return mozilla::LayoutDeviceIntPoint(0, 0); } void InitEvent(WidgetGUIEvent& aEvent, nsIntPoint* aPoint = nullptr); @@ -201,8 +196,6 @@ public: // Get the screen position of the application window. nsIntPoint GetWindowPosition(); - NS_IMETHOD GetScreenBounds(nsIntRect &aRect) MOZ_OVERRIDE; - NS_IMETHOD StartPluginIME(const mozilla::WidgetKeyboardEvent& aKeyboardEvent, int32_t aPanelX, int32_t aPanelY, nsString& aCommitted) MOZ_OVERRIDE; diff --git a/xpfe/appshell/nsWebShellWindow.cpp b/xpfe/appshell/nsWebShellWindow.cpp index 4c6632f680ea..29dde6155d25 100644 --- a/xpfe/appshell/nsWebShellWindow.cpp +++ b/xpfe/appshell/nsWebShellWindow.cpp @@ -71,8 +71,6 @@ #include "mozilla/DebugOnly.h" #include "mozilla/MouseEvents.h" -#include "nsPIWindowRoot.h" - #ifdef XP_MACOSX #include "nsINativeMenuService.h" #define USE_NATIVE_MENUS @@ -259,15 +257,6 @@ nsWebShellWindow::WindowMoved(nsIWidget* aWidget, int32_t x, int32_t y) pm->AdjustPopupsOnWindowChange(window); } - // Notify all tabs that the widget moved. - if (mDocShell && mDocShell->GetWindow()) { - nsCOMPtr eventTarget = mDocShell->GetWindow()->GetTopWindowRoot(); - nsContentUtils::DispatchChromeEvent(mDocShell->GetDocument(), - eventTarget, - NS_LITERAL_STRING("MozUpdateWindowPos"), - false, false, nullptr); - } - // Persist position, but not immediately, in case this OS is firing // repeated move events as the user drags the window SetPersistenceTimer(PAD_POSITION);