From 1a63cd931632d94cc8c7f68997df91c2b69eb23e Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Fri, 7 Jan 2005 03:23:34 +0000 Subject: [PATCH] Add a kungFuDeathGrip to make sure our synthetic mouse events don't kill us, and make sure to RevokeEvent on all viewmanagers. Bug 277234, r=dbaron, sr=darin, a=asa git-svn-id: svn://10.0.0.236/trunk@167378 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/view/src/nsViewManager.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/mozilla/view/src/nsViewManager.cpp b/mozilla/view/src/nsViewManager.cpp index 50a62ddb2c7..da8b2ab8b4a 100644 --- a/mozilla/view/src/nsViewManager.cpp +++ b/mozilla/view/src/nsViewManager.cpp @@ -360,8 +360,10 @@ static void* PR_CALLBACK HandlePLEvent(PLEvent* aEvent) // Search for valid view manager before trying to access it. This // is working around a bug in RevokeEvents. const nsVoidArray *vmArray = nsViewManager::GetViewManagerArray(); - NS_ENSURE_TRUE(vmArray && vmArray->IndexOf(event->ViewManager()) != -1, - nsnull); + if (!vmArray || vmArray->IndexOf(event->ViewManager()) == -1) { + NS_ERROR("RevokeEvents is buggy. Fix it!"); + return nsnull; + } event->HandleEvent(); return nsnull; @@ -493,13 +495,15 @@ nsViewManager::~nsViewManager() mRootView = nsnull; } - if (IsRootVM()) { - nsCOMPtr eventQueue; - mEventQueueService->GetSpecialEventQueue(nsIEventQueueService::UI_THREAD_EVENT_QUEUE, - getter_AddRefs(eventQueue)); - NS_ASSERTION(nsnull != eventQueue, "Event queue is null"); - eventQueue->RevokeEvents(this); - } else { + // Make sure to RevokeEvents for all viewmanagers, since some events + // are posted by a non-root viewmanager. + nsCOMPtr eventQueue; + mEventQueueService->GetSpecialEventQueue(nsIEventQueueService::UI_THREAD_EVENT_QUEUE, + getter_AddRefs(eventQueue)); + NS_ASSERTION(eventQueue, "Event queue is null"); + eventQueue->RevokeEvents(this); + + if (!IsRootVM()) { // We have a strong ref to mRootViewManager NS_IF_RELEASE(mRootViewManager); } @@ -4234,6 +4238,10 @@ nsViewManager::ProcessSynthMouseMoveEvent(PRBool aFromScroll) return; } + // Hold a ref to ourselves so DispatchEvent won't destroy us (since + // we need to access members after we call DispatchEvent). + nsCOMPtr kungFuDeathGrip(this); + #ifdef DEBUG_MOUSE_LOCATION printf("[vm=%p]synthesizing mouse move to (%d,%d)\n", this, mMouseLocation.x, mMouseLocation.y);