From 7cf190dc2284a55f8a56764a3dd3f81a13a9226c Mon Sep 17 00:00:00 2001 From: "sayrer%gmail.com" Date: Fri, 28 Sep 2007 03:00:36 +0000 Subject: [PATCH] Bug 397804. pages loading feeds as content can trigger a leak. r=jst, sr=sicking, a=sicking git-svn-id: svn://10.0.0.236/trunk@236822 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/parser/htmlparser/src/nsParser.cpp | 24 ++++++++++--- mozilla/parser/htmlparser/src/nsParser.h | 5 +-- mozilla/parser/xml/src/nsSAXXMLReader.cpp | 34 ++++++++++++++++--- mozilla/parser/xml/src/nsSAXXMLReader.h | 4 ++- .../components/feeds/src/FeedProcessor.js | 8 +++-- 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index 7cb84d41878..cab3d056619 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -289,10 +289,26 @@ nsParser::~nsParser() NS_ASSERTION(!(mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT), "bad"); } -NS_IMPL_ISUPPORTS3(nsParser, - nsIRequestObserver, - nsIParser, - nsIStreamListener) +NS_IMPL_CYCLE_COLLECTION_CLASS(nsParser) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsParser) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mSink) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mObserver) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsParser) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mSink) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mObserver) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTING_ADDREF_AMBIGUOUS(nsParser, nsIParser) +NS_IMPL_CYCLE_COLLECTING_RELEASE_AMBIGUOUS(nsParser, nsIParser) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsParser) + NS_INTERFACE_MAP_ENTRY(nsIStreamListener) + NS_INTERFACE_MAP_ENTRY(nsIParser) + NS_INTERFACE_MAP_ENTRY(nsIRequestObserver) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIParser) +NS_INTERFACE_MAP_END // The parser continue event is posted only if // all of the data to parse has been passed to ::OnDataAvailable diff --git a/mozilla/parser/htmlparser/src/nsParser.h b/mozilla/parser/htmlparser/src/nsParser.h index bfd23009e44..ef3497f9005 100644 --- a/mozilla/parser/htmlparser/src/nsParser.h +++ b/mozilla/parser/htmlparser/src/nsParser.h @@ -88,6 +88,7 @@ #include "nsIParserFilter.h" #include "nsCOMArray.h" #include "nsIUnicharStreamListener.h" +#include "nsCycleCollectionParticipant.h" class nsIDTD; class nsScanner; @@ -114,8 +115,8 @@ class nsParser : public nsIParser, */ static void Shutdown(); - NS_DECL_ISUPPORTS - + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsParser, nsIParser) /** * default constructor diff --git a/mozilla/parser/xml/src/nsSAXXMLReader.cpp b/mozilla/parser/xml/src/nsSAXXMLReader.cpp index b40452d20c0..0835e789bb2 100644 --- a/mozilla/parser/xml/src/nsSAXXMLReader.cpp +++ b/mozilla/parser/xml/src/nsSAXXMLReader.cpp @@ -52,10 +52,36 @@ static NS_DEFINE_CID(kParserCID, NS_PARSER_CID); -NS_IMPL_ISUPPORTS6(nsSAXXMLReader, nsISAXXMLReader, - nsIExpatSink, nsIExtendedExpatSink, - nsIContentSink, nsIRequestObserver, - nsIStreamListener) +NS_IMPL_CYCLE_COLLECTION_CLASS(nsSAXXMLReader) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsSAXXMLReader) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mContentHandler) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mDTDHandler) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mErrorHandler) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mLexicalHandler) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mBaseURI) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mListener) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mParserObserver) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsSAXXMLReader) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mContentHandler) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mDTDHandler) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mErrorHandler) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mLexicalHandler) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mBaseURI) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mListener) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mParserObserver) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTING_ADDREF_AMBIGUOUS(nsSAXXMLReader, nsISAXXMLReader) +NS_IMPL_CYCLE_COLLECTING_RELEASE_AMBIGUOUS(nsSAXXMLReader, nsISAXXMLReader) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSAXXMLReader) + NS_INTERFACE_MAP_ENTRY(nsISAXXMLReader) + NS_INTERFACE_MAP_ENTRY(nsIExpatSink) + NS_INTERFACE_MAP_ENTRY(nsIExtendedExpatSink) + NS_INTERFACE_MAP_ENTRY(nsIContentSink) + NS_INTERFACE_MAP_ENTRY(nsIRequestObserver) + NS_INTERFACE_MAP_ENTRY(nsIStreamListener) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISAXXMLReader) +NS_INTERFACE_MAP_END nsSAXXMLReader::nsSAXXMLReader() : mIsAsyncParse(PR_FALSE) { diff --git a/mozilla/parser/xml/src/nsSAXXMLReader.h b/mozilla/parser/xml/src/nsSAXXMLReader.h index b0682ab6d6b..c42edc80a2c 100644 --- a/mozilla/parser/xml/src/nsSAXXMLReader.h +++ b/mozilla/parser/xml/src/nsSAXXMLReader.h @@ -48,6 +48,7 @@ #include "nsISAXDTDHandler.h" #include "nsISAXErrorHandler.h" #include "nsISAXLexicalHandler.h" +#include "nsCycleCollectionParticipant.h" #define NS_SAXXMLREADER_CONTRACTID "@mozilla.org/saxparser/xmlreader;1" #define NS_SAXXMLREADER_CLASSNAME "SAX XML Reader" @@ -60,7 +61,8 @@ class nsSAXXMLReader : public nsISAXXMLReader, public nsIContentSink { public: - NS_DECL_ISUPPORTS + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsSAXXMLReader, nsISAXXMLReader) NS_DECL_NSIEXPATSINK NS_DECL_NSIEXTENDEDEXPATSINK NS_DECL_NSISAXXMLREADER diff --git a/mozilla/toolkit/components/feeds/src/FeedProcessor.js b/mozilla/toolkit/components/feeds/src/FeedProcessor.js index f9858a67127..36a6a8725db 100644 --- a/mozilla/toolkit/components/feeds/src/FeedProcessor.js +++ b/mozilla/toolkit/components/feeds/src/FeedProcessor.js @@ -1074,6 +1074,7 @@ function FeedProcessor() { this._result = null; this._extensionHandler = null; this._xhtmlHandler = null; + this._haveSentResult = false; // http://www.w3.org/WAI/PF/GUI/ uses QNames in content :( this._waiPrefixes = {}; @@ -1262,6 +1263,7 @@ FeedProcessor.prototype = { // When we're done with the feed, let the listener know what // happened. _sendResult: function FP_sendResult() { + this._haveSentResult = true; try { // Can be null when a non-feed is fed to us if (this._result.doc) @@ -1331,7 +1333,8 @@ FeedProcessor.prototype = { fatalError: function FP_reportError() { this._result.bozo = true; //XXX need to QI to FeedProgressListener - this._sendResult(); + if (!this._haveSentResult) + this._sendResult(); }, // nsISAXContentHandler @@ -1341,7 +1344,8 @@ FeedProcessor.prototype = { }, endDocument: function FP_endDocument() { - this._sendResult(); + if (!this._haveSentResult) + this._sendResult(); }, // The transitions defined above identify elements that contain more