Bug 1363396, ensure ContentViewer listeners are handled only when needed, r=mccr8

--HG--
extra : rebase_source : 49f1a2bc1a3ca1aecbf3639c580c19ae215cdcc8
This commit is contained in:
Olli Pettay 2017-05-11 02:20:27 +03:00
Родитель e45265442e
Коммит 33a3692644
1 изменённых файлов: 27 добавлений и 7 удалений

Просмотреть файл

@ -173,6 +173,8 @@ public:
nsresult Init(nsDocumentViewer *aDocViewer);
void Disconnect() { mDocViewer = nullptr; }
protected:
virtual ~nsDocViewerSelectionListener() {}
@ -197,6 +199,8 @@ public:
nsresult Init(nsDocumentViewer *aDocViewer);
void Disconnect() { mDocViewer = nullptr; }
protected:
/** default destructor
*/
@ -342,7 +346,7 @@ protected:
RefPtr<nsPresContext> mPresContext;
nsCOMPtr<nsIPresShell> mPresShell;
nsCOMPtr<nsISelectionListener> mSelectionListener;
RefPtr<nsDocViewerSelectionListener> mSelectionListener;
RefPtr<nsDocViewerFocusListener> mFocusListener;
nsCOMPtr<nsIContentViewer> mPreviousViewer;
@ -586,6 +590,14 @@ nsDocumentViewer::~nsDocumentViewer()
Destroy();
}
if (mSelectionListener) {
mSelectionListener->Disconnect();
}
if (mFocusListener) {
mFocusListener->Disconnect();
}
// XXX(?) Revoke pending invalidate events
}
@ -764,6 +776,9 @@ nsDocumentViewer::InitPresentationStuff(bool aDoInitialReflow)
// Save old listener so we can unregister it
RefPtr<nsDocViewerFocusListener> oldFocusListener = mFocusListener;
if (oldFocusListener) {
oldFocusListener->Disconnect();
}
// focus listener
//
@ -1563,11 +1578,14 @@ nsDocumentViewer::Close(nsISHEntry *aSHEntry)
mDocument->RemovedFromDocShell();
}
if (mFocusListener && mDocument) {
mDocument->RemoveEventListener(NS_LITERAL_STRING("focus"), mFocusListener,
false);
mDocument->RemoveEventListener(NS_LITERAL_STRING("blur"), mFocusListener,
false);
if (mFocusListener) {
mFocusListener->Disconnect();
if (mDocument) {
mDocument->RemoveEventListener(NS_LITERAL_STRING("focus"), mFocusListener,
false);
mDocument->RemoveEventListener(NS_LITERAL_STRING("blur"), mFocusListener,
false);
}
}
return NS_OK;
@ -3740,7 +3758,9 @@ NS_IMETHODIMP nsDocumentViewer::GetInImage(bool* aInImage)
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
RefPtr<mozilla::dom::Selection> selection = mDocViewer->GetDocumentSelection();