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:
kmcclusk%netscape.com 2001-11-07 01:02:56 +00:00
Родитель 9f4a43bdfe
Коммит 8fe6fcd421
2 изменённых файлов: 28 добавлений и 0 удалений

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

@ -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);
} }
} }