Bug 1265577

This commit is contained in:
wolfbeast
2016-06-14 10:43:09 +02:00
committed by roytam1
parent 2ab7b2df8a
commit 3a5a1af616
3 changed files with 53 additions and 38 deletions
+34 -20
View File
@@ -130,19 +130,23 @@ nsSubDocumentFrame::Init(nsIContent* aContent,
nsRefPtr<nsFrameLoader> frameloader = FrameLoader();
if (frameloader) {
nsCOMPtr<nsIDocument> oldContainerDoc;
nsView* detachedViews =
frameloader->GetDetachedSubdocView(getter_AddRefs(oldContainerDoc));
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.
frameloader->Hide();
}
}
frameloader->SetDetachedSubdocView(nullptr, nullptr);
frameloader->SetDetachedSubdocFrame(nullptr, nullptr);
}
nsContentUtils::AddScriptRunner(new AsyncFrameInit(this));
@@ -252,11 +256,12 @@ nsSubDocumentFrame::GetSubdocumentSize()
nsRefPtr<nsFrameLoader> frameloader = FrameLoader();
if (frameloader) {
nsCOMPtr<nsIDocument> 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));
}
@@ -942,7 +947,7 @@ public:
// Either the frame element has no nsIFrame or the presshell is being
// destroyed. Hide the nsFrameLoader, which destroys the presentation,
// and clear our references to the stashed presentation.
mFrameLoader->SetDetachedSubdocView(nullptr, nullptr);
mFrameLoader->SetDetachedSubdocFrame(nullptr, nullptr);
mFrameLoader->Hide();
}
return NS_OK;
@@ -971,15 +976,24 @@ nsSubDocumentFrame::DestroyFrom(nsIFrame* aDestructRoot)
nsFrameLoader* frameloader = FrameLoader();
if (frameloader) {
nsView* detachedViews = ::BeginSwapDocShellsForViews(mInnerView->GetFirstChild());
frameloader->SetDetachedSubdocView(detachedViews, mContent->OwnerDoc());
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,
mFrameLoader,
PresContext()->PresShell(),
(mDidCreateDoc || mCallingShow)));
// 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);