Title: [199126] trunk/Source/WebCore
Revision
199126
Author
[email protected]
Date
2016-04-06 17:14:42 -0700 (Wed, 06 Apr 2016)

Log Message

[iOS Simulator WK1] Crash in MediaPlayer::setPrivateBrowsingMode()
https://bugs.webkit.org/show_bug.cgi?id=155721
<rdar://problem/18590481>

Speculative fix for a crash that appears to happen when the media engine is destroyed
during a callback.

Reviewed by Dean Jackson.

No new tests, this prevents existing tests from crashing.

* html/HTMLMediaElement.cpp:
(WebCore::actionName): Log MediaEngineUpdated.
(WebCore::HTMLMediaElement::scheduleDelayedAction): Support MediaEngineUpdated.
(WebCore::HTMLMediaElement::pendingActionTimerFired): Ditto. Clear m_pendingActionFlags.
(WebCore::HTMLMediaElement::mediaEngineWasUpdated): New.
(WebCore::HTMLMediaElement::mediaPlayerEngineUpdated): Move guts to mediaEngineWasUpdated and
  call it on a timer so we can't change the media engine in the middle of a callback from
  MediaPlayer or the media engine.
* html/HTMLMediaElement.h:
* html/HTMLMediaElementEnums.h:

* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::~MediaPlayer): Assert if new flag m_initializingMediaEngine is set to
  catch HTMLMediaElement destroying the media engine during a callback.
(WebCore::MediaPlayer::loadWithNextMediaEngine): Set/clear m_initializingMediaEngine.
* platform/graphics/MediaPlayer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (199125 => 199126)


--- trunk/Source/WebCore/ChangeLog	2016-04-07 00:13:51 UTC (rev 199125)
+++ trunk/Source/WebCore/ChangeLog	2016-04-07 00:14:42 UTC (rev 199126)
@@ -1,3 +1,33 @@
+2016-04-06  Eric Carlson  <[email protected]>
+
+        [iOS Simulator WK1] Crash in MediaPlayer::setPrivateBrowsingMode()
+        https://bugs.webkit.org/show_bug.cgi?id=155721
+        <rdar://problem/18590481>
+
+        Speculative fix for a crash that appears to happen when the media engine is destroyed
+        during a callback.
+
+        Reviewed by Dean Jackson.
+
+        No new tests, this prevents existing tests from crashing.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::actionName): Log MediaEngineUpdated.
+        (WebCore::HTMLMediaElement::scheduleDelayedAction): Support MediaEngineUpdated.
+        (WebCore::HTMLMediaElement::pendingActionTimerFired): Ditto. Clear m_pendingActionFlags.
+        (WebCore::HTMLMediaElement::mediaEngineWasUpdated): New.
+        (WebCore::HTMLMediaElement::mediaPlayerEngineUpdated): Move guts to mediaEngineWasUpdated and
+          call it on a timer so we can't change the media engine in the middle of a callback from
+          MediaPlayer or the media engine.
+        * html/HTMLMediaElement.h:
+        * html/HTMLMediaElementEnums.h:
+
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::MediaPlayer::~MediaPlayer): Assert if new flag m_initializingMediaEngine is set to
+          catch HTMLMediaElement destroying the media engine during a callback.
+        (WebCore::MediaPlayer::loadWithNextMediaEngine): Set/clear m_initializingMediaEngine.
+        * platform/graphics/MediaPlayer.h:
+
 2016-04-06  Brady Eidson  <[email protected]>
 
         Modern IDB: Make sure SQLite backing store records have a INTEGER PRIMARY KEY column.

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (199125 => 199126)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-04-07 00:13:51 UTC (rev 199125)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-04-07 00:14:42 UTC (rev 199126)
@@ -191,23 +191,24 @@
 {
     StringBuilder actionBuilder;
 
-#define CASE(_actionType) \
+#define ACTION(_actionType) \
     if (action & (HTMLMediaElementEnums::_actionType)) { \
         if (!actionBuilder.isEmpty()) \
         actionBuilder.append(", "); \
         actionBuilder.append(#_actionType); \
     } \
 
-    CASE(LoadMediaResource);
-    CASE(ConfigureTextTracks);
-    CASE(TextTrackChangesNotification);
-    CASE(ConfigureTextTrackDisplay);
-    CASE(CheckPlaybackTargetCompatablity);
-    CASE(CheckMediaState);
+    ACTION(LoadMediaResource);
+    ACTION(ConfigureTextTracks);
+    ACTION(TextTrackChangesNotification);
+    ACTION(ConfigureTextTrackDisplay);
+    ACTION(CheckPlaybackTargetCompatablity);
+    ACTION(CheckMediaState);
+    ACTION(MediaEngineUpdated);
 
     return actionBuilder.toString();
 
-#undef CASE
+#undef ACTION
 }
 
 #endif
@@ -869,6 +870,9 @@
     if (actionType & CheckMediaState)
         setFlags(m_pendingActionFlags, CheckMediaState);
 
+    if (actionType & MediaEngineUpdated)
+        setFlags(m_pendingActionFlags, MediaEngineUpdated);
+
     m_pendingActionTimer.startOneShot(0);
 }
 
