WebCore::HTMLMediaElement::mediaCanStart crashes
https://bugs.webkit.org/show_bug.cgi?id=209950

Reviewed by Jer Noble.

Source/WebCore:

Use WeakHashSet instead of HashSet to record MediaCanStartListeners in Document.

* dom/Document.cpp:
(WebCore::Document::addMediaCanStartListener):
(WebCore::Document::removeMediaCanStartListener):
(WebCore::Document::takeAnyMediaCanStartListener):
* dom/Document.h:
* page/MediaCanStartListener.h:

Source/WebKit:

UserMediaPermissionRequestManager does not need to inherit from
CanMakeWeakPtr<UserMediaPermissionRequestManager> because its
parent class MediaCanStartListener supports WeakPtr now.

* WebProcess/MediaStream/UserMediaPermissionRequestManager.h:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@259447 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index bd665f0..9a1cf0b 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,19 @@
+2020-04-03  Peng Liu  <peng.liu6@apple.com>
+
+        WebCore::HTMLMediaElement::mediaCanStart crashes
+        https://bugs.webkit.org/show_bug.cgi?id=209950
+
+        Reviewed by Jer Noble.
+
+        Use WeakHashSet instead of HashSet to record MediaCanStartListeners in Document.
+
+        * dom/Document.cpp:
+        (WebCore::Document::addMediaCanStartListener):
+        (WebCore::Document::removeMediaCanStartListener):
+        (WebCore::Document::takeAnyMediaCanStartListener):
+        * dom/Document.h:
+        * page/MediaCanStartListener.h:
+
 2020-04-03  Simon Fraser  <simon.fraser@apple.com>
 
         Flesh out enclosingScrollableArea() implementations
diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp
index 5f88252..3ef9459 100644
--- a/Source/WebCore/dom/Document.cpp
+++ b/Source/WebCore/dom/Document.cpp
@@ -6422,19 +6422,25 @@
 
 void Document::addMediaCanStartListener(MediaCanStartListener& listener)
 {
-    ASSERT(!m_mediaCanStartListeners.contains(&listener));
-    m_mediaCanStartListeners.add(&listener);
+    ASSERT(!m_mediaCanStartListeners.contains(listener));
+    m_mediaCanStartListeners.add(listener);
 }
 
 void Document::removeMediaCanStartListener(MediaCanStartListener& listener)
 {
-    ASSERT(m_mediaCanStartListeners.contains(&listener));
-    m_mediaCanStartListeners.remove(&listener);
+    ASSERT(m_mediaCanStartListeners.contains(listener));
+    m_mediaCanStartListeners.remove(listener);
 }
 
 MediaCanStartListener* Document::takeAnyMediaCanStartListener()
 {
-    return m_mediaCanStartListeners.takeAny();
+    if (m_mediaCanStartListeners.computesEmpty())
+        return nullptr;
+
+    MediaCanStartListener* listener = m_mediaCanStartListeners.begin().get();
+    m_mediaCanStartListeners.remove(*listener);
+
+    return listener;
 }
 
 #if ENABLE(DEVICE_ORIENTATION) && PLATFORM(IOS_FAMILY)
diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h
index 4f6e089..839afcd 100644
--- a/Source/WebCore/dom/Document.h
+++ b/Source/WebCore/dom/Document.h
@@ -1825,7 +1825,7 @@
 
     RenderPtr<RenderView> m_renderView;
 
-    HashSet<MediaCanStartListener*> m_mediaCanStartListeners;
+    WeakHashSet<MediaCanStartListener> m_mediaCanStartListeners;
 
 #if ENABLE(FULLSCREEN_API)
     UniqueRef<FullscreenManager> m_fullscreenManager;
diff --git a/Source/WebCore/page/MediaCanStartListener.h b/Source/WebCore/page/MediaCanStartListener.h
index 975a3ad..5a6c9b2 100644
--- a/Source/WebCore/page/MediaCanStartListener.h
+++ b/Source/WebCore/page/MediaCanStartListener.h
@@ -25,11 +25,13 @@
 
 #pragma once
 
+#include <wtf/WeakPtr.h>
+
 namespace WebCore {
 
 class Document;
 
-class MediaCanStartListener {
+class MediaCanStartListener : public CanMakeWeakPtr<MediaCanStartListener> {
 public:
     virtual void mediaCanStart(Document&) = 0;
 protected:
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 4adb1c8..41351f2 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,16 @@
+2020-04-03  Peng Liu  <peng.liu6@apple.com>
+
+        WebCore::HTMLMediaElement::mediaCanStart crashes
+        https://bugs.webkit.org/show_bug.cgi?id=209950
+
+        Reviewed by Jer Noble.
+
+        UserMediaPermissionRequestManager does not need to inherit from
+        CanMakeWeakPtr<UserMediaPermissionRequestManager> because its
+        parent class MediaCanStartListener supports WeakPtr now.
+
+        * WebProcess/MediaStream/UserMediaPermissionRequestManager.h:
+
 2020-04-02  John Wilander  <wilander@apple.com>
 
         Add SPI to configure WebsiteDataStores with a URL for standalone web applications and use it to disable first-party website data removal in ITP
diff --git a/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h b/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
index 3ce4191..047afa2 100644
--- a/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
+++ b/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
@@ -34,7 +34,7 @@
 
 class WebPage;
 
-class UserMediaPermissionRequestManager : public CanMakeWeakPtr<UserMediaPermissionRequestManager>, private WebCore::MediaCanStartListener {
+class UserMediaPermissionRequestManager : private WebCore::MediaCanStartListener {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     explicit UserMediaPermissionRequestManager(WebPage&);