Bug 267387. Fix event_scrolling_end so it still gets fired after first document. r=pkwarren, sr=Henry.Jia

This commit is contained in:
aaronleventhal%moonset.net 2004-11-08 02:29:47 +00:00
parent f87889ae17
commit 6dfbfcdd52
3 changed files with 35 additions and 32 deletions

View File

@ -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<nsIPresShell> presShell(do_QueryReferent(mWeakShell));
if (presShell) {
RemoveScrollListener(presShell);
}
RemoveScrollListener();
nsCOMPtr<nsIDOMEventTarget> 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<nsIPresShell> 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<nsIPresShell> 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

View File

@ -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);

View File

@ -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<nsIWeakReference> weakShell(do_GetWeakReference(eventShell));
nsCOMPtr<nsIAccessibleDocument> accessibleDoc;
nsAccessNode::GetDocAccessibleFor(weakShell, getter_AddRefs(accessibleDoc));
nsCOMPtr<nsPIAccessibleDocument> privateAccDoc = do_QueryInterface(accessibleDoc);
if (privateAccDoc) {
privateAccDoc->Destroy();
}
return NS_OK;
}
nsCOMPtr<nsIAccessible> 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<nsPIAccessibleDocument> 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<nsPIAccessibleDocument> privateAccDoc =
do_QueryInterface(accessible);
if (privateAccDoc) {
privateAccDoc->Destroy();
}
}
else if (eventType.EqualsIgnoreCase("load")) {
if (eventType.EqualsIgnoreCase("load")) {
nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(targetNode));
if (htmlDoc) {
privAcc->FireToolkitEvent(nsIAccessibleEvent::EVENT_REORDER,