Bug 1421004 - Break the mDocument reference cycle at Destroy(). r=jwwang,smaug
☠☠ backed out by c408aa5f26f9 ☠ ☠
authorbechen@mozilla.com <bechen@mozilla.com>
Tue, 05 Dec 2017 15:32:12 +0800
changeset 449527 b0c952f7d225181a76d4dafbe144dcd72e10b08b
parent 449526 240069ba65d7d460c4443110bb38112ff34fbc69
child 449528 a30ad544bf0feae8395af0eb597a929befdcb679
push id1648
push usermtabara@mozilla.com
push dateThu, 01 Mar 2018 12:45:47 +0000
treeherdermozilla-release@cbb9688c2eeb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjwwang, smaug
bugs1421004
milestone59.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1421004 - Break the mDocument reference cycle at Destroy(). r=jwwang,smaug We break the cycle reference between VideoDocument/Plugindocument and MediaDocumentStreamListener when the document be destroyed. MozReview-Commit-ID: Aowla95zMgg
dom/html/MediaDocument.h
dom/html/PluginDocument.cpp
dom/html/VideoDocument.cpp
--- a/dom/html/MediaDocument.h
+++ b/dom/html/MediaDocument.h
@@ -90,16 +90,21 @@ public:
   void SetStreamListener(nsIStreamListener *aListener);
 
   NS_DECL_ISUPPORTS
 
   NS_DECL_NSIREQUESTOBSERVER
 
   NS_DECL_NSISTREAMLISTENER
 
-  RefPtr<MediaDocument>      mDocument;
-  nsCOMPtr<nsIStreamListener>  mNextStream;
+  void DropDocumentRef()
+  {
+    mDocument = nullptr;
+  }
+
+  RefPtr<MediaDocument> mDocument;
+  nsCOMPtr<nsIStreamListener> mNextStream;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif /* mozilla_dom_MediaDocument_h */
--- a/dom/html/PluginDocument.cpp
+++ b/dom/html/PluginDocument.cpp
@@ -43,16 +43,24 @@ public:
   void SetScriptGlobalObject(nsIScriptGlobalObject* aScriptGlobalObject) override;
   bool CanSavePresentation(nsIRequest *aNewRequest) override;
 
   const nsCString& GetType() const { return mMimeType; }
   Element*         GetPluginContent() { return mPluginContent; }
 
   void StartLayout() { MediaDocument::StartLayout(); }
 
+  virtual void Destroy()
+  {
+    if (mStreamListener) {
+      mStreamListener->DropDocumentRef();
+    }
+    MediaDocument::Destroy();
+  }
+
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PluginDocument, MediaDocument)
 protected:
   ~PluginDocument() override;
 
   nsresult CreateSyntheticPluginDocument();
 
   nsCOMPtr<Element>                        mPluginContent;
   RefPtr<MediaDocumentStreamListener>    mStreamListener;
--- a/dom/html/VideoDocument.cpp
+++ b/dom/html/VideoDocument.cpp
@@ -23,16 +23,24 @@ public:
                                      nsIChannel*         aChannel,
                                      nsILoadGroup*       aLoadGroup,
                                      nsISupports*        aContainer,
                                      nsIStreamListener** aDocListener,
                                      bool                aReset = true,
                                      nsIContentSink*     aSink = nullptr);
   virtual void SetScriptGlobalObject(nsIScriptGlobalObject* aScriptGlobalObject);
 
+  virtual void Destroy()
+  {
+    if (mStreamListener) {
+      mStreamListener->DropDocumentRef();
+    }
+    MediaDocument::Destroy();
+  }
+
 protected:
 
   // Sets document <title> to reflect the file name and description.
   void UpdateTitle(nsIChannel* aChannel);
 
   nsresult CreateSyntheticVideoDocument(nsIChannel* aChannel,
                                         nsIStreamListener** aListener);