1
0
mirror of https://github.com/roytam1/UXP.git synced 2026-05-26 13:58:49 +00:00

Issue #1643 - Follow-up: Ensure we properly clear our pointers when the

Presentation of a document is destroyed.
This commit is contained in:
Moonchild
2020-10-16 10:19:19 +00:00
committed by roytam1
parent 208ef44f9f
commit 317b96a1be
3 changed files with 24 additions and 9 deletions
+13 -9
View File
@@ -15,7 +15,7 @@ namespace dom {
void
ResizeObserverNotificationHelper::WillRefresh(TimeStamp aTime)
{
MOZ_ASSERT(mOwner, "Why is mOwner already dead when this RefreshObserver is still registered?");
MOZ_DIAGNOSTIC_ASSERT(mOwner, "RefreshObserver should have been de-registered on time, but isn't.");
if (mOwner) {
mOwner->Notify();
}
@@ -69,10 +69,8 @@ ResizeObserverNotificationHelper::Unregister()
}
nsRefreshDriver* refreshDriver = GetRefreshDriver();
if (!refreshDriver) {
// We can't access RefreshDriver now. Just abort the Unregister().
return;
}
MOZ_RELEASE_ASSERT(refreshDriver,
"We should not leave a dangling reference to the observer around");
refreshDriver->RemoveRefreshObserver(this, Flush_Display);
mRegistered = false;
@@ -81,9 +79,8 @@ ResizeObserverNotificationHelper::Unregister()
void
ResizeObserverNotificationHelper::Disconnect()
{
Unregister();
// Our owner is dying. Clear our pointer to it, in case we outlive it.
mOwner = nullptr;
MOZ_RELEASE_ASSERT(!mRegistered, "How can we die when registered?");
MOZ_RELEASE_ASSERT(!mOwner, "Forgot to clear weak pointer?");
}
ResizeObserverNotificationHelper::~ResizeObserverNotificationHelper()
@@ -111,6 +108,10 @@ ResizeObserverController::AddResizeObserver(ResizeObserver* aObserver)
mResizeObservers.AppendElement(aObserver);
}
void ResizeObserverController::DetachFromDocument() {
mResizeObserverNotificationHelper->Unregister();
}
void
ResizeObserverController::Notify()
{
@@ -240,7 +241,10 @@ ResizeObserverController::GetShell() const
ResizeObserverController::~ResizeObserverController()
{
mResizeObserverNotificationHelper->Disconnect();
MOZ_RELEASE_ASSERT(
!mResizeObserverNotificationHelper->IsRegistered(),
"Nothing else should keep a reference to our notification helper when we go away");
mResizeObserverNotificationHelper->DetachFromOwner();
}
} // namespace dom
+5
View File
@@ -41,6 +41,10 @@ public:
void Disconnect();
bool IsRegistered() const { return mRegistered; }
void DetachFromOwner() { mOwner = nullptr; }
protected:
virtual ~ResizeObserverNotificationHelper();
@@ -68,6 +72,7 @@ public:
void Traverse(nsCycleCollectionTraversalCallback& aCb);
void Unlink();
void DetachFromDocument();
void AddResizeObserver(ResizeObserver* aObserver);
/*
+6
View File
@@ -3644,6 +3644,12 @@ nsDocument::DeleteShell()
// objects for @font-face rules that came from the style set.
RebuildUserFontSet();
if (mResizeObserverController) {
// If the shell is going away, we need to remove any links to this document
// from the observer.
mResizeObserverController->DetachFromDocument();
}
nsIPresShell* oldShell = mPresShell;
mPresShell = nullptr;
UpdateFrameRequestCallbackSchedulingState(oldShell);