@@ -896,13 +900,15 @@
 void HTMLMediaElement::pendingActionTimerFired()
 {
     Ref<HTMLMediaElement> protect(*this); // loadNextSourceChild may fire 'beforeload', which can make arbitrary DOM mutations.
+    PendingActionFlags pendingActions = m_pendingActionFlags;
+    m_pendingActionFlags = 0;
 
 #if ENABLE(VIDEO_TRACK)
-    if (RuntimeEnabledFeatures::sharedFeatures().webkitVideoTrackEnabled() && (m_pendingActionFlags & ConfigureTextTracks))
+    if (RuntimeEnabledFeatures::sharedFeatures().webkitVideoTrackEnabled() && (pendingActions & ConfigureTextTracks))
         configureTextTracks();
 #endif
 
-    if (m_pendingActionFlags & LoadMediaResource) {
+    if (pendingActions & LoadMediaResource) {
         if (m_loadState == LoadingFromSourceElement)
             loadNextSourceChild();
         else
@@ -910,17 +916,18 @@
     }
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
-    if (m_pendingActionFlags & CheckPlaybackTargetCompatablity && m_player && m_player->isCurrentPlaybackTargetWireless() && !m_player->canPlayToWirelessPlaybackTarget()) {
+    if (pendingActions & CheckPlaybackTargetCompatablity && m_player && m_player->isCurrentPlaybackTargetWireless() && !m_player->canPlayToWirelessPlaybackTarget()) {
         LOG(Media, "HTMLMediaElement::pendingActionTimerFired(%p) - calling setShouldPlayToPlaybackTarget(false)", this);
         m_failedToPlayToWirelessTarget = true;
         m_player->setShouldPlayToPlaybackTarget(false);
     }
 
-    if (m_pendingActionFlags & CheckMediaState)
+    if (pendingActions & CheckMediaState)
         updateMediaState();
 #endif
 
-    m_pendingActionFlags = 0;
+    if (pendingActions & MediaEngineUpdated)
+        mediaEngineWasUpdated();
 }
 
 PassRefPtr<MediaError> HTMLMediaElement::error() const 
@@ -4532,20 +4539,14 @@
 }
 #endif
 
-void HTMLMediaElement::mediaPlayerEngineUpdated(MediaPlayer*)
+void HTMLMediaElement::mediaEngineWasUpdated()
 {
-    LOG(Media, "HTMLMediaElement::mediaPlayerEngineUpdated(%p)", this);
+    LOG(Media, "HTMLMediaElement::mediaEngineWasUpdated(%p)", this);
     beginProcessingMediaPlayerCallback();
     if (renderer())
         renderer()->updateFromElement();
     endProcessingMediaPlayerCallback();
 
-#if ENABLE(MEDIA_SOURCE)
-    m_droppedVideoFrames = 0;
-#endif
-
-    m_havePreparedToPlay = false;
-
     m_mediaSession->mediaEngineUpdated(*this);
 
 #if ENABLE(WEB_AUDIO)
@@ -4563,11 +4564,25 @@
     m_player->setVideoFullscreenGravity(m_videoFullscreenGravity);
     m_player->setVideoFullscreenLayer(m_videoFullscreenLayer.get());
 #endif
+
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     updateMediaState(UpdateMediaState::Asynchronously);
 #endif
 }
 
+void HTMLMediaElement::mediaPlayerEngineUpdated(MediaPlayer*)
+{
+    LOG(Media, "HTMLMediaElement::mediaPlayerEngineUpdated(%p)", this);
+
+#if ENABLE(MEDIA_SOURCE)
+    m_droppedVideoFrames = 0;
+#endif
+
+    m_havePreparedToPlay = false;
+
+    scheduleDelayedAction(MediaEngineUpdated);
+}
+
 void HTMLMediaElement::mediaPlayerFirstVideoFrameAvailable(MediaPlayer*)
 {
     LOG(Media, "HTMLMediaElement::mediaPlayerFirstVideoFrameAvailable(%p) - current display mode = %i", this, (int)displayMode());

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (199125 => 199126)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2016-04-07 00:13:51 UTC (rev 199125)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2016-04-07 00:14:42 UTC (rev 199126)
@@ -547,7 +547,8 @@
     bool mediaPlayerRenderingCanBeAccelerated(MediaPlayer*) override;
     void mediaPlayerRenderingModeChanged(MediaPlayer*) override;
     void mediaPlayerEngineUpdated(MediaPlayer*) override;
-    
+    void mediaEngineWasUpdated();
+
     void mediaPlayerFirstVideoFrameAvailable(MediaPlayer*) override;
     void mediaPlayerCharacteristicChanged(MediaPlayer*) override;
 

Modified: trunk/Source/WebCore/html/HTMLMediaElementEnums.h (199125 => 199126)


--- trunk/Source/WebCore/html/HTMLMediaElementEnums.h	2016-04-07 00:13:51 UTC (rev 199125)
+++ trunk/Source/WebCore/html/HTMLMediaElementEnums.h	2016-04-07 00:14:42 UTC (rev 199126)
@@ -41,6 +41,7 @@
         ConfigureTextTrackDisplay = 1 << 3,
         CheckPlaybackTargetCompatablity = 1 << 4,
         CheckMediaState = 1 << 5,
+        MediaEngineUpdated = 1 << 6,
 
         EveryDelayedAction = LoadMediaResource | ConfigureTextTracks | TextTrackChangesNotification | ConfigureTextTrackDisplay | CheckPlaybackTargetCompatablity | CheckMediaState,
     };

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp (199125 => 199126)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2016-04-07 00:13:51 UTC (rev 199125)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2016-04-07 00:14:42 UTC (rev 199126)
@@ -328,6 +328,7 @@
 
 MediaPlayer::~MediaPlayer()
 {
+    ASSERT(!m_initializingMediaEngine);
 }
 
 bool MediaPlayer::load(const URL& url, const ContentType& contentType, const String& keySystem)
@@ -434,6 +435,9 @@
 #define MEDIASTREAM 0
 #endif
 
+    ASSERT(!m_initializingMediaEngine);
+    m_initializingMediaEngine = true;
+
     const MediaPlayerFactory* engine = nullptr;
 
     if (!m_contentMIMEType.isEmpty() || MEDIASTREAM || MEDIASOURCE)
@@ -476,6 +480,8 @@
         m_client.mediaPlayerEngineUpdated(this);
         m_client.mediaPlayerResourceNotSupported(this);
     }
+
+    m_initializingMediaEngine = false;
 }
 
 bool MediaPlayer::hasAvailableVideoFrame() const

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (199125 => 199126)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2016-04-07 00:13:51 UTC (rev 199125)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2016-04-07 00:14:42 UTC (rev 199126)
@@ -617,6 +617,7 @@
     bool m_privateBrowsing;
     bool m_shouldPrepareToRender;
     bool m_contentMIMETypeWasInferredFromExtension;
+    bool m_initializingMediaEngine { false };
 
 #if ENABLE(MEDIA_SOURCE)
     RefPtr<MediaSourcePrivateClient> m_mediaSource;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to