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