From 21fb6867b5fb71eae2375089bd5ea8b2f180fc0f Mon Sep 17 00:00:00 2001 From: roytam1 Date: Tue, 7 Sep 2021 15:32:22 +0800 Subject: [PATCH] import changes from `dev' branch of rmottola/Arctic-Fox: - Bug 1172889 - Remove unused nsFrameLoader::DestroyChild. r=smaug (36bbb4447) - Bug 1172889 - Remove unused nsFrameLoader::mContentParent. r=smaug (cee16d62f) - Bug 1172889 - Get current RenderFrameParent from TabParent directly. r=roc (b7090504e) - Bug 1176239, do tab navigation in the child when moving between the parent and child process, r=smaug (5c3d8213c) - Bug 1125325 followup: Add missing 'override' keyword to TabChild::GetInnerSize() and nsWindowRoot::AddBrowser(), RemoveBrowser(), EnumerateBrowsers(). rs=ehsan (3ea24684f) - reorder includes (d09953fd0) - Bug 1190245 - Separate mMessageManager creation and FrameScript loading. r=smaug (90eaa1612) - Bug 1177578 - Remove 'No docshells for remote frames' warning in nsFrameLoader::GetDocShell. r=smaug (de5770f1e) - Bug 1164616 - "nsFrameLoader::DelayedStartLoadingRunnable is unused". r=josh (2472ccba6) - Bug 1172889 - Rename nsFrameLoader::GetCurrentRemoteFrame to nsFrameLoader::GetCurrentRenderFrame. r=roc (8563de171) - Bug 1172889 - Reorder nsFrameLoader member declarations. r=smaug (535d6426d) - Bug 1190245 - Make the MaybeCreateDocShell using code path easier to follow. r=smaug (0d96f4663) - Bug 1190245 - Make frame script loading and browser-api initialization easier to follow. r=smaug (7993cfe00) --- dom/base/nsFocusManager.cpp | 24 +-- dom/base/nsFrameLoader.cpp | 283 +++++++++++++------------- dom/base/nsFrameLoader.h | 68 +++---- dom/base/nsWindowRoot.h | 6 +- dom/interfaces/base/nsITabParent.idl | 11 +- dom/ipc/PBrowser.ipdl | 4 +- dom/ipc/TabChild.cpp | 17 +- dom/ipc/TabChild.h | 4 +- dom/ipc/TabParent.cpp | 4 +- dom/ipc/TabParent.h | 2 +- layout/generic/nsSubDocumentFrame.cpp | 2 +- layout/ipc/RenderFrameParent.cpp | 13 -- 12 files changed, 209 insertions(+), 229 deletions(-) diff --git a/dom/base/nsFocusManager.cpp b/dom/base/nsFocusManager.cpp index 07279cd9fe..f8065bbf4b 100644 --- a/dom/base/nsFocusManager.cpp +++ b/dom/base/nsFocusManager.cpp @@ -2948,20 +2948,20 @@ nsFocusManager::GetNextTabbableContent(nsIPresShell* aPresShell, return NS_OK; } + // If this is a remote child browser, call NavigateDocument to have + // the child process continue the navigation. Return a special error + // code to have the caller return early. If the child ends up not + // being focusable in some way, the child process will call back + // into document navigation again by calling MoveFocus. + TabParent* remote = TabParent::GetFrom(currentContent); + if (remote) { + remote->NavigateByKey(aForward, aForDocumentNavigation); + return NS_SUCCESS_DOM_NO_OPERATION; + } + + // Next, for document navigation, check if this a non-remote child document. bool checkSubDocument = true; if (aForDocumentNavigation) { - // If this is a remote child browser, call NavigateDocument to have - // the child process continue the navigation. Return a special error - // code to have the caller return early. If the child ends up not - // being focusable in some way, the child process will call back - // into document navigation again by calling MoveFocus. - TabParent* remote = TabParent::GetFrom(currentContent); - if (remote) { - remote->NavigateDocument(aForward); - return NS_SUCCESS_DOM_NO_OPERATION; - } - - // Next, check if this a non-remote child document. nsIContent* docRoot = GetRootForChildDocument(currentContent); if (docRoot) { // If GetRootForChildDocument returned something then call diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index b6bf92ff25..3dedf74290 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -136,6 +136,9 @@ nsFrameLoader::nsFrameLoader(Element* aOwner, bool aNetworkCreated) : mOwnerContent(aOwner) , mAppIdSentToPermissionManager(nsIScriptSecurityManager::NO_APP_ID) , mDetachedSubdocFrame(nullptr) + , mRemoteBrowser(nullptr) + , mChildID(0) + , mEventMode(EVENT_MODE_NORMAL_DISPATCH) , mIsPrerendered(false) , mDepthTooGreat(false) , mIsTopLevelContent(false) @@ -151,12 +154,9 @@ nsFrameLoader::nsFrameLoader(Element* aOwner, bool aNetworkCreated) , mClampScrollPosition(true) , mObservingOwnerContent(false) , mVisible(true) - , mCurrentRemoteFrame(nullptr) - , mRemoteBrowser(nullptr) - , mChildID(0) - , mEventMode(EVENT_MODE_NORMAL_DISPATCH) { ResetPermissionManagerStatus(); + mRemoteFrame = ShouldUseRemoteProcess(); } nsFrameLoader::~nsFrameLoader() @@ -294,37 +294,6 @@ nsFrameLoader::ReallyStartLoading() return rv; } -class DelayedStartLoadingRunnable : public nsRunnable -{ -public: - explicit DelayedStartLoadingRunnable(nsFrameLoader* aFrameLoader) - : mFrameLoader(aFrameLoader) - { - } - - NS_IMETHOD Run() - { - // Retry the request. - mFrameLoader->ReallyStartLoading(); - - // We delayed nsFrameLoader::ReallyStartLoading() after the child process is - // ready and might not be able to notify the remote browser in - // UpdatePositionAndSize() when reflow finished. Retrigger reflow. - nsIFrame* frame = mFrameLoader->GetPrimaryFrameOfOwningContent(); - if (!frame) { - return NS_OK; - } - frame->InvalidateFrame(); - frame->PresContext()->PresShell()-> - FrameNeedsReflow(frame, nsIPresShell::eResize, NS_FRAME_IS_DIRTY); - - return NS_OK; - } - -private: - nsRefPtr mFrameLoader; -}; - nsresult nsFrameLoader::ReallyStartLoadingInternal() { @@ -333,20 +302,12 @@ nsFrameLoader::ReallyStartLoadingInternal() PROFILER_LABEL("nsFrameLoader", "ReallyStartLoading", js::ProfileEntry::Category::OTHER); - nsresult rv = MaybeCreateDocShell(); - if (NS_FAILED(rv)) { - return rv; - } - - if (mRemoteFrame) { + if (IsRemoteFrame()) { if (!mRemoteBrowser && !TryRemoteBrowser()) { NS_WARNING("Couldn't create child process for iframe."); return NS_ERROR_FAILURE; } - // Execute pending frame scripts before loading URL - EnsureMessageManager(); - // FIXME get error codes from child mRemoteBrowser->LoadURL(mURIToLoad); @@ -357,6 +318,10 @@ nsFrameLoader::ReallyStartLoadingInternal() return NS_OK; } + nsresult rv = MaybeCreateDocShell(); + if (NS_FAILED(rv)) { + return rv; + } NS_ASSERTION(mDocShell, "MaybeCreateDocShell succeeded with a null mDocShell"); @@ -464,11 +429,7 @@ nsFrameLoader::CheckURILoad(nsIURI* aURI) } // Bail out if this is an infinite recursion scenario - rv = MaybeCreateDocShell(); - if (NS_FAILED(rv)) { - return rv; - } - if (mRemoteFrame) { + if (IsRemoteFrame()) { return NS_OK; } return CheckForRecursiveLoad(aURI); @@ -480,15 +441,16 @@ nsFrameLoader::GetDocShell(nsIDocShell **aDocShell) *aDocShell = nullptr; nsresult rv = NS_OK; + if (IsRemoteFrame()) { + return rv; + } + // If we have an owner, make sure we have a docshell and return // that. If not, we're most likely in the middle of being torn down, // then we just return null. if (mOwnerContent) { nsresult rv = MaybeCreateDocShell(); - if (NS_FAILED(rv)) - return rv; - if (mRemoteFrame) { - NS_WARNING("No docshells for remote frames!"); + if (NS_FAILED(rv)) { return rv; } NS_ASSERTION(mDocShell, @@ -646,42 +608,42 @@ nsFrameLoader::Show(int32_t marginWidth, int32_t marginHeight, AutoResetInShow resetInShow(this); mInShow = true; + ScreenIntSize size = frame->GetSubdocumentSize(); + if (IsRemoteFrame()) { + return ShowRemoteFrame(size, frame); + } + nsresult rv = MaybeCreateDocShell(); if (NS_FAILED(rv)) { return false; } - - if (!mRemoteFrame) { - if (!mDocShell) - return false; - - mDocShell->SetMarginWidth(marginWidth); - mDocShell->SetMarginHeight(marginHeight); - - nsCOMPtr sc = do_QueryInterface(mDocShell); - if (sc) { - sc->SetDefaultScrollbarPreferences(nsIScrollable::ScrollOrientation_X, - scrollbarPrefX); - sc->SetDefaultScrollbarPreferences(nsIScrollable::ScrollOrientation_Y, - scrollbarPrefY); - } - - nsCOMPtr presShell = mDocShell->GetPresShell(); - if (presShell) { - // Ensure root scroll frame is reflowed in case scroll preferences or - // margins have changed - nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame(); - if (rootScrollFrame) { - presShell->FrameNeedsReflow(rootScrollFrame, nsIPresShell::eResize, - NS_FRAME_IS_DIRTY); - } - return true; - } + NS_ASSERTION(mDocShell, + "MaybeCreateDocShell succeeded, but null mDocShell"); + if (!mDocShell) { + return false; } - ScreenIntSize size = frame->GetSubdocumentSize(); - if (mRemoteFrame) { - return ShowRemoteFrame(size, frame); + mDocShell->SetMarginWidth(marginWidth); + mDocShell->SetMarginHeight(marginHeight); + + nsCOMPtr sc = do_QueryInterface(mDocShell); + if (sc) { + sc->SetDefaultScrollbarPreferences(nsIScrollable::ScrollOrientation_X, + scrollbarPrefX); + sc->SetDefaultScrollbarPreferences(nsIScrollable::ScrollOrientation_Y, + scrollbarPrefY); + } + + nsCOMPtr presShell = mDocShell->GetPresShell(); + if (presShell) { + // Ensure root scroll frame is reflowed in case scroll preferences or + // margins have changed + nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame(); + if (rootScrollFrame) { + presShell->FrameNeedsReflow(rootScrollFrame, nsIPresShell::eResize, + NS_FRAME_IS_DIRTY); + } + return true; } nsView* view = frame->EnsureInnerView(); @@ -703,7 +665,7 @@ nsFrameLoader::Show(int32_t marginWidth, int32_t marginHeight, // sub-document. This shouldn't be necessary, but given the way our // editor works, it is. See // https://bugzilla.mozilla.org/show_bug.cgi?id=284245 - nsCOMPtr presShell = mDocShell->GetPresShell(); + presShell = mDocShell->GetPresShell(); if (presShell) { nsCOMPtr doc = do_QueryInterface(presShell->GetDocument()); @@ -750,7 +712,7 @@ nsFrameLoader::MarginsChanged(uint32_t aMarginWidth, uint32_t aMarginHeight) { // We assume that the margins are always zero for remote frames. - if (mRemoteFrame) + if (IsRemoteFrame()) return; // If there's no docshell, we're probably not up and running yet. @@ -775,7 +737,7 @@ bool nsFrameLoader::ShowRemoteFrame(const ScreenIntSize& size, nsSubDocumentFrame *aFrame) { - NS_ASSERTION(mRemoteFrame, "ShowRemote only makes sense on remote frames."); + NS_ASSERTION(IsRemoteFrame(), "ShowRemote only makes sense on remote frames."); if (!mRemoteBrowser && !TryRemoteBrowser()) { NS_ERROR("Couldn't create child process."); @@ -811,9 +773,6 @@ nsFrameLoader::ShowRemoteFrame(const ScreenIntSize& size, mRemoteBrowser->Show(size, parentIsActive); mRemoteBrowserShown = true; - EnsureMessageManager(); - - InitializeBrowserAPI(); nsCOMPtr os = services::GetObserverService(); if (os) { os->NotifyObservers(NS_ISUPPORTS_CAST(nsIFrameLoader*, this), @@ -988,11 +947,11 @@ nsFrameLoader::SwapWithOtherLoader(nsFrameLoader* aOther, "Swapping some sort of random loaders?"); NS_ENSURE_STATE(!mInShow && !aOther->mInShow); - if (mRemoteFrame && aOther->mRemoteFrame) { + if (IsRemoteFrame() && aOther->IsRemoteFrame()) { return SwapWithOtherRemoteLoader(aOther, aFirstToSwap, aSecondToSwap); } - if (mRemoteFrame || aOther->mRemoteFrame) { + if (IsRemoteFrame() || aOther->IsRemoteFrame()) { NS_WARNING("Swapping remote and non-remote frames is not currently supported"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1523,7 +1482,7 @@ nsFrameLoader::SetOwnerContent(Element* aContent) mOwnerContent->RemoveMutationObserver(this); } mOwnerContent = aContent; - if (RenderFrameParent* rfp = GetCurrentRemoteFrame()) { + if (RenderFrameParent* rfp = GetCurrentRenderFrame()) { rfp->OwnerContentChanged(aContent); } @@ -1662,22 +1621,27 @@ nsFrameLoader::ShouldUseRemoteProcess() eCaseMatters); } +bool +nsFrameLoader::IsRemoteFrame() +{ + if (mRemoteFrame) { + MOZ_ASSERT(!mDocShell, "Found a remote frame with a DocShell"); + return true; + } + return false; +} + nsresult nsFrameLoader::MaybeCreateDocShell() { if (mDocShell) { return NS_OK; } - if (mRemoteFrame) { + if (IsRemoteFrame()) { return NS_OK; } NS_ENSURE_STATE(!mDestroyCalled); - if (ShouldUseRemoteProcess()) { - mRemoteFrame = true; - return NS_OK; - } - // Get our parent docshell off the document of mOwnerContent // XXXbz this is such a total hack.... We really need to have a // better setup for doing this. @@ -1810,8 +1774,6 @@ nsFrameLoader::MaybeCreateDocShell() webNav->SetSessionHistory(sessionHistory); } - EnsureMessageManager(); - if (OwnerIsAppFrame()) { // You can't be both an app and a browser frame. MOZ_ASSERT(!OwnerIsBrowserFrame()); @@ -1839,18 +1801,7 @@ nsFrameLoader::MaybeCreateDocShell() mDocShell->SetIsBrowserInsideApp(containingAppId); } - InitializeBrowserAPI(); - nsCOMPtr os = services::GetObserverService(); - if (os) { - os->NotifyObservers(NS_ISUPPORTS_CAST(nsIFrameLoader*, this), - "inprocess-browser-shown", nullptr); - } - - if (OwnerIsBrowserOrAppFrame() && mMessageManager) { - mMessageManager->LoadFrameScript( - NS_LITERAL_STRING("chrome://global/content/BrowserElementChild.js"), - /* allowDelayedLoad = */ true, - /* aRunInGlobalScope */ true); + if (OwnerIsBrowserOrAppFrame()) { // For inproc frames, set the docshell properties. nsCOMPtr item = do_GetInterface(docShell); nsAutoString name; @@ -1877,6 +1828,15 @@ nsFrameLoader::MaybeCreateDocShell() } } + ReallyLoadFrameScripts(); + InitializeBrowserAPI(); + + nsCOMPtr os = services::GetObserverService(); + if (os) { + os->NotifyObservers(NS_ISUPPORTS_CAST(nsIFrameLoader*, this), + "inprocess-browser-shown", nullptr); + } + return NS_OK; } @@ -1897,13 +1857,16 @@ nsFrameLoader::CheckForRecursiveLoad(nsIURI* aURI) { nsresult rv; + MOZ_ASSERT(!IsRemoteFrame(), + "Shouldn't call CheckForRecursiveLoad on remote frames."); + mDepthTooGreat = false; rv = MaybeCreateDocShell(); if (NS_FAILED(rv)) { return rv; } - NS_ASSERTION(!mRemoteFrame, - "Shouldn't call CheckForRecursiveLoad on remote frames."); + NS_ASSERTION(mDocShell, + "MaybeCreateDocShell succeeded, but null mDocShell"); if (!mDocShell) { return NS_ERROR_FAILURE; } @@ -2029,7 +1992,7 @@ nsFrameLoader::GetWindowDimensions(nsIntRect& aRect) NS_IMETHODIMP nsFrameLoader::UpdatePositionAndSize(nsSubDocumentFrame *aIFrame) { - if (mRemoteFrame) { + if (IsRemoteFrame()) { if (mRemoteBrowser) { ScreenIntSize size = aIFrame->GetSubdocumentSize(); nsIntRect dimensions; @@ -2237,7 +2200,6 @@ nsFrameLoader::TryRemoteBrowser() return false; } - mContentParent = mRemoteBrowser->Manager(); mChildID = mRemoteBrowser->Manager()->ChildID(); nsCOMPtr rootItem; @@ -2258,15 +2220,27 @@ nsFrameLoader::TryRemoteBrowser() unused << mRemoteBrowser->SendSetUpdateHitRegion(true); } - return true; + ReallyLoadFrameScripts(); + InitializeBrowserAPI(); + + return true; } mozilla::dom::PBrowserParent* -nsFrameLoader::GetRemoteBrowser() +nsFrameLoader::GetRemoteBrowser() const { return mRemoteBrowser; } +RenderFrameParent* +nsFrameLoader::GetCurrentRenderFrame() const +{ + if (mRemoteBrowser) { + return mRemoteBrowser->GetRenderFrame(); + } + return nullptr; +} + NS_IMETHODIMP nsFrameLoader::ActivateRemoteFrame() { if (mRemoteBrowser) { @@ -2488,14 +2462,13 @@ nsFrameLoader::EnsureMessageManager() { NS_ENSURE_STATE(mOwnerContent); - nsresult rv = MaybeCreateDocShell(); - if (NS_FAILED(rv)) { - return rv; + if (mMessageManager) { + return NS_OK; } if (!mIsTopLevelContent && !OwnerIsBrowserOrAppFrame() && - !mRemoteFrame && + !IsRemoteFrame() && !(mOwnerContent->IsXULElement() && mOwnerContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::forcemessagemanager, @@ -2503,14 +2476,6 @@ nsFrameLoader::EnsureMessageManager() return NS_OK; } - bool useRemoteProcess = ShouldUseRemoteProcess(); - if (mMessageManager) { - if (useRemoteProcess && mRemoteBrowser) { - mMessageManager->InitWithCallback(this); - } - return NS_OK; - } - nsCOMPtr chromeWindow = do_QueryInterface(GetOwnerDoc()->GetWindow()); nsCOMPtr parentManager; @@ -2529,18 +2494,33 @@ nsFrameLoader::EnsureMessageManager() } } - if (useRemoteProcess) { - mMessageManager = new nsFrameMessageManager(mRemoteBrowser ? this : nullptr, - static_cast(parentManager.get()), - MM_CHROME); - } else { - mMessageManager = new nsFrameMessageManager(nullptr, - static_cast(parentManager.get()), - MM_CHROME); - + mMessageManager = new nsFrameMessageManager(nullptr, + static_cast(parentManager.get()), + MM_CHROME); + if (!IsRemoteFrame()) { + nsresult rv = MaybeCreateDocShell(); + if (NS_FAILED(rv)) { + return rv; + } + NS_ASSERTION(mDocShell, + "MaybeCreateDocShell succeeded, but null mDocShell"); + if (!mDocShell) { + return NS_ERROR_FAILURE; + } mChildMessageManager = new nsInProcessTabChildGlobal(mDocShell, mOwnerContent, mMessageManager); - // Force pending frame scripts to be loaded. + } + return NS_OK; +} + +nsresult +nsFrameLoader::ReallyLoadFrameScripts() +{ + nsresult rv = EnsureMessageManager(); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + if (mMessageManager) { mMessageManager->InitWithCallback(this); } return NS_OK; @@ -2571,10 +2551,11 @@ void nsFrameLoader::SetRemoteBrowser(nsITabParent* aTabParent) { MOZ_ASSERT(!mRemoteBrowser); - MOZ_ASSERT(!mCurrentRemoteFrame); mRemoteFrame = true; mRemoteBrowser = TabParent::GetFrom(aTabParent); mChildID = mRemoteBrowser ? mRemoteBrowser->Manager()->ChildID() : 0; + ReallyLoadFrameScripts(); + InitializeBrowserAPI(); ShowRemoteFrame(ScreenIntSize(0, 0)); } @@ -2833,8 +2814,22 @@ nsFrameLoader::GetLoadContext(nsILoadContext** aLoadContext) void nsFrameLoader::InitializeBrowserAPI() { - nsCOMPtr browserFrame = do_QueryInterface(mOwnerContent); - if (browserFrame) { - browserFrame->InitializeBrowserAPI(); + if (OwnerIsBrowserOrAppFrame()) { + if (!IsRemoteFrame()) { + nsresult rv = EnsureMessageManager(); + if (NS_WARN_IF(NS_FAILED(rv))) { + return; + } + if (mMessageManager) { + mMessageManager->LoadFrameScript( + NS_LITERAL_STRING("chrome://global/content/BrowserElementChild.js"), + /* allowDelayedLoad = */ true, + /* aRunInGlobalScope */ true); + } + } + nsCOMPtr browserFrame = do_QueryInterface(mOwnerContent); + if (browserFrame) { + browserFrame->InitializeBrowserAPI(); + } } } diff --git a/dom/base/nsFrameLoader.h b/dom/base/nsFrameLoader.h index ef80baad62..39c393d68d 100644 --- a/dom/base/nsFrameLoader.h +++ b/dom/base/nsFrameLoader.h @@ -23,8 +23,8 @@ #include "mozilla/dom/Element.h" #include "mozilla/Attributes.h" #include "nsStubMutationObserver.h" -#include "nsIFrame.h" #include "Units.h" +#include "nsIFrame.h" class nsIURI; class nsSubDocumentFrame; @@ -62,11 +62,6 @@ class nsFrameLoader final : public nsIFrameLoader, typedef mozilla::dom::TabParent TabParent; typedef mozilla::layout::RenderFrameParent RenderFrameParent; -protected: - nsFrameLoader(mozilla::dom::Element* aOwner, bool aNetworkCreated); - - ~nsFrameLoader(); - public: static nsFrameLoader* Create(mozilla::dom::Element* aOwner, bool aNetworkCreated); @@ -131,9 +126,6 @@ public: nsRefPtr& aFirstToSwap, nsRefPtr& aSecondToSwap); - // When IPC is enabled, destroy any associated child process. - void DestroyChild(); - /** * Return the primary frame for our owning content, or null if it * can't be found. @@ -150,7 +142,7 @@ public: nsIDocument* GetOwnerDoc() const { return mOwnerContent ? mOwnerContent->OwnerDoc() : nullptr; } - PBrowserParent* GetRemoteBrowser(); + PBrowserParent* GetRemoteBrowser() const; /** * The "current" render frame is the one on which the most recent @@ -166,20 +158,8 @@ public: * returned. (In-process behaves similarly, and this * behavior seems desirable.) */ - RenderFrameParent* GetCurrentRemoteFrame() const - { - return mCurrentRemoteFrame; - } + RenderFrameParent* GetCurrentRenderFrame() const; - /** - * |aFrame| can be null. If non-null, it must be the remote frame - * on which the most recent layer transaction completed for this's - * . - */ - void SetCurrentRemoteFrame(RenderFrameParent* aFrame) - { - mCurrentRemoteFrame = aFrame; - } nsFrameMessageManager* GetFrameMessageManager() { return mMessageManager; } mozilla::dom::Element* GetOwnerContent() { return mOwnerContent; } @@ -190,10 +170,10 @@ public: /** * Tell this FrameLoader to use a particular remote browser. * - * This will assert if mRemoteBrowser or mCurrentRemoteFrame is non-null. In - * practice, this means you can't have successfully run TryRemoteBrowser() on - * this object, which means you can't have called ShowRemoteFrame() or - * ReallyStartLoading(). + * This will assert if mRemoteBrowser is non-null. In practice, + * this means you can't have successfully run TryRemoteBrowser() on + * this object, which means you can't have called ShowRemoteFrame() + * or ReallyStartLoading(). */ void SetRemoteBrowser(nsITabParent* aTabParent); @@ -231,12 +211,23 @@ public: // Properly retrieves documentSize of any subdocument type. nsresult GetWindowDimensions(nsIntRect& aRect); + // public because a callback needs these. + nsRefPtr mMessageManager; + nsCOMPtr mChildMessageManager; + private: + nsFrameLoader(mozilla::dom::Element* aOwner, bool aNetworkCreated); + ~nsFrameLoader(); void SetOwnerContent(mozilla::dom::Element* aContent); bool ShouldUseRemoteProcess(); + /** + * Return true if the frame is a remote frame. Return false otherwise + */ + bool IsRemoteFrame(); + /** * Is this a frameloader for a bona fide