From c28c38ca0eb88ebaa261978f059ee1b6201bbf2b Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Sat, 23 Oct 2004 02:50:26 +0000 Subject: [PATCH] Remove from primary frame map at the end of frame destruction, in case it got re-added. b=265404 r=bzbarsky sr=brendan a=asa git-svn-id: svn://10.0.0.236/trunk@164230 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/base/nsFrameManager.cpp | 14 +++++++++----- mozilla/layout/html/base/src/nsFrameManager.cpp | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/mozilla/layout/base/nsFrameManager.cpp b/mozilla/layout/base/nsFrameManager.cpp index 99933fe8e36..e1ecac8c029 100644 --- a/mozilla/layout/base/nsFrameManager.cpp +++ b/mozilla/layout/base/nsFrameManager.cpp @@ -748,15 +748,19 @@ nsFrameManager::NotifyDestroyingFrame(nsIFrame* aFrame) // Dequeue and destroy and posted events for this frame DequeuePostedEventFor(aFrame); -#ifdef DEBUG + // We've already removed from the primary frame map once, but we're + // going to try to do it again here to fix callers of GetPrimaryFrameFor + // during frame destruction, since this problem keeps coming back to + // bite us. We may want to remove the previous caller. if (mPrimaryFrameMap.ops) { PrimaryFrameMapEntry *entry = NS_STATIC_CAST(PrimaryFrameMapEntry*, PL_DHashTableOperate(&mPrimaryFrameMap, aFrame->GetContent(), PL_DHASH_LOOKUP)); - NS_ASSERTION(!PL_DHASH_ENTRY_IS_BUSY(entry) || entry->frame != aFrame, - "frame was not removed from primary frame map before " - "destruction or was readded to map after being removed"); + if (PL_DHASH_ENTRY_IS_BUSY(entry) && entry->frame == aFrame) { + NS_NOTREACHED("frame was not removed from primary frame map before " + "destruction or was readded to map after being removed"); + PL_DHashTableRawRemove(&mPrimaryFrameMap, entry); + } } -#endif } nsresult diff --git a/mozilla/layout/html/base/src/nsFrameManager.cpp b/mozilla/layout/html/base/src/nsFrameManager.cpp index 99933fe8e36..e1ecac8c029 100644 --- a/mozilla/layout/html/base/src/nsFrameManager.cpp +++ b/mozilla/layout/html/base/src/nsFrameManager.cpp @@ -748,15 +748,19 @@ nsFrameManager::NotifyDestroyingFrame(nsIFrame* aFrame) // Dequeue and destroy and posted events for this frame DequeuePostedEventFor(aFrame); -#ifdef DEBUG + // We've already removed from the primary frame map once, but we're + // going to try to do it again here to fix callers of GetPrimaryFrameFor + // during frame destruction, since this problem keeps coming back to + // bite us. We may want to remove the previous caller. if (mPrimaryFrameMap.ops) { PrimaryFrameMapEntry *entry = NS_STATIC_CAST(PrimaryFrameMapEntry*, PL_DHashTableOperate(&mPrimaryFrameMap, aFrame->GetContent(), PL_DHASH_LOOKUP)); - NS_ASSERTION(!PL_DHASH_ENTRY_IS_BUSY(entry) || entry->frame != aFrame, - "frame was not removed from primary frame map before " - "destruction or was readded to map after being removed"); + if (PL_DHASH_ENTRY_IS_BUSY(entry) && entry->frame == aFrame) { + NS_NOTREACHED("frame was not removed from primary frame map before " + "destruction or was readded to map after being removed"); + PL_DHashTableRawRemove(&mPrimaryFrameMap, entry); + } } -#endif } nsresult