mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-06-01 08:49:56 +00:00
Bug 1265577
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user