diff --git a/accessible/src/base/nsCaretAccessible.cpp b/accessible/src/base/nsCaretAccessible.cpp index 8ce7cd8d36c0..d4f02933b2f0 100644 --- a/accessible/src/base/nsCaretAccessible.cpp +++ b/accessible/src/base/nsCaretAccessible.cpp @@ -132,13 +132,12 @@ nsresult nsCaretAccessible::SetControlSelectionListener(nsIDOMNode *aCurrentNode return selPrivate->AddSelectionListener(this); } -nsresult nsCaretAccessible::AddDocSelectionListener(nsIDOMDocument *aDoc) +nsresult +nsCaretAccessible::AddDocSelectionListener(nsIPresShell *aShell) { NS_ENSURE_TRUE(mRootAccessible, NS_ERROR_FAILURE); - nsCOMPtr doc = do_QueryInterface(aDoc); - NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE); - nsCOMPtr selCon = do_QueryInterface(doc->GetPrimaryShell()); + nsCOMPtr selCon = do_QueryInterface(aShell); NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE); nsCOMPtr domSel; @@ -149,12 +148,10 @@ nsresult nsCaretAccessible::AddDocSelectionListener(nsIDOMDocument *aDoc) return selPrivate->AddSelectionListener(this); } -nsresult nsCaretAccessible::RemoveDocSelectionListener(nsIDOMDocument *aDoc) +nsresult +nsCaretAccessible::RemoveDocSelectionListener(nsIPresShell *aShell) { - nsCOMPtr doc = do_QueryInterface(aDoc); - NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE); - - nsCOMPtr selCon = do_QueryInterface(doc->GetPrimaryShell()); + nsCOMPtr selCon = do_QueryInterface(aShell); NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE); nsCOMPtr domSel; diff --git a/accessible/src/base/nsCaretAccessible.h b/accessible/src/base/nsCaretAccessible.h index c9b75dd8e6bb..84ee521f66e0 100644 --- a/accessible/src/base/nsCaretAccessible.h +++ b/accessible/src/base/nsCaretAccessible.h @@ -103,17 +103,19 @@ public: * Start listening to selection events for a given document * More than one document's selection events can be listened to * at the same time, by a given nsCaretAccessible - * @param aDocument Document to listen to selection events for. + * @param aShell PresShell for document to listen to selection events from. */ - nsresult AddDocSelectionListener(nsIDOMDocument *aDoc); + nsresult AddDocSelectionListener(nsIPresShell *aShell); /** * Stop listening to selection events for a given document * If the document goes away, this method needs to be called for - * that document by the owner of the caret - * @param aDocument Document to listen to selection events for. + * that document by the owner of the caret. We use presShell because + * instead of document because it is more direct than getting it from + * the document, and in any case it is unavailable from the doc after a pagehide. + * @param aShell PresShell for document to no longer listen to selection events from. */ - nsresult RemoveDocSelectionListener(nsIDOMDocument *aDoc); + nsresult RemoveDocSelectionListener(nsIPresShell *aShell); nsRect GetCaretRect(nsIWidget **aOutWidget); diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index 45926106e285..67ed845efc78 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -669,8 +669,7 @@ nsresult nsDocAccessible::AddEventListeners() NS_ENSURE_TRUE(rootAccessible, NS_ERROR_FAILURE); nsRefPtr caretAccessible = rootAccessible->GetCaretAccessible(); if (caretAccessible) { - nsCOMPtr domDoc = do_QueryInterface(mDocument); - caretAccessible->AddDocSelectionListener(domDoc); + caretAccessible->AddDocSelectionListener(presShell); } } @@ -698,8 +697,8 @@ nsresult nsDocAccessible::RemoveEventListeners() if (rootAccessible) { nsRefPtr caretAccessible = rootAccessible->GetCaretAccessible(); if (caretAccessible) { - nsCOMPtr domDoc = do_QueryInterface(mDocument); - caretAccessible->RemoveDocSelectionListener(domDoc); + nsCOMPtr presShell(GetPresShell()); + caretAccessible->RemoveDocSelectionListener(presShell); } }