From 2ffbe5d99770f06e9610730701db44b910ac8cee Mon Sep 17 00:00:00 2001 From: "troy%netscape.com" Date: Fri, 30 Oct 1998 23:38:03 +0000 Subject: [PATCH] Changed DeleteFrame() to prevent unwanted view event dispatch during frame destruction git-svn-id: svn://10.0.0.236/trunk@13766 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/generic/nsContainerFrame.cpp | 30 +++++++++++-------- .../layout/html/base/src/nsContainerFrame.cpp | 30 +++++++++++-------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/mozilla/layout/generic/nsContainerFrame.cpp b/mozilla/layout/generic/nsContainerFrame.cpp index 723e6cc5083..46678888277 100644 --- a/mozilla/layout/generic/nsContainerFrame.cpp +++ b/mozilla/layout/generic/nsContainerFrame.cpp @@ -65,21 +65,27 @@ nsContainerFrame::Init(nsIPresContext& aPresContext, nsIFrame* aChildList) NS_IMETHODIMP nsContainerFrame::DeleteFrame(nsIPresContext& aPresContext) { - // Delete our child frames before doing anything else. In particular - // we do all of this before our base class releases it's hold on the - // view. - for (nsIFrame* child = mFirstChild; child; ) { - mFirstChild = nsnull; // XXX hack until HandleEvent is not called until after destruction - nsIFrame* nextChild; - - child->GetNextSibling(nextChild); - child->DeleteFrame(aPresContext); - child = nextChild; + // Prevent event dispatch during destruct + nsIView* view; + GetView(view); + if (nsnull != view) { + view->SetClientData(nsnull); } - nsFrame::DeleteFrame(aPresContext); + // Delete our child frames + while (nsnull != mFirstChild) { + nsIFrame* nextChild; - return NS_OK; + mFirstChild->GetNextSibling(nextChild); + mFirstChild->DeleteFrame(aPresContext); + + // Once we've deleted the child frame make sure it's no longer in + // our child list + mFirstChild = nextChild; + } + + // Base class will delete the frame + return nsFrame::DeleteFrame(aPresContext); } void diff --git a/mozilla/layout/html/base/src/nsContainerFrame.cpp b/mozilla/layout/html/base/src/nsContainerFrame.cpp index 723e6cc5083..46678888277 100644 --- a/mozilla/layout/html/base/src/nsContainerFrame.cpp +++ b/mozilla/layout/html/base/src/nsContainerFrame.cpp @@ -65,21 +65,27 @@ nsContainerFrame::Init(nsIPresContext& aPresContext, nsIFrame* aChildList) NS_IMETHODIMP nsContainerFrame::DeleteFrame(nsIPresContext& aPresContext) { - // Delete our child frames before doing anything else. In particular - // we do all of this before our base class releases it's hold on the - // view. - for (nsIFrame* child = mFirstChild; child; ) { - mFirstChild = nsnull; // XXX hack until HandleEvent is not called until after destruction - nsIFrame* nextChild; - - child->GetNextSibling(nextChild); - child->DeleteFrame(aPresContext); - child = nextChild; + // Prevent event dispatch during destruct + nsIView* view; + GetView(view); + if (nsnull != view) { + view->SetClientData(nsnull); } - nsFrame::DeleteFrame(aPresContext); + // Delete our child frames + while (nsnull != mFirstChild) { + nsIFrame* nextChild; - return NS_OK; + mFirstChild->GetNextSibling(nextChild); + mFirstChild->DeleteFrame(aPresContext); + + // Once we've deleted the child frame make sure it's no longer in + // our child list + mFirstChild = nextChild; + } + + // Base class will delete the frame + return nsFrame::DeleteFrame(aPresContext); } void