#402, Bug 1363396 - Ensure ContentViewer listeners are handled only when needed. r=mccr8, a=abillings

This commit is contained in:
Olli Pettay 2017-05-11 02:20:27 +03:00 committed by Cameron Kaiser
parent eb8492dd33
commit c1a5c64e78

View File

@ -169,6 +169,8 @@ public:
nsresult Init(nsDocumentViewer *aDocViewer); nsresult Init(nsDocumentViewer *aDocViewer);
void Disconnect() { mDocViewer = nullptr; }
protected: protected:
virtual ~nsDocViewerSelectionListener() {} virtual ~nsDocViewerSelectionListener() {}
@ -193,6 +195,8 @@ public:
nsresult Init(nsDocumentViewer *aDocViewer); nsresult Init(nsDocumentViewer *aDocViewer);
void Disconnect() { mDocViewer = nullptr; }
protected: protected:
/** default destructor /** default destructor
*/ */
@ -347,7 +351,7 @@ protected:
RefPtr<nsPresContext> mPresContext; RefPtr<nsPresContext> mPresContext;
nsCOMPtr<nsIPresShell> mPresShell; nsCOMPtr<nsIPresShell> mPresShell;
nsCOMPtr<nsISelectionListener> mSelectionListener; RefPtr<nsDocViewerSelectionListener> mSelectionListener;
RefPtr<nsDocViewerFocusListener> mFocusListener; RefPtr<nsDocViewerFocusListener> mFocusListener;
nsCOMPtr<nsIContentViewer> mPreviousViewer; nsCOMPtr<nsIContentViewer> mPreviousViewer;
@ -523,6 +527,14 @@ nsDocumentViewer::~nsDocumentViewer()
Destroy(); Destroy();
} }
if (mSelectionListener) {
mSelectionListener->Disconnect();
}
if (mFocusListener) {
mFocusListener->Disconnect();
}
// XXX(?) Revoke pending invalidate events // XXX(?) Revoke pending invalidate events
} }
@ -701,6 +713,9 @@ nsDocumentViewer::InitPresentationStuff(bool aDoInitialReflow)
// Save old listener so we can unregister it // Save old listener so we can unregister it
RefPtr<nsDocViewerFocusListener> oldFocusListener = mFocusListener; RefPtr<nsDocViewerFocusListener> oldFocusListener = mFocusListener;
if (oldFocusListener) {
oldFocusListener->Disconnect();
}
// focus listener // focus listener
// //
@ -1467,11 +1482,14 @@ nsDocumentViewer::Close(nsISHEntry *aSHEntry)
mDocument->RemovedFromDocShell(); mDocument->RemovedFromDocShell();
} }
if (mFocusListener && mDocument) { if (mFocusListener) {
mDocument->RemoveEventListener(NS_LITERAL_STRING("focus"), mFocusListener, mFocusListener->Disconnect();
false); if (mDocument) {
mDocument->RemoveEventListener(NS_LITERAL_STRING("blur"), mFocusListener, mDocument->RemoveEventListener(NS_LITERAL_STRING("focus"), mFocusListener,
false); false);
mDocument->RemoveEventListener(NS_LITERAL_STRING("blur"), mFocusListener,
false);
}
} }
return NS_OK; return NS_OK;
@ -3450,7 +3468,9 @@ NS_IMETHODIMP nsDocumentViewer::GetInImage(bool* aInImage)
NS_IMETHODIMP nsDocViewerSelectionListener::NotifySelectionChanged(nsIDOMDocument *, nsISelection *, int16_t aReason) NS_IMETHODIMP nsDocViewerSelectionListener::NotifySelectionChanged(nsIDOMDocument *, nsISelection *, int16_t aReason)
{ {
NS_ASSERTION(mDocViewer, "Should have doc viewer!"); if (!mDocViewer) {
return NS_OK;
}
// get the selection state // get the selection state
RefPtr<mozilla::dom::Selection> selection = mDocViewer->GetDocumentSelection(); RefPtr<mozilla::dom::Selection> selection = mDocViewer->GetDocumentSelection();