diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index 1804af58842c..81a4f9722be5 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -264,7 +264,7 @@ nsPresContext::~nsPresContext() // Disconnect the refresh driver *after* the transition manager, which // needs it. - if (mRefreshDriver) { + if (mRefreshDriver && mRefreshDriver->PresContext() == this) { mRefreshDriver->Disconnect(); } @@ -891,9 +891,37 @@ nsPresContext::Init(nsIDeviceContext* aDeviceContext) if (!mTransitionManager) return NS_ERROR_OUT_OF_MEMORY; - mRefreshDriver = new nsRefreshDriver(this); - if (!mRefreshDriver) - return NS_ERROR_OUT_OF_MEMORY; + if (mDocument->GetDisplayDocument()) { + NS_ASSERTION(mDocument->GetDisplayDocument()->GetShell() && + mDocument->GetDisplayDocument()->GetShell()->GetPresContext(), + "Why are we being initialized?"); + mRefreshDriver = mDocument->GetDisplayDocument()->GetShell()-> + GetPresContext()->RefreshDriver(); + } else { + nsIDocument* parent = mDocument->GetParentDocument(); + if (parent) { + NS_ASSERTION(parent->GetShell() && parent->GetShell()->GetPresContext(), + "How did we get a presshell?"); + + // We don't have our container set yet at this point + nsCOMPtr ourContainer = mDocument->GetContainer(); + + nsCOMPtr ourItem = do_QueryInterface(ourContainer); + if (ourItem) { + nsCOMPtr parentItem; + ourItem->GetSameTypeParent(getter_AddRefs(parentItem)); + if (parentItem) { + mRefreshDriver = parent->GetShell()->GetPresContext()->RefreshDriver(); + } + } + } + + if (!mRefreshDriver) { + mRefreshDriver = new nsRefreshDriver(this); + if (!mRefreshDriver) + return NS_ERROR_OUT_OF_MEMORY; + } + } mLangService = do_GetService(NS_LANGUAGEATOMSERVICE_CONTRACTID); diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 93420f5ec159..2c2ff4e705ea 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -7267,7 +7267,8 @@ PresShell::Freeze() mDocument->EnumerateSubDocuments(FreezeSubDocument, nsnull); nsPresContext* presContext = GetPresContext(); - if (presContext) { + if (presContext && + presContext->RefreshDriver()->PresContext() == presContext) { presContext->RefreshDriver()->Freeze(); } } @@ -7320,7 +7321,8 @@ void PresShell::Thaw() { nsPresContext* presContext = GetPresContext(); - if (presContext) { + if (presContext && + presContext->RefreshDriver()->PresContext() == presContext) { presContext->RefreshDriver()->Thaw(); } diff --git a/layout/base/nsRefreshDriver.h b/layout/base/nsRefreshDriver.h index be9ab7c57dc9..c1ebcf148fab 100644 --- a/layout/base/nsRefreshDriver.h +++ b/layout/base/nsRefreshDriver.h @@ -162,6 +162,11 @@ public: */ void Thaw(); + /** + * Return the prescontext we were initialized with + */ + nsPresContext* PresContext() const { return mPresContext; } + #ifdef DEBUG /** * Check whether the given observer is an observer for the given flush type