From 6dfbfcdd52f73c659e6b3db7ef19331ac8c8cd09 Mon Sep 17 00:00:00 2001 From: "aaronleventhal%moonset.net" Date: Mon, 8 Nov 2004 02:29:47 +0000 Subject: [PATCH] Bug 267387. Fix event_scrolling_end so it still gets fired after first document. r=pkwarren, sr=Henry.Jia --- accessible/src/base/nsDocAccessible.cpp | 25 ++++++++-------- accessible/src/base/nsDocAccessible.h | 4 +-- accessible/src/base/nsRootAccessible.cpp | 38 +++++++++++++----------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index 0a8dd1634f31..5bca60df143b 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -491,7 +491,6 @@ nsresult nsDocAccessible::AddEventListeners() PRBool isLoading = isContent; if (isContent) { - AddScrollListener(presShell); CheckForEditor(); if (!mEditor) { @@ -572,10 +571,7 @@ nsresult nsDocAccessible::RemoveEventListeners() } // Remove scroll position listener - nsCOMPtr presShell(do_QueryReferent(mWeakShell)); - if (presShell) { - RemoveScrollListener(presShell); - } + RemoveScrollListener(); nsCOMPtr target(do_QueryInterface(mDocument)); NS_ASSERTION(target, "No dom event target for document"); @@ -627,6 +623,7 @@ void nsDocAccessible::FireDocLoadFinished() mIsNewDocument = PR_FALSE; if (mBusy != eBusyStateDone) { + AddScrollListener(); #ifndef MOZ_ACCESSIBILITY_ATK mBusy = eBusyStateDone; // before event callback so STATE_BUSY is not reported FireToolkitEvent(nsIAccessibleEvent::EVENT_STATE_CHANGE, this, nsnull); @@ -668,11 +665,13 @@ void nsDocAccessible::ScrollTimerCallback(nsITimer *aTimer, void *aClosure) } } -void nsDocAccessible::AddScrollListener(nsIPresShell *aPresShell) +void nsDocAccessible::AddScrollListener() { + nsCOMPtr presShell(do_QueryReferent(mWeakShell)); + nsIViewManager* vm = nsnull; - if (aPresShell) - vm = aPresShell->GetViewManager(); + if (presShell) + vm = presShell->GetViewManager(); nsIScrollableView* scrollableView = nsnull; if (vm) @@ -682,11 +681,13 @@ void nsDocAccessible::AddScrollListener(nsIPresShell *aPresShell) scrollableView->AddScrollPositionListener(this); } -void nsDocAccessible::RemoveScrollListener(nsIPresShell *aPresShell) +void nsDocAccessible::RemoveScrollListener() { + nsCOMPtr presShell(do_QueryReferent(mWeakShell)); + nsIViewManager* vm = nsnull; - if (aPresShell) - vm = aPresShell->GetViewManager(); + if (presShell) + vm = presShell->GetViewManager(); nsIScrollableView* scrollableView = nsnull; if (vm) @@ -753,7 +754,7 @@ NS_IMETHODIMP nsDocAccessible::OnLocationChange(nsIWebProgress *aWebProgress, PRBool isLoadingDocument; aWebProgress->GetIsLoadingDocument(&isLoadingDocument); if (!isLoadingDocument) { - return NS_OK; // Staying on the same page, perhaps jumping to a named anchor + return NS_OK; // Staying on the same page, jumping to a named anchor } // Load has been verified, it will occur, about to commence diff --git a/accessible/src/base/nsDocAccessible.h b/accessible/src/base/nsDocAccessible.h index df12b6f64d88..3ed77cb60875 100644 --- a/accessible/src/base/nsDocAccessible.h +++ b/accessible/src/base/nsDocAccessible.h @@ -108,8 +108,8 @@ class nsDocAccessible : public nsBlockAccessible, virtual nsIFrame* GetFrame(); virtual nsresult AddEventListeners(); virtual nsresult RemoveEventListeners(); - void AddScrollListener(nsIPresShell *aPresShell); - void RemoveScrollListener(nsIPresShell *aPresShell); + void AddScrollListener(); + void RemoveScrollListener(); void FireDocLoadFinished(); void HandleMutationEvent(nsIDOMEvent *aEvent, PRUint32 aEventType); static void DocLoadCallback(nsITimer *aTimer, void *aClosure); diff --git a/accessible/src/base/nsRootAccessible.cpp b/accessible/src/base/nsRootAccessible.cpp index 2cb8ad2fa071..e21e59f6cd95 100644 --- a/accessible/src/base/nsRootAccessible.cpp +++ b/accessible/src/base/nsRootAccessible.cpp @@ -380,9 +380,25 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent) } #endif + if (!eventShell) { + return NS_OK; + } + + if (eventType.LowerCaseEqualsLiteral("unload")) { + // Only get cached accessible for unload -- so that we don't create it + // just to destroy it. + nsCOMPtr weakShell(do_GetWeakReference(eventShell)); + nsCOMPtr accessibleDoc; + nsAccessNode::GetDocAccessibleFor(weakShell, getter_AddRefs(accessibleDoc)); + nsCOMPtr privateAccDoc = do_QueryInterface(accessibleDoc); + if (privateAccDoc) { + privateAccDoc->Destroy(); + } + return NS_OK; + } + nsCOMPtr accessible; - if (!eventShell || - NS_FAILED(mAccService->GetAccessibleInShell(targetNode, eventShell, + if (NS_FAILED(mAccService->GetAccessibleInShell(targetNode, eventShell, getter_AddRefs(accessible)))) return NS_OK; @@ -429,14 +445,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent) } #endif - if (eventType.LowerCaseEqualsLiteral("unload")) { - nsCOMPtr privateAccDoc = - do_QueryInterface(accessible); - if (privateAccDoc) { - privateAccDoc->Destroy(); - } - } - else if (eventType.LowerCaseEqualsLiteral("focus") || + if (eventType.LowerCaseEqualsLiteral("focus") || eventType.LowerCaseEqualsLiteral("dommenuitemactive")) { if (optionTargetNode && NS_SUCCEEDED(mAccService->GetAccessibleInShell(optionTargetNode, eventShell, @@ -505,14 +514,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent) } #else AtkStateChange stateData; - if (eventType.LowerCaseEqualsLiteral("unload")) { - nsCOMPtr privateAccDoc = - do_QueryInterface(accessible); - if (privateAccDoc) { - privateAccDoc->Destroy(); - } - } - else if (eventType.EqualsIgnoreCase("load")) { + if (eventType.EqualsIgnoreCase("load")) { nsCOMPtr htmlDoc(do_QueryInterface(targetNode)); if (htmlDoc) { privAcc->FireToolkitEvent(nsIAccessibleEvent::EVENT_REORDER,