changeset: 312075:ee870911fabb user: Timothy Nikkel Date: Wed May 04 16:12:48 2016 -0500 summary: Bug 1265577. r=mats, a=lizzard diff -r 751208d22b91 -r ee870911fabb dom/base/nsFrameLoader.cpp --- a/dom/base/nsFrameLoader.cpp Thu May 26 17:07:49 2016 -0400 +++ b/dom/base/nsFrameLoader.cpp Wed May 04 16:12:48 2016 -0500 @@ -155,7 +155,7 @@ nsFrameLoader::nsFrameLoader(Element* aOwner, bool aNetworkCreated) : mOwnerContent(aOwner) , mAppIdSentToPermissionManager(nsIScriptSecurityManager::NO_APP_ID) - , mDetachedSubdocViews(nullptr) + , mDetachedSubdocFrame(nullptr) , mIsPrerendered(false) , mDepthTooGreat(false) , mIsTopLevelContent(false) @@ -2507,18 +2507,18 @@ } void -nsFrameLoader::SetDetachedSubdocView(nsView* aDetachedViews, - nsIDocument* aContainerDoc) +nsFrameLoader::SetDetachedSubdocFrame(nsIFrame* aDetachedFrame, + nsIDocument* aContainerDoc) { - mDetachedSubdocViews = aDetachedViews; + mDetachedSubdocFrame = aDetachedFrame; mContainerDocWhileDetached = aContainerDoc; } -nsView* -nsFrameLoader::GetDetachedSubdocView(nsIDocument** aContainerDoc) const +nsIFrame* +nsFrameLoader::GetDetachedSubdocFrame(nsIDocument** aContainerDoc) const { NS_IF_ADDREF(*aContainerDoc = mContainerDocWhileDetached); - return mDetachedSubdocViews; + return mDetachedSubdocFrame.GetFrame(); } void diff -r 751208d22b91 -r ee870911fabb dom/base/nsFrameLoader.h --- a/dom/base/nsFrameLoader.h Thu May 26 17:07:49 2016 -0400 +++ b/dom/base/nsFrameLoader.h Wed May 04 16:12:48 2016 -0500 @@ -23,6 +23,7 @@ #include "mozilla/Attributes.h" #include "FrameMetrics.h" #include "nsStubMutationObserver.h" +#include "nsIFrame.h" class nsIURI; class nsSubDocumentFrame; @@ -197,23 +198,23 @@ void SetRemoteBrowser(nsITabParent* aTabParent); /** - * Stashes a detached view on the frame loader. We do this when we're + * Stashes a detached nsIFrame on the frame loader. We do this when we're * destroying the nsSubDocumentFrame. If the nsSubdocumentFrame is - * being reframed we'll restore the detached view when it's recreated, + * being reframed we'll restore the detached nsIFrame when it's recreated, * otherwise we'll discard the old presentation and set the detached - * subdoc view to null. aContainerDoc is the document containing the + * subdoc nsIFrame to null. aContainerDoc is the document containing the * the subdoc frame. This enables us to detect when the containing * document has changed during reframe, so we can discard the presentation * in that case. */ - void SetDetachedSubdocView(nsView* aDetachedView, - nsIDocument* aContainerDoc); + void SetDetachedSubdocFrame(nsIFrame* aDetachedFrame, + nsIDocument* aContainerDoc); /** - * Retrieves the detached view and the document containing the view, - * as set by SetDetachedSubdocView(). + * Retrieves the detached nsIFrame and the document containing the nsIFrame, + * as set by SetDetachedSubdocFrame(). */ - nsView* GetDetachedSubdocView(nsIDocument** aContainerDoc) const; + nsIFrame* GetDetachedSubdocFrame(nsIDocument** aContainerDoc) const; /** * Applies a new set of sandbox flags. These are merged with the sandbox @@ -326,12 +327,12 @@ nsRefPtr mMessageManager; nsCOMPtr mChildMessageManager; private: - // Stores the root view of the subdocument while the subdocument is being + // Stores the root frame of the subdocument while the subdocument is being // reframed. Used to restore the presentation after reframing. - nsView* mDetachedSubdocViews; + nsWeakFrame mDetachedSubdocFrame; // Stores the containing document of the frame corresponding to this // frame loader. This is reference is kept valid while the subframe's - // presentation is detached and stored in mDetachedSubdocViews. This + // presentation is detached and stored in mDetachedSubdocFrame. This // enables us to detect whether the frame has moved documents during // a reframe, so that we know not to restore the presentation. nsCOMPtr mContainerDocWhileDetached; diff -r 751208d22b91 -r ee870911fabb layout/generic/nsSubDocumentFrame.cpp --- a/layout/generic/nsSubDocumentFrame.cpp Thu May 26 17:07:49 2016 -0400 +++ b/layout/generic/nsSubDocumentFrame.cpp Wed May 04 16:12:48 2016 -0500 @@ -130,13 +130,16 @@ nsRefPtr frameloader = FrameLoader(); if (frameloader) { nsCOMPtr oldContainerDoc; - nsView* detachedViews = - frameloader->GetDetachedSubdocView(getter_AddRefs(oldContainerDoc)); - frameloader->SetDetachedSubdocView(nullptr, nullptr); - if (detachedViews) { - if (oldContainerDoc == aContent->OwnerDoc()) { + nsIFrame* detachedFrame = + frameloader->GetDetachedSubdocFrame(getter_AddRefs(oldContainerDoc)); + frameloader->SetDetachedSubdocFrame(nullptr, nullptr); + MOZ_ASSERT(oldContainerDoc || !detachedFrame); + if (oldContainerDoc) { + nsView* detachedView = + detachedFrame ? detachedFrame->GetView() : nullptr; + if (detachedView && oldContainerDoc == aContent->OwnerDoc()) { // Restore stashed presentation. - ::InsertViewsInReverseOrder(detachedViews, mInnerView); + ::InsertViewsInReverseOrder(detachedView, mInnerView); ::EndSwapDocShellsForViews(mInnerView->GetFirstChild()); } else { // Presentation is for a different document, don't restore it. @@ -252,11 +255,12 @@ nsRefPtr frameloader = FrameLoader(); if (frameloader) { nsCOMPtr oldContainerDoc; - nsView* detachedViews = - frameloader->GetDetachedSubdocView(getter_AddRefs(oldContainerDoc)); - if (detachedViews) { - nsSize size = detachedViews->GetBounds().Size(); - nsPresContext* presContext = detachedViews->GetFrame()->PresContext(); + nsIFrame* detachedFrame = + frameloader->GetDetachedSubdocFrame(getter_AddRefs(oldContainerDoc)); + nsView* view = detachedFrame ? detachedFrame->GetView() : nullptr; + if (view) { + nsSize size = view->GetBounds().Size(); + nsPresContext* presContext = detachedFrame->PresContext(); return nsIntSize(presContext->AppUnitsToDevPixels(size.width), presContext->AppUnitsToDevPixels(size.height)); } @@ -939,7 +943,7 @@ // Either the frame has been constructed by now, or it never will be, // either way we want to clear the stashed views. - mFrameLoader->SetDetachedSubdocView(nullptr, nullptr); + mFrameLoader->SetDetachedSubdocFrame(nullptr, nullptr); nsSubDocumentFrame* frame = do_QueryFrame(mFrameElement->GetPrimaryFrame()); if ((!frame && mHideViewerIfFrameless) || @@ -974,15 +978,25 @@ RefPtr frameloader = FrameLoader(); if (frameloader) { nsView* detachedViews = ::BeginSwapDocShellsForViews(mInnerView->GetFirstChild()); - frameloader->SetDetachedSubdocView(detachedViews, mContent->OwnerDoc()); - // We call nsFrameLoader::HideViewer() in a script runner so that we can - // safely determine whether the frame is being reframed or destroyed. - nsContentUtils::AddScriptRunner( - new nsHideViewer(mContent, - frameloader, - PresContext()->PresShell(), - (mDidCreateDoc || mCallingShow))); + if (detachedViews && detachedViews->GetFrame()) { + MOZ_ASSERT(mContent->OwnerDoc()); + frameloader->SetDetachedSubdocFrame( + detachedViews->GetFrame(), mContent->OwnerDoc()); + + // We call nsFrameLoader::HideViewer() in a script runner so that we can + // safely determine whether the frame is being reframed or destroyed. + nsContentUtils::AddScriptRunner( + new nsHideViewer(mContent, + frameloader, + PresContext()->PresShell(), + (mDidCreateDoc || mCallingShow))); + } else { + frameloader->SetDetachedSubdocFrame(nullptr, nullptr); + if (mDidCreateDoc || mCallingShow) { + frameloader->Hide(); + } + } } nsLeafFrame::DestroyFrom(aDestructRoot);