From 08c950712e360ae286b518cc4c6599a628ec1f6d Mon Sep 17 00:00:00 2001 From: Csoregi Natalia Date: Fri, 3 Aug 2018 10:39:12 +0300 Subject: [PATCH] Backed out 3 changesets (bug 1479569) for devtools/client/responsive.html failures. CLOSED TREE Backed out changeset e123d0aa911c (bug 1479569) Backed out changeset b828a58404e5 (bug 1479569) Backed out changeset 97041ef8f311 (bug 1479569) --- browser/components/feeds/FeedWriter.js | 6 ++- .../test/browser_send_async_message_oom.js | 5 ++- .../formautofill/FormAutofillContent.jsm | 8 +++- .../pdfjs/content/PdfStreamConverter.jsm | 12 ++++-- .../pdfjs/content/PdfjsContentUtils.jsm | 4 +- browser/modules/ContentObservers.js | 13 +++++- browser/modules/ContentWebRTC.jsm | 12 +++++- browser/modules/FormSubmitObserver.jsm | 5 ++- .../LightWeightThemeWebInstallListener.jsm | 5 ++- .../modules/LightweightThemeChildHelper.jsm | 5 ++- browser/modules/PageStyleHandler.jsm | 4 +- .../client/responsive.html/browser/tunnel.js | 3 +- .../server/actors/targets/browsing-context.js | 8 +++- .../server/actors/targets/content-process.js | 5 ++- docshell/base/nsDocShell.cpp | 25 +++++------ docshell/base/nsIDocShell.idl | 7 --- docshell/shistory/ChildSHistory.cpp | 13 ++---- dom/base/nsCCUncollectableMarker.cpp | 12 +++--- dom/base/nsContentUtils.cpp | 9 ++-- dom/base/nsContentUtils.h | 5 +-- dom/base/nsFrameLoader.cpp | 9 +++- dom/base/nsFrameLoader.h | 5 +-- dom/base/nsFrameMessageManager.cpp | 5 ++- dom/base/nsFrameMessageManager.h | 6 ++- dom/base/nsGlobalWindowInner.cpp | 9 ++-- dom/base/nsGlobalWindowOuter.cpp | 43 ++++++------------- dom/base/nsIMessageManager.idl | 8 +++- dom/base/nsInProcessTabChildGlobal.cpp | 3 +- dom/base/nsInProcessTabChildGlobal.h | 1 + dom/base/nsPIDOMWindow.h | 17 +++----- dom/base/test/chrome/file_bug549682.xul | 2 +- dom/events/test/test_bug1412775.xul | 4 +- dom/interfaces/base/nsITabChild.idl | 4 +- dom/ipc/TabChild.cpp | 5 ++- dom/ipc/TabChild.h | 3 +- dom/ipc/remote-test.js | 5 ++- .../android/modules/FxAccountsWebChannel.jsm | 6 +-- .../specialpowers/content/specialpowersAPI.js | 14 +++--- .../tests/cpstartup/content/cpstartup.html | 4 +- .../tests/tabpaint/content/tabpaint.html | 4 +- .../talos/tests/tabpaint/content/target.html | 4 +- .../components/extensions/ExtensionCommon.jsm | 3 +- .../extensions/ExtensionPageChild.jsm | 4 +- .../components/extensions/MessageChannel.jsm | 2 +- .../extensions/extension-process-script.js | 14 +++++- .../passwordmgr/LoginManagerContent.jsm | 18 +++++--- .../components/passwordmgr/LoginRecipes.jsm | 4 +- toolkit/components/prompts/src/nsPrompter.js | 5 ++- .../components/satchel/nsFormAutoComplete.js | 6 ++- toolkit/components/search/nsSidebar.js | 8 +++- toolkit/content/process-content.js | 4 +- toolkit/modules/E10SUtils.jsm | 5 ++- toolkit/modules/WebChannelContent.jsm | 4 +- toolkit/modules/addons/WebRequestContent.js | 11 +++-- .../mozapps/extensions/amContentHandler.js | 4 +- .../mozapps/extensions/amInstallTrigger.js | 9 +++- toolkit/mozapps/extensions/amWebAPI.js | 5 ++- 57 files changed, 266 insertions(+), 167 deletions(-) diff --git a/browser/components/feeds/FeedWriter.js b/browser/components/feeds/FeedWriter.js index 6d0c2efd1173..fa518bd46778 100644 --- a/browser/components/feeds/FeedWriter.js +++ b/browser/components/feeds/FeedWriter.js @@ -75,8 +75,10 @@ function FeedWriter() { Services.telemetry.scalarAdd("browser.feeds.preview_loaded", 1); - XPCOMUtils.defineLazyGetter(this, "_mm", - () => this._window.docShell.messageManager); + XPCOMUtils.defineLazyGetter(this, "_mm", () => + this._window.docShell. + QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIContentFrameMessageManager)); } FeedWriter.prototype = { diff --git a/browser/components/sessionstore/test/browser_send_async_message_oom.js b/browser/components/sessionstore/test/browser_send_async_message_oom.js index a10699394fd6..1bd638f82281 100644 --- a/browser/components/sessionstore/test/browser_send_async_message_oom.js +++ b/browser/components/sessionstore/test/browser_send_async_message_oom.js @@ -18,7 +18,10 @@ add_task(async function init() { function frameScript() { // Make send[A]syncMessage("SessionStore:update", ...) simulate OOM. // Other operations are unaffected. - let mm = docShell.messageManager; + let mm = docShell.sameTypeRootTreeItem. + QueryInterface(Ci.nsIDocShell). + QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIContentFrameMessageManager); let wrap = function(original) { return function(name, ...args) { diff --git a/browser/extensions/formautofill/FormAutofillContent.jsm b/browser/extensions/formautofill/FormAutofillContent.jsm index 38f134a9be95..71f3790836de 100644 --- a/browser/extensions/formautofill/FormAutofillContent.jsm +++ b/browser/extensions/formautofill/FormAutofillContent.jsm @@ -266,7 +266,9 @@ let ProfileAutocomplete = { }, _frameMMFromWindow(contentWindow) { - return contentWindow.docShell.messageManager; + return contentWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); }, _getSelectedIndex(contentWindow) { @@ -628,7 +630,9 @@ var FormAutofillContent = { }, _messageManagerFromWindow(win) { - return win.docShell.messageManager; + return win.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); }, _onKeyDown(e) { diff --git a/browser/extensions/pdfjs/content/PdfStreamConverter.jsm b/browser/extensions/pdfjs/content/PdfStreamConverter.jsm index 7e50b5b7aac4..7ce4410b0bfc 100644 --- a/browser/extensions/pdfjs/content/PdfStreamConverter.jsm +++ b/browser/extensions/pdfjs/content/PdfStreamConverter.jsm @@ -412,7 +412,9 @@ class ChromeActions { getLocalizedString(strings, "open_with_different_viewer"), getLocalizedString(strings, "open_with_different_viewer", "accessKey")); - let winmm = domWindow.docShell.messageManager; + let winmm = domWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); winmm.addMessageListener("PDFJS:Child:fallbackDownload", function fallbackDownload(msg) { @@ -437,7 +439,9 @@ class ChromeActions { return; } - var winmm = this.domWindow.docShell.messageManager; + var winmm = this.domWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); winmm.sendAsyncMessage("PDFJS:Parent:updateControlState", data); } @@ -751,7 +755,9 @@ class RequestListener { class FindEventManager { constructor(contentWindow) { this.contentWindow = contentWindow; - this.winmm = contentWindow.docShell.messageManager; + this.winmm = contentWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); } bind() { diff --git a/browser/extensions/pdfjs/content/PdfjsContentUtils.jsm b/browser/extensions/pdfjs/content/PdfjsContentUtils.jsm index af2498719088..babe9bbcc3de 100644 --- a/browser/extensions/pdfjs/content/PdfjsContentUtils.jsm +++ b/browser/extensions/pdfjs/content/PdfjsContentUtils.jsm @@ -72,7 +72,9 @@ var PdfjsContentUtils = { */ displayWarning(aWindow, aMessage, aLabel, aAccessKey) { // the child's dom frame mm associated with the window. - let winmm = aWindow.docShell.messageManager; + let winmm = aWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); winmm.sendAsyncMessage("PDFJS:Parent:displayWarning", { message: aMessage, label: aLabel, diff --git a/browser/modules/ContentObservers.js b/browser/modules/ContentObservers.js index 33366830e51e..7f2c367b0bf0 100644 --- a/browser/modules/ContentObservers.js +++ b/browser/modules/ContentObservers.js @@ -37,7 +37,18 @@ var gDecoderDoctorObserver = function(subject, topic, data) { }; function getMessageManagerForWindow(aContentWindow) { - return aContentWindow.docShell.messageManager; + let ir = aContentWindow.docShell + .sameTypeRootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor); + try { + // If e10s is disabled, this throws NS_NOINTERFACE for closed tabs. + return ir.getInterface(Ci.nsIContentFrameMessageManager); + } catch (e) { + if (e.result == Cr.NS_NOINTERFACE) { + return null; + } + throw e; + } } Services.obs.addObserver(gEMEUIObserver, "mediakeys-request"); diff --git a/browser/modules/ContentWebRTC.jsm b/browser/modules/ContentWebRTC.jsm index ff247cf4d8fe..c81a97a8325b 100644 --- a/browser/modules/ContentWebRTC.jsm +++ b/browser/modules/ContentWebRTC.jsm @@ -425,5 +425,15 @@ function getMessageManagerForWindow(aContentWindow) { return null; } - return docShell.messageManager; + let ir = docShell.sameTypeRootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor); + try { + // This throws NS_NOINTERFACE for closed tabs (only with e10s enabled). + return ir.getInterface(Ci.nsIContentFrameMessageManager); + } catch (e) { + if (e.result == Cr.NS_NOINTERFACE) { + return null; + } + throw e; + } } diff --git a/browser/modules/FormSubmitObserver.jsm b/browser/modules/FormSubmitObserver.jsm index 25c0c5dc89e4..6f2cf9116198 100644 --- a/browser/modules/FormSubmitObserver.jsm +++ b/browser/modules/FormSubmitObserver.jsm @@ -36,7 +36,10 @@ FormSubmitObserver.prototype = this._content = aWindow; this._tab = aTabChildGlobal; this._mm = - this._content.docShell.messageManager; + this._content.docShell + .sameTypeRootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); this._tab.addEventListener("pageshow", this); this._tab.addEventListener("unload", this); diff --git a/browser/modules/LightWeightThemeWebInstallListener.jsm b/browser/modules/LightWeightThemeWebInstallListener.jsm index c98e4a8bf76d..1ae3b9a8a383 100644 --- a/browser/modules/LightWeightThemeWebInstallListener.jsm +++ b/browser/modules/LightWeightThemeWebInstallListener.jsm @@ -51,5 +51,8 @@ var LightWeightThemeWebInstallListener = { }; function getMessageManagerForContent(content) { - return content.docShell.messageManager; + return content.docShell + .sameTypeRootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); } diff --git a/browser/modules/LightweightThemeChildHelper.jsm b/browser/modules/LightweightThemeChildHelper.jsm index 282a32cc9b79..53d64ce4118e 100644 --- a/browser/modules/LightweightThemeChildHelper.jsm +++ b/browser/modules/LightweightThemeChildHelper.jsm @@ -41,7 +41,10 @@ var LightweightThemeChildHelper = { const windowEnumerator = Services.ww.getWindowEnumerator(); while (windowEnumerator.hasMoreElements()) { const window = windowEnumerator.getNext().QueryInterface(Ci.nsIDOMWindow); - const tabChildGlobal = window.docShell.messageManager; + const tabChildGlobal = window.docShell + .sameTypeRootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); const {chromeOuterWindowID, content} = tabChildGlobal; if (changedKeys.includes(`theme/${chromeOuterWindowID}`) && content && this.whitelist.has(content.document.documentURI)) { diff --git a/browser/modules/PageStyleHandler.jsm b/browser/modules/PageStyleHandler.jsm index 8c67d0629f07..e2d5af2c1753 100644 --- a/browser/modules/PageStyleHandler.jsm +++ b/browser/modules/PageStyleHandler.jsm @@ -50,7 +50,9 @@ var PageStyleHandler = { return; } - let mm = win.docShell.messageManager; + let mm = win.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); this.sendStyleSheetInfo(mm); }, diff --git a/devtools/client/responsive.html/browser/tunnel.js b/devtools/client/responsive.html/browser/tunnel.js index 03f144941197..ada4e651d990 100644 --- a/devtools/client/responsive.html/browser/tunnel.js +++ b/devtools/client/responsive.html/browser/tunnel.js @@ -472,7 +472,8 @@ MessageManagerTunnel.prototype = { // non-remote, so we're able to reach into its window and use the child // side message manager there. const docShell = this.outer[FRAME_LOADER].docShell; - return docShell.messageManager; + return docShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); }, get inner() { diff --git a/devtools/server/actors/targets/browsing-context.js b/devtools/server/actors/targets/browsing-context.js index d48cdfbefe5b..8dbeea954cd4 100644 --- a/devtools/server/actors/targets/browsing-context.js +++ b/devtools/server/actors/targets/browsing-context.js @@ -314,7 +314,13 @@ const browsingContextTargetPrototype = { * Getter for the nsIMessageManager associated to the browsing context. */ get messageManager() { - return this.docShell.messageManager; + try { + return this.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); + } catch (e) { + return null; + } }, /** diff --git a/devtools/server/actors/targets/content-process.js b/devtools/server/actors/targets/content-process.js index 92366fcb40f5..32a9d5595345 100644 --- a/devtools/server/actors/targets/content-process.js +++ b/devtools/server/actors/targets/content-process.js @@ -42,7 +42,10 @@ function ContentProcessTargetActor(connection) { const windowEnumerator = Services.ww.getWindowEnumerator(); while (windowEnumerator.hasMoreElements()) { const window = windowEnumerator.getNext().QueryInterface(Ci.nsIDOMWindow); - const tabChildGlobal = window.docShell.messageManager; + const tabChildGlobal = window.docShell + .sameTypeRootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); tabs.push(tabChildGlobal); } return tabs; diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index efba5da0c751..4dbbc6b7ae46 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -39,7 +39,6 @@ #include "mozilla/dom/ClientManager.h" #include "mozilla/dom/ClientSource.h" #include "mozilla/dom/ContentChild.h" -#include "mozilla/dom/ContentFrameMessageManager.h" #include "mozilla/dom/DocGroup.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/HTMLAnchorElement.h" @@ -639,6 +638,17 @@ nsDocShell::GetInterface(const nsIID& aIID, void** aSink) } else if (aIID.Equals(NS_GET_IID(nsITabChild))) { *aSink = GetTabChild().take(); return *aSink ? NS_OK : NS_ERROR_FAILURE; + } else if (aIID.Equals(NS_GET_IID(nsIContentFrameMessageManager))) { + RefPtr tabChild = TabChild::GetFrom(this); + nsCOMPtr mm; + if (tabChild) { + mm = tabChild->GetMessageManager(); + } else { + if (nsPIDOMWindowOuter* win = GetWindow()) { + mm = do_QueryInterface(win->GetParentTarget()); + } + } + *aSink = mm.get(); } else { return nsDocLoader::GetInterface(aIID, aSink); } @@ -3966,19 +3976,6 @@ nsDocShell::GetDomWindow(mozIDOMWindowProxy** aWindow) return NS_OK; } -NS_IMETHODIMP -nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) -{ - RefPtr mm; - if (RefPtr tabChild = TabChild::GetFrom(this)) { - mm = tabChild->GetMessageManager(); - } else if (nsPIDOMWindowOuter* win = GetWindow()) { - mm = win->GetMessageManager(); - } - mm.forget(aMessageManager); - return NS_OK; -} - NS_IMETHODIMP nsDocShell::SetDeviceSizeIsPageSize(bool aValue) { diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl index 7d49bbd7b111..3295b129a774 100644 --- a/docshell/base/nsIDocShell.idl +++ b/docshell/base/nsIDocShell.idl @@ -65,7 +65,6 @@ interface nsILoadURIDelegate; native TabChildRef(already_AddRefed); native nsDocShellLoadInfoPtr(nsDocShellLoadInfo*); -webidl ContentFrameMessageManager; webidl EventTarget; [scriptable, builtinclass, uuid(049234fe-da10-478b-bc5d-bc6f9a1ba63d)] @@ -1201,10 +1200,4 @@ interface nsIDocShell : nsIDocShellTreeItem * Media queries only look at the value in the top-most docshell. */ attribute unsigned long displayMode; - - /** - * The message manager for this docshell. This does not throw, but - * can return null if the docshell has no message manager. - */ - [infallible] readonly attribute ContentFrameMessageManager messageManager; }; diff --git a/docshell/shistory/ChildSHistory.cpp b/docshell/shistory/ChildSHistory.cpp index 0d21f63f9139..588bd2b12c54 100644 --- a/docshell/shistory/ChildSHistory.cpp +++ b/docshell/shistory/ChildSHistory.cpp @@ -6,7 +6,6 @@ #include "mozilla/dom/ChildSHistory.h" #include "mozilla/dom/ChildSHistoryBinding.h" -#include "mozilla/dom/ContentFrameMessageManager.h" #include "nsIMessageManager.h" #include "nsComponentManagerUtils.h" #include "nsSHistory.h" @@ -21,7 +20,6 @@ ChildSHistory::ChildSHistory(nsDocShell* aDocShell) : mDocShell(aDocShell) , mHistory(new nsSHistory()) { - MOZ_ASSERT(mDocShell); mHistory->SetRootDocShell(mDocShell); } @@ -133,13 +131,10 @@ nsISupports* ChildSHistory::GetParentObject() const { // We want to get the TabChildGlobal, which is the - // messageManager on mDocShell. - RefPtr mm; - if (mDocShell) { - mm = mDocShell->GetMessageManager(); - } - // else we must be unlinked... can that happen here? - return ToSupports(mm); + // nsIContentFrameMessageManager on mDocShell. + nsCOMPtr mm = + do_GetInterface(static_cast(mDocShell)); + return mm; } } // namespace dom diff --git a/dom/base/nsCCUncollectableMarker.cpp b/dom/base/nsCCUncollectableMarker.cpp index 3cb9c70fa3ea..0c93a584300c 100644 --- a/dom/base/nsCCUncollectableMarker.cpp +++ b/dom/base/nsCCUncollectableMarker.cpp @@ -31,7 +31,6 @@ #include "mozilla/CycleCollectedJSRuntime.h" #include "mozilla/EventListenerManager.h" #include "mozilla/dom/ChromeMessageBroadcaster.h" -#include "mozilla/dom/ContentFrameMessageManager.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/ParentProcessMessageManager.h" #include "mozilla/dom/ProcessGlobal.h" @@ -120,11 +119,11 @@ MarkChildMessageManagers(MessageBroadcaster* aMM) mozilla::dom::ipc::MessageManagerCallback* cb = tabMM->GetCallback(); if (cb) { nsFrameLoader* fl = static_cast(cb); - nsInProcessTabChildGlobal* et = fl->GetTabChildGlobal(); + EventTarget* et = fl->GetTabChildGlobalAsEventTarget(); if (!et) { continue; } - et->MarkForCC(); + static_cast(et)->MarkForCC(); EventListenerManager* elm = et->GetExistingListenerManager(); if (elm) { elm->MarkForCC(); @@ -509,13 +508,14 @@ mozilla::dom::TraceBlackJS(JSTracer* aTrc, bool aIsShutdownGC) if (ds) { nsCOMPtr tabChild = ds->GetTabChild(); if (tabChild) { - RefPtr mm; + nsCOMPtr mm; tabChild->GetMessageManager(getter_AddRefs(mm)); - if (mm) { + nsCOMPtr et = do_QueryInterface(mm); + if (et) { nsCOMPtr tabChildAsSupports = do_QueryInterface(tabChild); mozilla::TraceScriptHolder(tabChildAsSupports, aTrc); - EventListenerManager* elm = mm->GetExistingListenerManager(); + EventListenerManager* elm = et->GetExistingListenerManager(); if (elm) { elm->TraceListeners(aTrc); } diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index c75cb6916258..5ecc21c01ac1 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -121,7 +121,6 @@ #include "nsHtml5StringParser.h" #include "nsHTMLDocument.h" #include "nsHTMLTags.h" -#include "nsInProcessTabChildGlobal.h" #include "nsIAddonPolicyService.h" #include "nsIAnonymousContentCreator.h" #include "nsIAsyncVerifyRedirectCallback.h" @@ -11088,8 +11087,8 @@ nsContentUtils::ContentIsLink(nsIContent* aContent) kNameSpaceID_XLink, nsGkAtoms::type, nsGkAtoms::simple, eCaseMatters); } -/* static */ already_AddRefed -nsContentUtils::TryGetTabChildGlobal(nsISupports* aFrom) +/* static */ already_AddRefed +nsContentUtils::TryGetTabChildGlobalAsEventTarget(nsISupports* aFrom) { nsCOMPtr frameLoaderOwner = do_QueryInterface(aFrom); if (!frameLoaderOwner) { @@ -11101,8 +11100,8 @@ nsContentUtils::TryGetTabChildGlobal(nsISupports* aFrom) return nullptr; } - RefPtr manager = frameLoader->GetTabChildGlobal(); - return manager.forget(); + nsCOMPtr target = frameLoader->GetTabChildGlobalAsEventTarget(); + return target.forget(); } /* static */ uint32_t diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 76fee91fbd11..8b25fb6bc1c9 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -124,7 +124,6 @@ class EventListenerManager; class HTMLEditor; namespace dom { -class ContentFrameMessageManager; struct CustomElementDefinition; class DocumentFragment; class Element; @@ -3243,8 +3242,8 @@ public: static bool ContentIsLink(nsIContent* aContent); - static already_AddRefed - TryGetTabChildGlobal(nsISupports* aFrom); + static already_AddRefed + TryGetTabChildGlobalAsEventTarget(nsISupports* aFrom); static PopupControlState PushPopupControlState(PopupControlState aState, bool aForce) diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index d6ffe41e0107..76936643d54e 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -2820,7 +2820,8 @@ nsFrameLoader::DoLoadMessageManagerScript(const nsAString& aURL, bool aRunInGlob if (tabParent) { return tabParent->SendLoadRemoteScript(nsString(aURL), aRunInGlobalScope); } - RefPtr tabChild = GetTabChildGlobal(); + RefPtr tabChild = + static_cast(GetTabChildGlobalAsEventTarget()); if (tabChild) { tabChild->LoadFrameScript(aURL, aRunInGlobalScope); } @@ -2978,6 +2979,12 @@ nsFrameLoader::ReallyLoadFrameScripts() return NS_OK; } +EventTarget* +nsFrameLoader::GetTabChildGlobalAsEventTarget() +{ + return mChildMessageManager.get(); +} + already_AddRefed nsFrameLoader::GetOwnerElement() { diff --git a/dom/base/nsFrameLoader.h b/dom/base/nsFrameLoader.h index 916e73de8a74..84b8d1d3547c 100644 --- a/dom/base/nsFrameLoader.h +++ b/dom/base/nsFrameLoader.h @@ -106,10 +106,7 @@ public: void DestroyDocShell(); void DestroyComplete(); nsIDocShell* GetExistingDocShell() { return mDocShell; } - nsInProcessTabChildGlobal* GetTabChildGlobal() const - { - return mChildMessageManager; - } + mozilla::dom::EventTarget* GetTabChildGlobalAsEventTarget(); nsresult CreateStaticClone(nsFrameLoader* aDest); nsresult UpdatePositionAndSize(nsSubDocumentFrame *aIFrame); diff --git a/dom/base/nsFrameMessageManager.cpp b/dom/base/nsFrameMessageManager.cpp index 5f66c799773f..611588da2de3 100644 --- a/dom/base/nsFrameMessageManager.cpp +++ b/dom/base/nsFrameMessageManager.cpp @@ -145,7 +145,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsFrameMessageManager) - NS_INTERFACE_MAP_ENTRY(nsISupports) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIContentFrameMessageManager) /* Message managers in child process implement nsIMessageSender. Message managers in the chrome process are @@ -153,6 +153,9 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsFrameMessageManager) managers) or they're simple message senders. */ NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIMessageSender, !mChrome || !mIsBroadcaster) + /* nsIContentFrameMessageManager is accessible only in TabChildGlobal. */ + NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIContentFrameMessageManager, + !mChrome && !mIsProcessManager) NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTING_ADDREF(nsFrameMessageManager) diff --git a/dom/base/nsFrameMessageManager.h b/dom/base/nsFrameMessageManager.h index 810c40f020ee..74a206b79c40 100644 --- a/dom/base/nsFrameMessageManager.h +++ b/dom/base/nsFrameMessageManager.h @@ -161,7 +161,7 @@ private: JS::Rooted mObj; }; -class nsFrameMessageManager : public nsIMessageSender +class nsFrameMessageManager : public nsIContentFrameMessageManager { friend class mozilla::dom::MessageManagerReporter; typedef mozilla::dom::ipc::StructuredCloneData StructuredCloneData; @@ -180,7 +180,8 @@ public: {} NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsFrameMessageManager) + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsFrameMessageManager, + nsIContentFrameMessageManager) void MarkForCC(); @@ -242,6 +243,7 @@ public: mozilla::dom::ipc::WritableSharedMap* SharedData(); NS_DECL_NSIMESSAGESENDER + NS_DECL_NSICONTENTFRAMEMESSAGEMANAGER static mozilla::dom::ProcessMessageManager* NewProcessMessageManager(bool aIsRemote); diff --git a/dom/base/nsGlobalWindowInner.cpp b/dom/base/nsGlobalWindowInner.cpp index 373b4f8076de..58e2a46c8ee9 100644 --- a/dom/base/nsGlobalWindowInner.cpp +++ b/dom/base/nsGlobalWindowInner.cpp @@ -18,7 +18,6 @@ #include "nsDOMNavigationTiming.h" #include "nsIDOMStorageManager.h" #include "mozilla/AutoplayPermissionManager.h" -#include "mozilla/dom/ContentFrameMessageManager.h" #include "mozilla/dom/DOMJSProxyHandler.h" #include "mozilla/dom/DOMPrefs.h" #include "mozilla/dom/EventTarget.h" @@ -1911,18 +1910,20 @@ nsGlobalWindowInner::UpdateParentTarget() nsCOMPtr frameElement = GetOuterWindow()->GetFrameElementInternal(); nsCOMPtr eventTarget = - nsContentUtils::TryGetTabChildGlobal(frameElement); + nsContentUtils::TryGetTabChildGlobalAsEventTarget(frameElement); if (!eventTarget) { nsGlobalWindowOuter* topWin = GetScriptableTopInternal(); if (topWin) { frameElement = topWin->AsOuter()->GetFrameElementInternal(); - eventTarget = nsContentUtils::TryGetTabChildGlobal(frameElement); + eventTarget = + nsContentUtils::TryGetTabChildGlobalAsEventTarget(frameElement); } } if (!eventTarget) { - eventTarget = nsContentUtils::TryGetTabChildGlobal(mChromeEventHandler); + eventTarget = + nsContentUtils::TryGetTabChildGlobalAsEventTarget(mChromeEventHandler); } if (!eventTarget) { diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp index 6467b2525b1f..894086f1c095 100644 --- a/dom/base/nsGlobalWindowOuter.cpp +++ b/dom/base/nsGlobalWindowOuter.cpp @@ -20,7 +20,6 @@ #include "nsISecureBrowserUI.h" #include "nsIWebProgressListener.h" #include "mozilla/AntiTrackingCommon.h" -#include "mozilla/dom/ContentFrameMessageManager.h" #include "mozilla/dom/EventTarget.h" #include "mozilla/dom/LocalStorage.h" #include "mozilla/dom/Storage.h" @@ -1039,7 +1038,6 @@ nsGlobalWindowOuter::CleanUp() } mChromeEventHandler = nullptr; // Forces Release mParentTarget = nullptr; - mMessageManager = nullptr; mArguments = nullptr; @@ -1146,7 +1144,6 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsGlobalWindowOuter) // Traverse stuff from nsPIDOMWindow NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChromeEventHandler) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mParentTarget) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMessageManager) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFrameElement) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOpenerForInitialContentBrowser) @@ -1173,7 +1170,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindowOuter) // Unlink stuff from nsPIDOMWindow NS_IMPL_CYCLE_COLLECTION_UNLINK(mChromeEventHandler) NS_IMPL_CYCLE_COLLECTION_UNLINK(mParentTarget) - NS_IMPL_CYCLE_COLLECTION_UNLINK(mMessageManager) NS_IMPL_CYCLE_COLLECTION_UNLINK(mFrameElement) NS_IMPL_CYCLE_COLLECTION_UNLINK(mOpenerForInitialContentBrowser) @@ -2240,10 +2236,9 @@ nsGlobalWindowOuter::SetOpenerWindow(nsPIDOMWindowOuter* aOpener, void nsGlobalWindowOuter::UpdateParentTarget() { - // NOTE: This method is nearly identical to + // NOTE: This method is identical to // nsGlobalWindowInner::UpdateParentTarget(). IF YOU UPDATE THIS METHOD, - // UPDATE THE OTHER ONE TOO! The one difference is that this method updates - // mMessageManager as well, which inner windows don't have. + // UPDATE THE OTHER ONE TOO! // Try to get our frame element's tab child global (its in-process message // manager). If that fails, fall back to the chrome event handler's tab @@ -2251,25 +2246,28 @@ nsGlobalWindowOuter::UpdateParentTarget() // handler itself. nsCOMPtr frameElement = GetOuterWindow()->GetFrameElementInternal(); - mMessageManager = nsContentUtils::TryGetTabChildGlobal(frameElement); + nsCOMPtr eventTarget = + nsContentUtils::TryGetTabChildGlobalAsEventTarget(frameElement); - if (!mMessageManager) { + if (!eventTarget) { nsGlobalWindowOuter* topWin = GetScriptableTopInternal(); if (topWin) { frameElement = topWin->GetFrameElementInternal(); - mMessageManager = nsContentUtils::TryGetTabChildGlobal(frameElement); + eventTarget = + nsContentUtils::TryGetTabChildGlobalAsEventTarget(frameElement); } } - if (!mMessageManager) { - mMessageManager = nsContentUtils::TryGetTabChildGlobal(mChromeEventHandler); + if (!eventTarget) { + eventTarget = + nsContentUtils::TryGetTabChildGlobalAsEventTarget(mChromeEventHandler); } - if (mMessageManager) { - mParentTarget = mMessageManager; - } else { - mParentTarget = mChromeEventHandler; + if (!eventTarget) { + eventTarget = mChromeEventHandler; } + + mParentTarget = eventTarget; } EventTarget* @@ -7629,19 +7627,6 @@ nsPIDOMWindowOuter::MaybeCreateDoc() } } -void -nsPIDOMWindowOuter::SetChromeEventHandlerInternal(EventTarget* aChromeEventHandler) -{ - // Out-of-line so we don't need to include ContentFrameMessageManager.h in - // nsPIDOMWindow.h. - mChromeEventHandler = aChromeEventHandler; - - // mParentTarget and mMessageManager will be set when the next event is - // dispatched or someone asks for our message manager. - mParentTarget = nullptr; - mMessageManager = nullptr; -} - mozilla::dom::DocGroup* nsPIDOMWindowOuter::GetDocGroup() const { diff --git a/dom/base/nsIMessageManager.idl b/dom/base/nsIMessageManager.idl index e288bf089c5b..3ef062dd1ecd 100644 --- a/dom/base/nsIMessageManager.idl +++ b/dom/base/nsIMessageManager.idl @@ -13,8 +13,14 @@ interface nsIMessageSender : nsISupports { }; +// NOTE: Only scriptable for Ci.nsIContentFrameMessageManager +[scriptable, builtinclass, uuid(694e367c-aa25-4446-8499-2c527c4bd838)] +interface nsIContentFrameMessageManager : nsIMessageSender +{ +}; + [uuid(b39a3324-b574-4f85-8cdb-274d04f807ef)] -interface nsIInProcessContentFrameMessageManager : nsIMessageSender +interface nsIInProcessContentFrameMessageManager : nsIContentFrameMessageManager { [notxpcom] nsIContent getOwnerContent(); }; diff --git a/dom/base/nsInProcessTabChildGlobal.cpp b/dom/base/nsInProcessTabChildGlobal.cpp index d7a4121277b9..6652f283ab77 100644 --- a/dom/base/nsInProcessTabChildGlobal.cpp +++ b/dom/base/nsInProcessTabChildGlobal.cpp @@ -166,6 +166,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsInProcessTabChildGlobal) NS_INTERFACE_MAP_ENTRY(nsIMessageSender) + NS_INTERFACE_MAP_ENTRY(nsIContentFrameMessageManager) NS_INTERFACE_MAP_ENTRY(nsIInProcessContentFrameMessageManager) NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal) NS_INTERFACE_MAP_ENTRY(nsIGlobalObject) @@ -294,7 +295,7 @@ nsInProcessTabChildGlobal::GetEventTargetParent(EventChainPreVisitor& aVisitor) nsCOMPtr owner = do_QueryInterface(mOwner); RefPtr fl = owner->GetFrameLoader(); if (fl) { - NS_ASSERTION(this == fl->GetTabChildGlobal(), + NS_ASSERTION(this == fl->GetTabChildGlobalAsEventTarget(), "Wrong event target!"); NS_ASSERTION(fl->mMessageManager == mChromeMessageManager, "Wrong message manager!"); diff --git a/dom/base/nsInProcessTabChildGlobal.h b/dom/base/nsInProcessTabChildGlobal.h index b0371e41b82c..fcaf88e6b5f5 100644 --- a/dom/base/nsInProcessTabChildGlobal.h +++ b/dom/base/nsInProcessTabChildGlobal.h @@ -84,6 +84,7 @@ public: virtual uint64_t ChromeOuterWindowID() override; NS_FORWARD_SAFE_NSIMESSAGESENDER(mMessageManager) + NS_DECL_NSICONTENTFRAMEMESSAGEMANAGER NS_DECL_NSIINPROCESSCONTENTFRAMEMESSAGEMANAGER diff --git a/dom/base/nsPIDOMWindow.h b/dom/base/nsPIDOMWindow.h index c01d1063ecb4..66a0c513b501 100644 --- a/dom/base/nsPIDOMWindow.h +++ b/dom/base/nsPIDOMWindow.h @@ -51,7 +51,6 @@ namespace dom { class AudioContext; class ClientInfo; class ClientState; -class ContentFrameMessageManager; class DocGroup; class TabGroup; class Element; @@ -873,15 +872,6 @@ public: return mParentTarget; } - mozilla::dom::ContentFrameMessageManager* GetMessageManager() - { - // We maintain our mMessageManager state alongside mParentTarget. - if (!mParentTarget) { - UpdateParentTarget(); - } - return mMessageManager; - } - nsIDocument* GetExtantDoc() const { return mDoc; @@ -1170,7 +1160,11 @@ protected: // we have what it takes to do so. void MaybeCreateDoc(); - void SetChromeEventHandlerInternal(mozilla::dom::EventTarget* aChromeEventHandler); + void SetChromeEventHandlerInternal(mozilla::dom::EventTarget* aChromeEventHandler) { + mChromeEventHandler = aChromeEventHandler; + // mParentTarget will be set when the next event is dispatched. + mParentTarget = nullptr; + } virtual void UpdateParentTarget() = 0; @@ -1183,7 +1177,6 @@ protected: nsCOMPtr mDocumentURI; // strong nsCOMPtr mParentTarget; // strong - RefPtr mMessageManager; // strong nsCOMPtr mFrameElement; diff --git a/dom/base/test/chrome/file_bug549682.xul b/dom/base/test/chrome/file_bug549682.xul index 91c4f9b203a6..a0eee7c0185e 100644 --- a/dom/base/test/chrome/file_bug549682.xul +++ b/dom/base/test/chrome/file_bug549682.xul @@ -142,7 +142,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=549682 var docShell = document.getElementById('ifr').contentWindow.docShell; ok(docShell, "Should have docshell"); - var cfmm = docShell.messageManager; + var cfmm = docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIContentFrameMessageManager); ok(cfmm, "Should have content messageManager"); var didGetSyncMessage = false; diff --git a/dom/events/test/test_bug1412775.xul b/dom/events/test/test_bug1412775.xul index fa06cc01a5e1..d91e8fc24f0a 100644 --- a/dom/events/test/test_bug1412775.xul +++ b/dom/events/test/test_bug1412775.xul @@ -30,7 +30,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1412775 b.addEventListener("foo", function(e) { didCallChromeSide = true; var path = e.composedPath(); - var mm = d.defaultView.docShell.messageManager; + var mm = d.defaultView.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); is(path.length, 5, "Should have 5 items in composedPath in chrome."); is(path[0], mm, "TabChildGlobal is the chrome handler."); is(path[1], b, "browser element should be in the path."); diff --git a/dom/interfaces/base/nsITabChild.idl b/dom/interfaces/base/nsITabChild.idl index 0562a16a7c95..9d617fc0bf72 100644 --- a/dom/interfaces/base/nsITabChild.idl +++ b/dom/interfaces/base/nsITabChild.idl @@ -8,15 +8,13 @@ interface nsIWebBrowserChrome3; -webidl ContentFrameMessageManager; - native CommandsArray(nsTArray); [ref] native CommandsArrayRef(nsTArray); [scriptable, uuid(1fb79c27-e760-4088-b19c-1ce3673ec24e)] interface nsITabChild : nsISupports { - readonly attribute ContentFrameMessageManager messageManager; + readonly attribute nsISupports messageManager; attribute nsIWebBrowserChrome3 webBrowserChrome; diff --git a/dom/ipc/TabChild.cpp b/dom/ipc/TabChild.cpp index 7e6d0367bebf..67c06b2112ed 100644 --- a/dom/ipc/TabChild.cpp +++ b/dom/ipc/TabChild.cpp @@ -2993,9 +2993,9 @@ TabChild::IsVisible() } NS_IMETHODIMP -TabChild::GetMessageManager(ContentFrameMessageManager** aResult) +TabChild::GetMessageManager(nsISupports** aResult) { - RefPtr mm(mTabChildGlobal); + nsCOMPtr mm(mTabChildGlobal); mm.forget(aResult); return *aResult ? NS_OK : NS_ERROR_FAILURE; } @@ -3551,6 +3551,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TabChildGlobal) NS_INTERFACE_MAP_ENTRY(nsIMessageSender) + NS_INTERFACE_MAP_ENTRY(nsIContentFrameMessageManager) NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal) NS_INTERFACE_MAP_ENTRY(nsIGlobalObject) NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) diff --git a/dom/ipc/TabChild.h b/dom/ipc/TabChild.h index 20a093f3d5c1..90de0aa08ad3 100644 --- a/dom/ipc/TabChild.h +++ b/dom/ipc/TabChild.h @@ -80,7 +80,7 @@ class CoalescedMouseData; class CoalescedWheelData; class TabChildGlobal : public ContentFrameMessageManager, - public nsIMessageSender, + public nsIContentFrameMessageManager, public nsIScriptObjectPrincipal, public nsIGlobalObject, public nsSupportsWeakReference @@ -108,6 +108,7 @@ public: virtual uint64_t ChromeOuterWindowID() override; NS_FORWARD_SAFE_NSIMESSAGESENDER(mMessageManager) + NS_DECL_NSICONTENTFRAMEMESSAGEMANAGER void GetEventTargetParent(EventChainPreVisitor& aVisitor) override diff --git a/dom/ipc/remote-test.js b/dom/ipc/remote-test.js index e72c27c76fdd..72b31b29e611 100644 --- a/dom/ipc/remote-test.js +++ b/dom/ipc/remote-test.js @@ -21,8 +21,9 @@ addEventListener("click", dump(e.target + "\n"); if (ChromeUtils.getClassName(e.target) === "HTMLAnchorElement" && dshell == docShell) { - var retval = docShell.messageManager - .sendSyncMessage("linkclick", { href: e.target.href }); + var retval = docShell.QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIContentFrameMessageManager). + sendSyncMessage("linkclick", { href: e.target.href }); dump(uneval(retval[0]) + "\n"); // Test here also that both retvals are the same sendAsyncMessage("linkclick-reply-object", uneval(retval[0]) == uneval(retval[1]) ? retval[0] : ""); diff --git a/mobile/android/modules/FxAccountsWebChannel.jsm b/mobile/android/modules/FxAccountsWebChannel.jsm index 43e1365367c3..86f0588e4a47 100644 --- a/mobile/android/modules/FxAccountsWebChannel.jsm +++ b/mobile/android/modules/FxAccountsWebChannel.jsm @@ -196,9 +196,9 @@ this.FxAccountsWebChannel.prototype = { switch (command) { case COMMAND_LOADED: - // Note: we want the child side of the message manager here, not the - // parent, so get it from the docshell, not the browser. - let mm = sendingContext.browser.docShell.messageManager; + let mm = sendingContext.browser.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); mm.sendAsyncMessage(COMMAND_LOADED); break; diff --git a/testing/specialpowers/content/specialpowersAPI.js b/testing/specialpowers/content/specialpowersAPI.js index e8bd447f3f9f..3547ed4e8f24 100644 --- a/testing/specialpowers/content/specialpowersAPI.js +++ b/testing/specialpowers/content/specialpowersAPI.js @@ -1754,14 +1754,14 @@ SpecialPowersAPI.prototype = { aWindow.focus(); var mm = global; if (aWindow) { - let windowMM = aWindow.docShell.messageManager; - if (windowMM) { - mm = windowMM; + try { + mm = aWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); + } catch (ex) { + /* Ignore exceptions for e.g. XUL chrome windows from mochitest-chrome + * which won't have a message manager */ } - /* - * Otherwise (e.g. XUL chrome windows from mochitest-chrome which won't - * have a message manager) just stick with "global". - */ } mm.sendAsyncMessage("SpecialPowers.Focus", {}); }, diff --git a/testing/talos/talos/tests/cpstartup/content/cpstartup.html b/testing/talos/talos/tests/cpstartup/content/cpstartup.html index 8fae4cfbaab5..816a95c128eb 100644 --- a/testing/talos/talos/tests/cpstartup/content/cpstartup.html +++ b/testing/talos/talos/tests/cpstartup/content/cpstartup.html @@ -4,7 +4,9 @@ function init() { if (document.location.hash.indexOf("#auto") == 0) { - let mm = window.docShell.messageManager; + let mm = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); mm.addMessageListener("CPStartup:FinalResults", function onResults(msg) { mm.removeMessageListener("CPStartup:FinalResults", onResults); diff --git a/testing/talos/talos/tests/tabpaint/content/tabpaint.html b/testing/talos/talos/tests/tabpaint/content/tabpaint.html index 4089bf6b9dc5..3320902f2885 100644 --- a/testing/talos/talos/tests/tabpaint/content/tabpaint.html +++ b/testing/talos/talos/tests/tabpaint/content/tabpaint.html @@ -4,7 +4,9 @@ function init() { if (document.location.hash.indexOf("#auto") == 0) { - let mm = window.docShell.messageManager; + let mm = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); mm.addMessageListener("TabPaint:FinalResults", function onResults(msg) { mm.removeMessageListener("TabPaint:FinalResults", onResults); diff --git a/testing/talos/talos/tests/tabpaint/content/target.html b/testing/talos/talos/tests/tabpaint/content/target.html index 388a70630bb6..99a700796508 100644 --- a/testing/talos/talos/tests/tabpaint/content/target.html +++ b/testing/talos/talos/tests/tabpaint/content/target.html @@ -52,7 +52,9 @@ let opened = parseInt(location.search.substring(1), 10); let delta = presented - opened; - let mm = window.docShell.messageManager; + let mm = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); mm.sendAsyncMessage("TabPaint:Painted", { delta }); }); diff --git a/toolkit/components/extensions/ExtensionCommon.jsm b/toolkit/components/extensions/ExtensionCommon.jsm index 7ca328457e94..1835e59fb9c8 100644 --- a/toolkit/components/extensions/ExtensionCommon.jsm +++ b/toolkit/components/extensions/ExtensionCommon.jsm @@ -371,7 +371,8 @@ class BaseContext { let {document, docShell} = contentWindow; this.innerWindowID = getInnerWindowID(contentWindow); - this.messageManager = docShell.messageManager; + this.messageManager = docShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); if (this.incognito == null) { this.incognito = PrivateBrowsingUtils.isContentWindowPrivate(contentWindow); diff --git a/toolkit/components/extensions/ExtensionPageChild.jsm b/toolkit/components/extensions/ExtensionPageChild.jsm index 484e2900dea3..a37e93be1151 100644 --- a/toolkit/components/extensions/ExtensionPageChild.jsm +++ b/toolkit/components/extensions/ExtensionPageChild.jsm @@ -399,7 +399,9 @@ ExtensionPageChild = { throw new Error("An extension context was already initialized for this frame"); } - let mm = contentWindow.docShell.messageManager; + let mm = contentWindow.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); let {viewType, tabId, devtoolsToolboxInfo} = getFrameData(mm) || {}; diff --git a/toolkit/components/extensions/MessageChannel.jsm b/toolkit/components/extensions/MessageChannel.jsm index 2fded402a56e..49e1ce63329e 100644 --- a/toolkit/components/extensions/MessageChannel.jsm +++ b/toolkit/components/extensions/MessageChannel.jsm @@ -25,7 +25,7 @@ * A basic setup works something like this: * * A content script adds a message listener to its global - * ContentFrameMessageManager, with an appropriate set of filters: + * nsIContentFrameMessageManager, with an appropriate set of filters: * * { * init(messageManager, window, extensionID) { diff --git a/toolkit/components/extensions/extension-process-script.js b/toolkit/components/extensions/extension-process-script.js index 2fadc239ff67..ae1b952e3e23 100644 --- a/toolkit/components/extensions/extension-process-script.js +++ b/toolkit/components/extensions/extension-process-script.js @@ -88,6 +88,16 @@ var contentScripts = new DefaultWeakMap(matcher => { matcher); }); +function getMessageManager(window) { + let docShell = window.docShell.QueryInterface(Ci.nsIInterfaceRequestor); + try { + return docShell.getInterface(Ci.nsIContentFrameMessageManager); + } catch (e) { + // Some windows don't support this interface (hidden window). + return null; + } +} + var DocumentManager; var ExtensionManager; @@ -480,7 +490,7 @@ ExtensionProcessScript.prototype = { }, initExtensionDocument(policy, doc) { - if (DocumentManager.globals.has(doc.defaultView.docShell.messageManager)) { + if (DocumentManager.globals.has(getMessageManager(doc.defaultView))) { DocumentManager.loadInto(policy, doc.defaultView); } }, @@ -497,7 +507,7 @@ ExtensionProcessScript.prototype = { }, loadContentScript(contentScript, window) { - if (DocumentManager.globals.has(window.docShell.messageManager)) { + if (DocumentManager.globals.has(getMessageManager(window))) { contentScripts.get(contentScript).injectInto(window); } }, diff --git a/toolkit/components/passwordmgr/LoginManagerContent.jsm b/toolkit/components/passwordmgr/LoginManagerContent.jsm index 43a708edcaed..7f7788df4087 100644 --- a/toolkit/components/passwordmgr/LoginManagerContent.jsm +++ b/toolkit/components/passwordmgr/LoginManagerContent.jsm @@ -153,6 +153,12 @@ prefBranch.addObserver("", observer.onPrefChange); observer.onPrefChange(); // read initial values +function messageManagerFromWindow(win) { + return win.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); +} + // This object maps to the "child" process (even in the single-process case). var LoginManagerContent = { __formFillService: null, // FormFillController, for username autocompleting @@ -295,7 +301,7 @@ var LoginManagerContent = { } let actionOrigin = LoginUtils._getActionOrigin(form); - let messageManager = win.docShell.messageManager; + let messageManager = messageManagerFromWindow(win); // XXX Weak?? let requestData = { form }; @@ -317,7 +323,7 @@ var LoginManagerContent = { let formOrigin = LoginUtils._getPasswordOrigin(doc.documentURI); let actionOrigin = LoginUtils._getActionOrigin(form); - let messageManager = win.docShell.messageManager; + let messageManager = messageManagerFromWindow(win); let previousResult = aPreviousResult ? { searchString: aPreviousResult.searchString, @@ -438,7 +444,7 @@ var LoginManagerContent = { const isPrivateWindow = PrivateBrowsingUtils.isContentWindowPrivate(window); - let messageManager = window.docShell.messageManager; + let messageManager = messageManagerFromWindow(window); messageManager.sendAsyncMessage("LoginStats:LoginEncountered", { isPrivateWindow, @@ -501,7 +507,7 @@ var LoginManagerContent = { frame => hasInsecureLoginForms(frame)); }; - let messageManager = topWindow.docShell.messageManager; + let messageManager = messageManagerFromWindow(topWindow); messageManager.sendAsyncMessage("RemoteLogins:insecureLoginFormPresent", { hasInsecureLoginForms: hasInsecureLoginForms(topWindow), }); @@ -939,7 +945,7 @@ var LoginManagerContent = { } let formSubmitURL = LoginUtils._getActionOrigin(form); - let messageManager = win.docShell.messageManager; + let messageManager = messageManagerFromWindow(win); let recipes = LoginRecipesContent.getRecipes(hostname, win); @@ -1257,7 +1263,7 @@ var LoginManagerContent = { autofillResult = AUTOFILL_RESULT.FILLED; let win = doc.defaultView; - let messageManager = win.docShell.messageManager; + let messageManager = messageManagerFromWindow(win); messageManager.sendAsyncMessage("LoginStats:LoginFillSuccessful"); } finally { if (autofillResult == -1) { diff --git a/toolkit/components/passwordmgr/LoginRecipes.jsm b/toolkit/components/passwordmgr/LoginRecipes.jsm index 21ef13bdaecd..c3832f34c9cd 100644 --- a/toolkit/components/passwordmgr/LoginRecipes.jsm +++ b/toolkit/components/passwordmgr/LoginRecipes.jsm @@ -234,7 +234,9 @@ var LoginRecipesContent = { } } - let mm = win.docShell.messageManager; + let mm = win.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); log.warn("getRecipes: falling back to a synchronous message for:", aHost); recipes = mm.sendSyncMessage("RemoteLogins:findRecipes", { formOrigin: aHost })[0]; diff --git a/toolkit/components/prompts/src/nsPrompter.js b/toolkit/components/prompts/src/nsPrompter.js index bb5b006f473c..77c8bb6504d2 100644 --- a/toolkit/components/prompts/src/nsPrompter.js +++ b/toolkit/components/prompts/src/nsPrompter.js @@ -359,7 +359,8 @@ function openTabPrompt(domWin, tabPrompt, args) { let winUtils = domWin.windowUtils; winUtils.enterModalState(); - let frameMM = docShell.messageManager; + let frameMM = docShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); // We provide a callback so the prompt can close itself. We don't want to // wait for this event loop to return... Otherwise the presence of other @@ -442,7 +443,7 @@ function openRemotePrompt(domWin, args, tabPrompt) { winUtils.enterModalState(); let closed = false; - let frameMM = docShell.messageManager; + let frameMM = docShell.getInterface(Ci.nsIContentFrameMessageManager); // It should be hard or impossible to cause a window to create multiple // prompts, but just in case, give our prompt an ID. diff --git a/toolkit/components/satchel/nsFormAutoComplete.js b/toolkit/components/satchel/nsFormAutoComplete.js index b113bdb4b411..1d15161572db 100644 --- a/toolkit/components/satchel/nsFormAutoComplete.js +++ b/toolkit/components/satchel/nsFormAutoComplete.js @@ -40,7 +40,11 @@ function isAutocompleteDisabled(aField) { function FormHistoryClient({ formField, inputName }) { if (formField && inputName != this.SEARCHBAR_ID) { let window = formField.ownerGlobal; - this.mm = window.docShell.messageManager; + let topDocShell = window.docShell + .sameTypeRootTreeItem + .QueryInterface(Ci.nsIDocShell); + this.mm = topDocShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); } else { if (inputName == this.SEARCHBAR_ID && formField) { throw new Error("FormHistoryClient constructed with both a " + diff --git a/toolkit/components/search/nsSidebar.js b/toolkit/components/search/nsSidebar.js index 80141168bc33..112619c5a7be 100644 --- a/toolkit/components/search/nsSidebar.js +++ b/toolkit/components/search/nsSidebar.js @@ -11,7 +11,13 @@ function nsSidebar() { nsSidebar.prototype = { init(window) { this.window = window; - this.mm = window.docShell.messageManager; + try { + this.mm = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); + } catch (e) { + Cu.reportError(e); + } }, // This function implements window.external.AddSearchProvider(). diff --git a/toolkit/content/process-content.js b/toolkit/content/process-content.js index 7476ad1c5312..107871264cbe 100644 --- a/toolkit/content/process-content.js +++ b/toolkit/content/process-content.js @@ -57,7 +57,9 @@ let ProcessObserver = { // Get the frame message manager for this window so we can associate this // page with a browser element - let messageManager = window.docShell.messageManager; + let messageManager = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); let { ChildMessagePort } = ChromeUtils.import("resource://gre/modules/remotepagemanager/RemotePageManagerChild.jsm", {}); diff --git a/toolkit/modules/E10SUtils.jsm b/toolkit/modules/E10SUtils.jsm index 897ba9058db0..1863cc0f4588 100644 --- a/toolkit/modules/E10SUtils.jsm +++ b/toolkit/modules/E10SUtils.jsm @@ -306,8 +306,9 @@ var E10SUtils = { redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, aFreshProcess, aFlags) { // Retarget the load to the correct process - let messageManager = aDocShell.messageManager; - let sessionHistory = aDocShell.QueryInterface(Ci.nsIWebNavigation).sessionHistory; + let messageManager = aDocShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); + let sessionHistory = aDocShell.getInterface(Ci.nsIWebNavigation).sessionHistory; messageManager.sendAsyncMessage("Browser:LoadURI", { loadOptions: { diff --git a/toolkit/modules/WebChannelContent.jsm b/toolkit/modules/WebChannelContent.jsm index e2662ab93779..42ae952c19d5 100644 --- a/toolkit/modules/WebChannelContent.jsm +++ b/toolkit/modules/WebChannelContent.jsm @@ -12,7 +12,9 @@ ChromeUtils.import("resource://gre/modules/Services.jsm"); function getMessageManager(event) { let window = Cu.getGlobalForObject(event.target); - return window.docShell.messageManager; + return window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); } var WebChannelContent = { diff --git a/toolkit/modules/addons/WebRequestContent.js b/toolkit/modules/addons/WebRequestContent.js index 74b8544464f5..bd709bfdcdf0 100644 --- a/toolkit/modules/addons/WebRequestContent.js +++ b/toolkit/modules/addons/WebRequestContent.js @@ -165,9 +165,14 @@ var ContentPolicy = { } } - let windowMM = window.docShell.messageManager; - if (windowMM) { - mm = windowMM; + let ir = window.docShell.QueryInterface(Ci.nsIInterfaceRequestor); + try { + // If e10s is disabled, this throws NS_NOINTERFACE for closed tabs. + mm = ir.getInterface(Ci.nsIContentFrameMessageManager); + } catch (e) { + if (e.result != Cr.NS_NOINTERFACE) { + throw e; + } } } diff --git a/toolkit/mozapps/extensions/amContentHandler.js b/toolkit/mozapps/extensions/amContentHandler.js index d34be584bd84..2cacd69ea85a 100644 --- a/toolkit/mozapps/extensions/amContentHandler.js +++ b/toolkit/mozapps/extensions/amContentHandler.js @@ -73,7 +73,9 @@ amContentHandler.prototype = { } // Fall back to sending through the message manager - let messageManager = window.docShell.messageManager; + let messageManager = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); messageManager.sendAsyncMessage(MSG_INSTALL_ADDON, install); }, diff --git a/toolkit/mozapps/extensions/amInstallTrigger.js b/toolkit/mozapps/extensions/amInstallTrigger.js index 57baafacea4d..ef1afd48eb95 100644 --- a/toolkit/mozapps/extensions/amInstallTrigger.js +++ b/toolkit/mozapps/extensions/amInstallTrigger.js @@ -37,7 +37,10 @@ function RemoteMediator(window) { let utils = window.windowUtils; this._windowID = utils.currentInnerWindowID; - this.mm = window.docShell.messageManager; + this.mm = window + .docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); this.mm.addWeakMessageListener(MSG_INSTALL_CALLBACK, this); this._lastCallbackID = 0; @@ -89,7 +92,9 @@ RemoteMediator.prototype = { } // Fall back to sending through the message manager - let messageManager = window.docShell.messageManager; + let messageManager = window.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); return messageManager.sendSyncMessage(MSG_INSTALL_ADDON, install)[0]; }, diff --git a/toolkit/mozapps/extensions/amWebAPI.js b/toolkit/mozapps/extensions/amWebAPI.js index 9eee566f2ad6..3373e29f5135 100644 --- a/toolkit/mozapps/extensions/amWebAPI.js +++ b/toolkit/mozapps/extensions/amWebAPI.js @@ -203,7 +203,10 @@ class WebAPI extends APIObject { } init(window) { - let mm = window.docShell.messageManager; + let mm = window + .docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager); let broker = new APIBroker(mm); super.init(window, broker, {});