mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-22 23:27:30 +09:00
Issue #1643 - Follow-up: Ensure we properly clear our pointers when the
Presentation of a document is destroyed.
This commit is contained in:
parent
208ef44f9f
commit
317b96a1be
3 changed files with 24 additions and 9 deletions
|
|
@ -15,7 +15,7 @@ namespace dom {
|
||||||
void
|
void
|
||||||
ResizeObserverNotificationHelper::WillRefresh(TimeStamp aTime)
|
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) {
|
if (mOwner) {
|
||||||
mOwner->Notify();
|
mOwner->Notify();
|
||||||
}
|
}
|
||||||
|
|
@ -69,10 +69,8 @@ ResizeObserverNotificationHelper::Unregister()
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRefreshDriver* refreshDriver = GetRefreshDriver();
|
nsRefreshDriver* refreshDriver = GetRefreshDriver();
|
||||||
if (!refreshDriver) {
|
MOZ_RELEASE_ASSERT(refreshDriver,
|
||||||
// We can't access RefreshDriver now. Just abort the Unregister().
|
"We should not leave a dangling reference to the observer around");
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
refreshDriver->RemoveRefreshObserver(this, Flush_Display);
|
refreshDriver->RemoveRefreshObserver(this, Flush_Display);
|
||||||
mRegistered = false;
|
mRegistered = false;
|
||||||
|
|
@ -81,9 +79,8 @@ ResizeObserverNotificationHelper::Unregister()
|
||||||
void
|
void
|
||||||
ResizeObserverNotificationHelper::Disconnect()
|
ResizeObserverNotificationHelper::Disconnect()
|
||||||
{
|
{
|
||||||
Unregister();
|
MOZ_RELEASE_ASSERT(!mRegistered, "How can we die when registered?");
|
||||||
// Our owner is dying. Clear our pointer to it, in case we outlive it.
|
MOZ_RELEASE_ASSERT(!mOwner, "Forgot to clear weak pointer?");
|
||||||
mOwner = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ResizeObserverNotificationHelper::~ResizeObserverNotificationHelper()
|
ResizeObserverNotificationHelper::~ResizeObserverNotificationHelper()
|
||||||
|
|
@ -111,6 +108,10 @@ ResizeObserverController::AddResizeObserver(ResizeObserver* aObserver)
|
||||||
mResizeObservers.AppendElement(aObserver);
|
mResizeObservers.AppendElement(aObserver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ResizeObserverController::DetachFromDocument() {
|
||||||
|
mResizeObserverNotificationHelper->Unregister();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ResizeObserverController::Notify()
|
ResizeObserverController::Notify()
|
||||||
{
|
{
|
||||||
|
|
@ -240,7 +241,10 @@ ResizeObserverController::GetShell() const
|
||||||
|
|
||||||
ResizeObserverController::~ResizeObserverController()
|
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
|
} // namespace dom
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,10 @@ public:
|
||||||
|
|
||||||
void Disconnect();
|
void Disconnect();
|
||||||
|
|
||||||
|
bool IsRegistered() const { return mRegistered; }
|
||||||
|
|
||||||
|
void DetachFromOwner() { mOwner = nullptr; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~ResizeObserverNotificationHelper();
|
virtual ~ResizeObserverNotificationHelper();
|
||||||
|
|
||||||
|
|
@ -68,6 +72,7 @@ public:
|
||||||
void Traverse(nsCycleCollectionTraversalCallback& aCb);
|
void Traverse(nsCycleCollectionTraversalCallback& aCb);
|
||||||
void Unlink();
|
void Unlink();
|
||||||
|
|
||||||
|
void DetachFromDocument();
|
||||||
void AddResizeObserver(ResizeObserver* aObserver);
|
void AddResizeObserver(ResizeObserver* aObserver);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -3644,6 +3644,12 @@ nsDocument::DeleteShell()
|
||||||
// objects for @font-face rules that came from the style set.
|
// objects for @font-face rules that came from the style set.
|
||||||
RebuildUserFontSet();
|
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;
|
nsIPresShell* oldShell = mPresShell;
|
||||||
mPresShell = nullptr;
|
mPresShell = nullptr;
|
||||||
UpdateFrameRequestCallbackSchedulingState(oldShell);
|
UpdateFrameRequestCallbackSchedulingState(oldShell);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue