☠☠ backed out by 8a11785cd3f2 ☠ ☠ | |
author | Michael Layzell <michael@thelayzells.com> |
Tue, 13 Jun 2017 13:37:31 -0400 | |
changeset 414076 | 36d662fbab77e831c6c7bf0c3bd734020bb76a87 |
parent 414075 | 2029cb6bce8660c14d9a98b74ab0e36c9adab4b6 |
child 414077 | 44532a19e524df52ccf35fd0e342996027d86342 |
push id | 7566 |
push user | mtabara@mozilla.com |
push date | Wed, 02 Aug 2017 08:25:16 +0000 |
treeherder | mozilla-beta@86913f512c3c [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | billm, jimm |
bugs | 1350633 |
milestone | 56.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/ipc/PBrowser.ipdl +++ b/dom/ipc/PBrowser.ipdl @@ -145,21 +145,16 @@ parent: * in e10s mode. This is always initiated from the child in response * to windowed plugin creation. */ sync PPluginWidget(); async PPaymentRequest(); /** - * Return native data of root widget - */ - nested(inside_cpow) sync GetWidgetNativeData() returns (WindowsHandle value); - - /** * Sends an NS_NATIVE_CHILD_OF_SHAREABLE_WINDOW to be adopted by the * widget's shareable window on the chrome side. Only used on Windows. */ async SetNativeChildOfShareableWindow(uintptr_t childWindow); /** * When content moves focus from a native plugin window that's a child * of the native browser window we need to move native focus to the @@ -889,16 +884,22 @@ child: async SetWindowName(nsString aName); /** * Tell the TabChild what OriginAttributes it should inherit from. This must * be called before the first non-blank document is loaded in the TabChild. */ async SetOriginAttributes(OriginAttributes aOriginAttributes); + /** + * Pass the current handle for the current native widget to the content + * process, so it can be used by PuppetWidget. + */ + async SetWidgetNativeData(WindowsHandle aHandle); + /* * FIXME: write protocol! state LIVE: send LoadURL goto LIVE; //etc. send Destroy goto DYING;
--- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -406,16 +406,17 @@ TabChild::TabChild(nsIContentChild* aMan #endif #if defined(ACCESSIBILITY) , mTopLevelDocAccessibleChild(nullptr) #endif , mPendingDocShellIsActive(false) , mPendingDocShellPreserveLayers(false) , mPendingDocShellReceivedMessage(false) , mPendingDocShellBlockers(0) + , mWidgetNativeData(0) { nsWeakPtr weakPtrThis(do_GetWeakReference(static_cast<nsITabChild*>(this))); // for capture by the lambda mSetAllowedTouchBehaviorCallback = [weakPtrThis](uint64_t aInputBlockId, const nsTArray<TouchBehaviorFlags>& aFlags) { if (nsCOMPtr<nsITabChild> tabChild = do_QueryReferent(weakPtrThis)) { static_cast<TabChild*>(tabChild.get())->SetAllowedTouchBehavior(aInputBlockId, aFlags); } @@ -3207,16 +3208,23 @@ mozilla::ipc::IPCResult TabChild::RecvSetOriginAttributes(const OriginAttributes& aOriginAttributes) { nsCOMPtr<nsIDocShell> docShell = do_GetInterface(WebNavigation()); nsDocShell::Cast(docShell)->SetOriginAttributes(aOriginAttributes); return IPC_OK(); } +mozilla::ipc::IPCResult +TabChild::RecvSetWidgetNativeData(const WindowsHandle& aWidgetNativeData) +{ + mWidgetNativeData = aWidgetNativeData; + return IPC_OK(); +} + mozilla::plugins::PPluginWidgetChild* TabChild::AllocPPluginWidgetChild() { #ifdef XP_WIN return new mozilla::plugins::PluginWidgetChild(); #else MOZ_ASSERT_UNREACHABLE(); return nullptr;
--- a/dom/ipc/TabChild.h +++ b/dom/ipc/TabChild.h @@ -692,16 +692,22 @@ public: { return mTopLevelDocAccessibleChild; } #endif void AddPendingDocShellBlocker(); void RemovePendingDocShellBlocker(); + // The HANDLE object for the widget this TabChild in. + WindowsHandle WidgetNativeData() + { + return mWidgetNativeData; + } + protected: virtual ~TabChild(); virtual PRenderFrameChild* AllocPRenderFrameChild() override; virtual bool DeallocPRenderFrameChild(PRenderFrameChild* aFrame) override; virtual mozilla::ipc::IPCResult RecvDestroy() override; @@ -733,16 +739,18 @@ protected: virtual mozilla::ipc::IPCResult RecvNotifyPartialSHistoryDeactive() override; virtual mozilla::ipc::IPCResult RecvAwaitLargeAlloc() override; virtual mozilla::ipc::IPCResult RecvSetWindowName(const nsString& aName) override; virtual mozilla::ipc::IPCResult RecvSetOriginAttributes(const OriginAttributes& aOriginAttributes) override; + virtual mozilla::ipc::IPCResult RecvSetWidgetNativeData(const WindowsHandle& aWidgetNativeData) override; + private: void HandleDoubleTap(const CSSPoint& aPoint, const Modifiers& aModifiers, const ScrollableLayerGuid& aGuid); // Notify others that our TabContext has been updated. // // You should call this after calling TabContext::SetTabContext(). We also // call this during Init(). @@ -876,15 +884,17 @@ private: PDocAccessibleChild* mTopLevelDocAccessibleChild; #endif bool mPendingDocShellIsActive; bool mPendingDocShellPreserveLayers; bool mPendingDocShellReceivedMessage; uint32_t mPendingDocShellBlockers; + WindowsHandle mWidgetNativeData; + DISALLOW_EVIL_CONSTRUCTORS(TabChild); }; } // namespace dom } // namespace mozilla #endif // mozilla_dom_TabChild_h
--- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -287,16 +287,27 @@ TabParent::SetOwnerElement(Element* aEle } } } } #endif AddWindowListeners(); TryCacheDPIAndScale(); + + // Try to send down WidgetNativeData, now that this TabParent is associated + // with a widget. + nsCOMPtr<nsIWidget> widget = GetTopLevelWidget(); + if (widget) { + WindowsHandle widgetNativeData = reinterpret_cast<WindowsHandle>( + widget->GetNativeData(NS_NATIVE_SHAREABLE_WINDOW)); + if (widgetNativeData) { + Unused << SendSetWidgetNativeData(widgetNativeData); + } + } } void TabParent::AddWindowListeners() { if (mFrameElement && mFrameElement->OwnerDoc()) { if (nsCOMPtr<nsPIDOMWindowOuter> window = mFrameElement->OwnerDoc()->GetWindow()) { nsCOMPtr<EventTarget> eventTarget = window->GetTopWindowRoot(); @@ -2314,28 +2325,16 @@ TabParent::GetTopLevelWidget() vm->GetRootWidget(getter_AddRefs(widget)); return widget.forget(); } } return nullptr; } mozilla::ipc::IPCResult -TabParent::RecvGetWidgetNativeData(WindowsHandle* aValue) -{ - *aValue = 0; - nsCOMPtr<nsIWidget> widget = GetTopLevelWidget(); - if (widget) { - *aValue = reinterpret_cast<WindowsHandle>( - widget->GetNativeData(NS_NATIVE_SHAREABLE_WINDOW)); - } - return IPC_OK(); -} - -mozilla::ipc::IPCResult TabParent::RecvSetNativeChildOfShareableWindow(const uintptr_t& aChildWindow) { #if defined(XP_WIN) nsCOMPtr<nsIWidget> widget = GetTopLevelWidget(); if (widget) { // Note that this call will probably cause a sync native message to the // process that owns the child window. widget->SetNativeData(NS_NATIVE_CHILD_OF_SHAREABLE_WINDOW, aChildWindow);
--- a/dom/ipc/TabParent.h +++ b/dom/ipc/TabParent.h @@ -300,18 +300,16 @@ public: virtual mozilla::ipc::IPCResult RecvHideTooltip() override; virtual mozilla::ipc::IPCResult RecvGetDPI(float* aValue) override; virtual mozilla::ipc::IPCResult RecvGetDefaultScale(double* aValue) override; virtual mozilla::ipc::IPCResult RecvGetWidgetRounding(int32_t* aValue) override; - virtual mozilla::ipc::IPCResult RecvGetWidgetNativeData(WindowsHandle* aValue) override; - virtual mozilla::ipc::IPCResult RecvSetNativeChildOfShareableWindow(const uintptr_t& childWindow) override; virtual mozilla::ipc::IPCResult RecvDispatchFocusToTopLevelWindow() override; virtual mozilla::ipc::IPCResult RecvRespondStartSwipeEvent(const uint64_t& aInputBlockId, const bool& aStartSwipe) override; virtual mozilla::ipc::IPCResult
--- a/ipc/ipdl/sync-messages.ini +++ b/ipc/ipdl/sync-messages.ini @@ -812,18 +812,16 @@ description = [PBackgroundMutableFile::GetFileId] description = [PBackgroundIndexedDBUtils::GetFileReferences] description = [PBrowser::SyncMessage] description = [PBrowser::PPluginWidget] description = -[PBrowser::GetWidgetNativeData] -description = [PBrowser::DispatchFocusToTopLevelWindow] description = [PBrowser::NotifyIMEFocus] description = [PBrowser::NotifyIMEMouseButtonEvent] description = [PBrowser::RequestIMEToCommitComposition] description =
--- a/widget/PuppetWidget.cpp +++ b/widget/PuppetWidget.cpp @@ -1184,20 +1184,24 @@ PuppetWidget::RoundsWidgetCoordinatesTo( return mRounding; } void* PuppetWidget::GetNativeData(uint32_t aDataType) { switch (aDataType) { case NS_NATIVE_SHAREABLE_WINDOW: { - MOZ_ASSERT(mTabChild, "Need TabChild to get the nativeWindow from!"); + // NOTE: We can not have a tab child in some situations, such as when we're + // rendering to a fake widget for thumbnails. + if (!mTabChild) { + NS_WARNING("Need TabChild to get the nativeWindow from!"); + } mozilla::WindowsHandle nativeData = 0; if (mTabChild) { - mTabChild->SendGetWidgetNativeData(&nativeData); + nativeData = mTabChild->WidgetNativeData(); } return (void*)nativeData; } case NS_NATIVE_WINDOW: case NS_NATIVE_WIDGET: case NS_NATIVE_DISPLAY: // These types are ignored (see bug 1183828, bug 1240891). break;