зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1363396
, ensure ContentViewer listeners are handled only when needed, r=mccr8
--HG-- extra : rebase_source : 49f1a2bc1a3ca1aecbf3639c580c19ae215cdcc8
This commit is contained in:
Родитель
e45265442e
Коммит
33a3692644
|
@ -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();
|
||||
|
|
Загрузка…
Ссылка в новой задаче