- 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;