зеркало из https://github.com/mozilla/pjs.git
Fix leak of parser objects when page load is interrupted by calling nsParser::CancelParsingEvents inside nsParser::Terminate; bug 108049 (patch from aaronr@us.ibm.com) r=harishd sr=attinasi
This commit is contained in:
Родитель
9f4a43bdfe
Коммит
8fe6fcd421
|
@ -1320,7 +1320,13 @@ nsParser::CancelParsingEvents() {
|
||||||
if (mEventQueue != nsnull) {
|
if (mEventQueue != nsnull) {
|
||||||
mEventQueue->RevokeEvents(this);
|
mEventQueue->RevokeEvents(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
mPendingContinueEvent=PR_FALSE;
|
mPendingContinueEvent=PR_FALSE;
|
||||||
|
/* Since we are taking this off of the queue, we need to do the NS_RELEASE
|
||||||
|
* that nsParserContinueEvent::HandleEvent would have done.
|
||||||
|
*/
|
||||||
|
nsParser* me = this;
|
||||||
|
NS_RELEASE(me);
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -1454,6 +1460,14 @@ nsresult nsParser::Terminate(void){
|
||||||
// Hack - Hold a reference until we are completely done...
|
// Hack - Hold a reference until we are completely done...
|
||||||
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
|
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
|
||||||
mInternalState=result;
|
mInternalState=result;
|
||||||
|
|
||||||
|
// CancelParsingEvents must be called to avoid leaking the nsParser object
|
||||||
|
// @see bug 108049
|
||||||
|
// If mPendingContinueEvents is PR_TRUE CancelParsingEvents will reset
|
||||||
|
// the mPendingContinueEvent to PR_FALSE so DidBuildModel will call
|
||||||
|
// DidBuildModel on the DTD. Note: The IsComplete() call inside of DidBuildModel
|
||||||
|
// looks at the mPendingContinueEvents flag.
|
||||||
|
CancelParsingEvents();
|
||||||
DidBuildModel(result);
|
DidBuildModel(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1320,7 +1320,13 @@ nsParser::CancelParsingEvents() {
|
||||||
if (mEventQueue != nsnull) {
|
if (mEventQueue != nsnull) {
|
||||||
mEventQueue->RevokeEvents(this);
|
mEventQueue->RevokeEvents(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
mPendingContinueEvent=PR_FALSE;
|
mPendingContinueEvent=PR_FALSE;
|
||||||
|
/* Since we are taking this off of the queue, we need to do the NS_RELEASE
|
||||||
|
* that nsParserContinueEvent::HandleEvent would have done.
|
||||||
|
*/
|
||||||
|
nsParser* me = this;
|
||||||
|
NS_RELEASE(me);
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
@ -1454,6 +1460,14 @@ nsresult nsParser::Terminate(void){
|
||||||
// Hack - Hold a reference until we are completely done...
|
// Hack - Hold a reference until we are completely done...
|
||||||
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
|
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
|
||||||
mInternalState=result;
|
mInternalState=result;
|
||||||
|
|
||||||
|
// CancelParsingEvents must be called to avoid leaking the nsParser object
|
||||||
|
// @see bug 108049
|
||||||
|
// If mPendingContinueEvents is PR_TRUE CancelParsingEvents will reset
|
||||||
|
// the mPendingContinueEvent to PR_FALSE so DidBuildModel will call
|
||||||
|
// DidBuildModel on the DTD. Note: The IsComplete() call inside of DidBuildModel
|
||||||
|
// looks at the mPendingContinueEvents flag.
|
||||||
|
CancelParsingEvents();
|
||||||
DidBuildModel(result);
|
DidBuildModel(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче