<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[210712] branches/safari-603-branch/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/210712">210712</a></dd>
<dt>Author</dt> <dd>matthew_hanson@apple.com</dd>
<dt>Date</dt> <dd>2017-01-12 22:10:37 -0800 (Thu, 12 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/210677">r210677</a>. rdar://problem/21482487</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari603branchSourceWebCoreChangeLog">branches/safari-603-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari603branchSourceWebCorehtmlHTMLMediaElementcpp">branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#branchessafari603branchSourceWebCorehtmlHTMLMediaElementh">branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#branchessafari603branchSourceWebCoreplatformgraphicsMediaPlayercpp">branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.cpp</a></li>
<li><a href="#branchessafari603branchSourceWebCoreplatformgraphicsMediaPlayerh">branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari603branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-603-branch/Source/WebCore/ChangeLog (210711 => 210712)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-603-branch/Source/WebCore/ChangeLog        2017-01-13 06:10:34 UTC (rev 210711)
+++ branches/safari-603-branch/Source/WebCore/ChangeLog        2017-01-13 06:10:37 UTC (rev 210712)
</span><span class="lines">@@ -1,5 +1,81 @@
</span><span class="cx"> 2017-01-12  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Merge r210677. rdar://problem/21482487
+
+    2017-01-12  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+            Protect MediaPlayer from being destroyed mid-load()
+            https://bugs.webkit.org/show_bug.cgi?id=166976
+
+            Reviewed by Eric Carlson.
+
+            It's possible for a message sent by MediaPlayer to HTMLMediaElement to cause
+            MediaPlayer to be destroyed before MediaPlayer::load() completes. We have
+            previously protected against this same problem in HTMLMediaElement::loadResource()
+            by ref'ing at the beginning of the function and deref'ing on exit. To do the
+            same in MediaPlayer, it must become RefCounted.
+
+            To keep the same semantics about m_client in MediaPlayer (always available without
+            requiring a null-check), make a new static MediaPlayerClient object which can
+            replace the real (HTMLMediaElement) client when the MediaPlayer is invalidated.
+
+            * html/HTMLMediaElement.cpp:
+            (WebCore::HTMLMediaElement::~HTMLMediaElement):
+            (WebCore::HTMLMediaElement::clearMediaPlayer):
+            (WebCore::HTMLMediaElement::createMediaPlayer):
+            * html/HTMLMediaElement.h:
+            * platform/graphics/MediaPlayer.cpp:
+            (WebCore::nullMediaPlayerClient):
+            (WebCore::MediaPlayer::create):
+            (WebCore::MediaPlayer::MediaPlayer):
+            (WebCore::MediaPlayer::invalidate):
+            (WebCore::MediaPlayer::load):
+            (WebCore::MediaPlayer::loadWithNextMediaEngine):
+            (WebCore::MediaPlayer::inMediaDocument):
+            (WebCore::MediaPlayer::fullscreenMode):
+            (WebCore::MediaPlayer::requestedRate):
+            (WebCore::MediaPlayer::currentPlaybackTargetIsWirelessChanged):
+            (WebCore::MediaPlayer::networkStateChanged):
+            (WebCore::MediaPlayer::readyStateChanged):
+            (WebCore::MediaPlayer::volumeChanged):
+            (WebCore::MediaPlayer::muteChanged):
+            (WebCore::MediaPlayer::timeChanged):
+            (WebCore::MediaPlayer::sizeChanged):
+            (WebCore::MediaPlayer::repaint):
+            (WebCore::MediaPlayer::durationChanged):
+            (WebCore::MediaPlayer::rateChanged):
+            (WebCore::MediaPlayer::playbackStateChanged):
+            (WebCore::MediaPlayer::firstVideoFrameAvailable):
+            (WebCore::MediaPlayer::characteristicChanged):
+            (WebCore::MediaPlayer::cachedKeyForKeyId):
+            (WebCore::MediaPlayer::keyNeeded):
+            (WebCore::MediaPlayer::mediaKeysStorageDirectory):
+            (WebCore::MediaPlayer::referrer):
+            (WebCore::MediaPlayer::userAgent):
+            (WebCore::MediaPlayer::graphicsDeviceAdapter):
+            (WebCore::MediaPlayer::cachedResourceLoader):
+            (WebCore::MediaPlayer::createResourceLoader):
+            (WebCore::MediaPlayer::addAudioTrack):
+            (WebCore::MediaPlayer::removeAudioTrack):
+            (WebCore::MediaPlayer::addTextTrack):
+            (WebCore::MediaPlayer::removeTextTrack):
+            (WebCore::MediaPlayer::addVideoTrack):
+            (WebCore::MediaPlayer::removeVideoTrack):
+            (WebCore::MediaPlayer::outOfBandTrackSources):
+            (WebCore::MediaPlayer::shouldWaitForResponseToAuthenticationChallenge):
+            (WebCore::MediaPlayer::handlePlaybackCommand):
+            (WebCore::MediaPlayer::sourceApplicationIdentifier):
+            (WebCore::MediaPlayer::preferredAudioCharacteristics):
+            (WebCore::MediaPlayer::doesHaveAttribute):
+            (WebCore::MediaPlayer::mediaPlayerNetworkInterfaceName):
+            (WebCore::MediaPlayer::getRawCookies):
+            (WebCore::MediaPlayer::shouldDisableSleep):
+            * platform/graphics/MediaPlayer.h:
+            (WebCore::MediaPlayer::platformVolumeConfigurationRequired):
+            (WebCore::MediaPlayer::client):
+
+2017-01-12  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
+
</ins><span class="cx">         Merge r210663. rdar://problem/29916484
</span><span class="cx"> 
</span><span class="cx">     2017-01-12  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
</span></span></pre></div>
<a id="branchessafari603branchSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.cpp (210711 => 210712)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.cpp        2017-01-13 06:10:34 UTC (rev 210711)
+++ branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.cpp        2017-01-13 06:10:37 UTC (rev 210712)
</span><span class="lines">@@ -569,7 +569,10 @@
</span><span class="cx"> 
</span><span class="cx">     m_completelyLoaded = true;
</span><span class="cx"> 
</span><del>-    m_player = nullptr;
</del><ins>+    if (m_player) {
+        m_player-&gt;invalidate();
+        m_player = nullptr;
+    }
</ins><span class="cx">     updatePlaybackControlsManager();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -5049,7 +5052,10 @@
</span><span class="cx">         document().removeMediaCanStartListener(this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_player = nullptr;
</del><ins>+    if (m_player) {
+        m_player-&gt;invalidate();
+        m_player = nullptr;
+    }
</ins><span class="cx">     updatePlaybackControlsManager();
</span><span class="cx"> 
</span><span class="cx">     stopPeriodicTimers();
</span><span class="lines">@@ -5990,7 +5996,7 @@
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx">     forgetResourceSpecificTracks();
</span><span class="cx"> #endif
</span><del>-    m_player = std::make_unique&lt;MediaPlayer&gt;(static_cast&lt;MediaPlayerClient&amp;&gt;(*this));
</del><ins>+    m_player = MediaPlayer::create(*this);
</ins><span class="cx">     scheduleUpdatePlaybackControlsManager();
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_AUDIO)
</span></span></pre></div>
<a id="branchessafari603branchSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.h (210711 => 210712)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.h        2017-01-13 06:10:34 UTC (rev 210711)
+++ branches/safari-603-branch/Source/WebCore/html/HTMLMediaElement.h        2017-01-13 06:10:37 UTC (rev 210712)
</span><span class="lines">@@ -888,7 +888,7 @@
</span><span class="cx">     MediaPlayerEnums::VideoGravity m_videoFullscreenGravity { MediaPlayer::VideoGravityResizeAspect };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;MediaPlayer&gt; m_player;
</del><ins>+    RefPtr&lt;MediaPlayer&gt; m_player;
</ins><span class="cx"> 
</span><span class="cx">     MediaPlayerEnums::Preload m_preload { MediaPlayer::Auto };
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchessafari603branchSourceWebCoreplatformgraphicsMediaPlayercpp"></a>
<div class="modfile"><h4>Modified: branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.cpp (210711 => 210712)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.cpp        2017-01-13 06:10:34 UTC (rev 210711)
+++ branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.cpp        2017-01-13 06:10:37 UTC (rev 210712)
</span><span class="lines">@@ -161,6 +161,12 @@
</span><span class="cx">     bool hasSingleSecurityOrigin() const override { return true; }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+static MediaPlayerClient&amp; nullMediaPlayerClient()
+{
+    static NeverDestroyed&lt;MediaPlayerClient&gt; client;
+    return client.get();
+}
+
</ins><span class="cx"> // engine support
</span><span class="cx"> 
</span><span class="cx"> struct MediaPlayerFactory {
</span><span class="lines">@@ -332,8 +338,13 @@
</span><span class="cx"> 
</span><span class="cx"> // media player
</span><span class="cx"> 
</span><ins>+Ref&lt;MediaPlayer&gt; MediaPlayer::create(MediaPlayerClient&amp; client)
+{
+    return adoptRef(*new MediaPlayer(client));
+}
+
</ins><span class="cx"> MediaPlayer::MediaPlayer(MediaPlayerClient&amp; client)
</span><del>-    : m_client(client)
</del><ins>+    : m_client(&amp;client)
</ins><span class="cx">     , m_reloadTimer(*this, &amp;MediaPlayer::reloadTimerFired)
</span><span class="cx">     , m_private(std::make_unique&lt;NullMediaPlayerPrivate&gt;(this))
</span><span class="cx">     , m_currentMediaEngine(0)
</span><span class="lines">@@ -353,10 +364,18 @@
</span><span class="cx">     ASSERT(!m_initializingMediaEngine);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaPlayer::invalidate()
+{
+    m_client = &amp;nullMediaPlayerClient();
+}
+
</ins><span class="cx"> bool MediaPlayer::load(const URL&amp; url, const ContentType&amp; contentType, const String&amp; keySystem)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_reloadTimer.isActive());
</span><span class="cx"> 
</span><ins>+    // Protect against MediaPlayer being destroyed during a MediaPlayerClient callback.
+    Ref&lt;MediaPlayer&gt; protectedThis(*this);
+
</ins><span class="cx">     m_contentMIMEType = contentType.type().convertToASCIILowercase();
</span><span class="cx">     m_contentTypeCodecs = contentType.parameter(codecs());
</span><span class="cx">     m_url = url;
</span><span class="lines">@@ -474,7 +493,7 @@
</span><span class="cx">     } else if (m_currentMediaEngine != engine) {
</span><span class="cx">         m_currentMediaEngine = engine;
</span><span class="cx">         m_private = engine-&gt;constructor(this);
</span><del>-        m_client.mediaPlayerEngineUpdated(this);
</del><ins>+        client().mediaPlayerEngineUpdated(this);
</ins><span class="cx">         m_private-&gt;setPrivateBrowsingMode(m_privateBrowsing);
</span><span class="cx">         m_private-&gt;setPreload(m_preload);
</span><span class="cx">         m_private-&gt;setPreservesPitch(preservesPitch());
</span><span class="lines">@@ -496,8 +515,8 @@
</span><span class="cx">         m_private-&gt;load(m_url.string());
</span><span class="cx">     } else {
</span><span class="cx">         m_private = std::make_unique&lt;NullMediaPlayerPrivate&gt;(this);
</span><del>-        m_client.mediaPlayerEngineUpdated(this);
-        m_client.mediaPlayerResourceNotSupported(this);
</del><ins>+        client().mediaPlayerEngineUpdated(this);
+        client().mediaPlayerResourceNotSupported(this);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_initializingMediaEngine = false;
</span><span class="lines">@@ -648,7 +667,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::inMediaDocument() const
</span><span class="cx"> {
</span><del>-    return m_visible &amp;&amp; m_client.mediaPlayerIsInMediaDocument();
</del><ins>+    return m_visible &amp;&amp; client().mediaPlayerIsInMediaDocument();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PlatformMedia MediaPlayer::platformMedia() const
</span><span class="lines">@@ -684,7 +703,7 @@
</span><span class="cx"> 
</span><span class="cx"> MediaPlayer::VideoFullscreenMode MediaPlayer::fullscreenMode() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerFullscreenMode();
</del><ins>+    return client().mediaPlayerFullscreenMode();
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -765,7 +784,7 @@
</span><span class="cx"> 
</span><span class="cx"> double MediaPlayer::requestedRate() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerRequestedPlaybackRate();
</del><ins>+    return client().mediaPlayerRequestedPlaybackRate();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::preservesPitch() const
</span><span class="lines">@@ -937,7 +956,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::currentPlaybackTargetIsWirelessChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerCurrentPlaybackTargetIsWirelessChanged(this);
</del><ins>+    client().mediaPlayerCurrentPlaybackTargetIsWirelessChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::canPlayToWirelessPlaybackTarget() const
</span><span class="lines">@@ -1101,18 +1120,18 @@
</span><span class="cx">     // If more than one media engine is installed and this one failed before finding metadata,
</span><span class="cx">     // let the next engine try.
</span><span class="cx">     if (m_private-&gt;networkState() &gt;= FormatError &amp;&amp; m_private-&gt;readyState() &lt; HaveMetadata) {
</span><del>-        m_client.mediaPlayerEngineFailedToLoad();
</del><ins>+        client().mediaPlayerEngineFailedToLoad();
</ins><span class="cx">         if (installedMediaEngines().size() &gt; 1 &amp;&amp; (m_contentMIMEType.isEmpty() || nextBestMediaEngine(m_currentMediaEngine))) {
</span><span class="cx">             m_reloadTimer.startOneShot(0);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    m_client.mediaPlayerNetworkStateChanged(this);
</del><ins>+    client().mediaPlayerNetworkStateChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::readyStateChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerReadyStateChanged(this);
</del><ins>+    client().mediaPlayerReadyStateChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::volumeChanged(double newVolume)
</span><span class="lines">@@ -1123,53 +1142,53 @@
</span><span class="cx"> #else
</span><span class="cx">     m_volume = newVolume;
</span><span class="cx"> #endif
</span><del>-    m_client.mediaPlayerVolumeChanged(this);
</del><ins>+    client().mediaPlayerVolumeChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::muteChanged(bool newMuted)
</span><span class="cx"> {
</span><span class="cx">     m_muted = newMuted;
</span><del>-    m_client.mediaPlayerMuteChanged(this);
</del><ins>+    client().mediaPlayerMuteChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::timeChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerTimeChanged(this);
</del><ins>+    client().mediaPlayerTimeChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::sizeChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerSizeChanged(this);
</del><ins>+    client().mediaPlayerSizeChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::repaint()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerRepaint(this);
</del><ins>+    client().mediaPlayerRepaint(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::durationChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDurationChanged(this);
</del><ins>+    client().mediaPlayerDurationChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::rateChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerRateChanged(this);
</del><ins>+    client().mediaPlayerRateChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::playbackStateChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerPlaybackStateChanged(this);
</del><ins>+    client().mediaPlayerPlaybackStateChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::firstVideoFrameAvailable()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerFirstVideoFrameAvailable(this);
</del><ins>+    client().mediaPlayerFirstVideoFrameAvailable(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::characteristicChanged()
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerCharacteristicChanged(this);
</del><ins>+    client().mediaPlayerCharacteristicChanged(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_AUDIO)
</span><span class="lines">@@ -1182,28 +1201,28 @@
</span><span class="cx"> #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
</span><span class="cx"> RefPtr&lt;ArrayBuffer&gt; MediaPlayer::cachedKeyForKeyId(const String&amp; keyId) const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerCachedKeyForKeyId(keyId);
</del><ins>+    return client().mediaPlayerCachedKeyForKeyId(keyId);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::keyNeeded(Uint8Array* initData)
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerKeyNeeded(this, initData);
</del><ins>+    return client().mediaPlayerKeyNeeded(this, initData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String MediaPlayer::mediaKeysStorageDirectory() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerMediaKeysStorageDirectory();
</del><ins>+    return client().mediaPlayerMediaKeysStorageDirectory();
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> String MediaPlayer::referrer() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerReferrer();
</del><ins>+    return client().mediaPlayerReferrer();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String MediaPlayer::userAgent() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerUserAgent();
</del><ins>+    return client().mediaPlayerUserAgent();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String MediaPlayer::engineDescription() const
</span><span class="lines">@@ -1225,18 +1244,18 @@
</span><span class="cx"> #if PLATFORM(WIN) &amp;&amp; USE(AVFOUNDATION)
</span><span class="cx"> GraphicsDeviceAdapter* MediaPlayer::graphicsDeviceAdapter() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerGraphicsDeviceAdapter(this);
</del><ins>+    return client().mediaPlayerGraphicsDeviceAdapter(this);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> CachedResourceLoader* MediaPlayer::cachedResourceLoader()
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerCachedResourceLoader();
</del><ins>+    return client().mediaPlayerCachedResourceLoader();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;PlatformMediaResourceLoader&gt; MediaPlayer::createResourceLoader()
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerCreateResourceLoader();
</del><ins>+    return client().mediaPlayerCreateResourceLoader();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="lines">@@ -1243,32 +1262,32 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::addAudioTrack(AudioTrackPrivate&amp; track)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDidAddAudioTrack(track);
</del><ins>+    client().mediaPlayerDidAddAudioTrack(track);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::removeAudioTrack(AudioTrackPrivate&amp; track)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDidRemoveAudioTrack(track);
</del><ins>+    client().mediaPlayerDidRemoveAudioTrack(track);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::addTextTrack(InbandTextTrackPrivate&amp; track)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDidAddTextTrack(track);
</del><ins>+    client().mediaPlayerDidAddTextTrack(track);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::removeTextTrack(InbandTextTrackPrivate&amp; track)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDidRemoveTextTrack(track);
</del><ins>+    client().mediaPlayerDidRemoveTextTrack(track);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::addVideoTrack(VideoTrackPrivate&amp; track)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDidAddVideoTrack(track);
</del><ins>+    client().mediaPlayerDidAddVideoTrack(track);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::removeVideoTrack(VideoTrackPrivate&amp; track)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerDidRemoveVideoTrack(track);
</del><ins>+    client().mediaPlayerDidRemoveVideoTrack(track);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::requiresTextTrackRepresentation() const
</span><span class="lines">@@ -1301,7 +1320,7 @@
</span><span class="cx"> 
</span><span class="cx"> Vector&lt;RefPtr&lt;PlatformTextTrack&gt;&gt; MediaPlayer::outOfBandTrackSources()
</span><span class="cx"> {
</span><del>-    return m_client.outOfBandTrackSources();
</del><ins>+    return client().outOfBandTrackSources();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="lines">@@ -1391,22 +1410,22 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::shouldWaitForResponseToAuthenticationChallenge(const AuthenticationChallenge&amp; challenge)
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerShouldWaitForResponseToAuthenticationChallenge(challenge);
</del><ins>+    return client().mediaPlayerShouldWaitForResponseToAuthenticationChallenge(challenge);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::handlePlaybackCommand(PlatformMediaSession::RemoteControlCommandType command)
</span><span class="cx"> {
</span><del>-    m_client.mediaPlayerHandlePlaybackCommand(command);
</del><ins>+    client().mediaPlayerHandlePlaybackCommand(command);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String MediaPlayer::sourceApplicationIdentifier() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerSourceApplicationIdentifier();
</del><ins>+    return client().mediaPlayerSourceApplicationIdentifier();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Vector&lt;String&gt; MediaPlayer::preferredAudioCharacteristics() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerPreferredAudioCharacteristics();
</del><ins>+    return client().mediaPlayerPreferredAudioCharacteristics();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerFactorySupport::callRegisterMediaEngine(MediaEngineRegister registerMediaEngine)
</span><span class="lines">@@ -1416,18 +1435,18 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::doesHaveAttribute(const AtomicString&amp; attribute, AtomicString* value) const
</span><span class="cx"> {
</span><del>-    return m_client.doesHaveAttribute(attribute, value);
</del><ins>+    return client().doesHaveAttribute(attribute, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> String MediaPlayer::mediaPlayerNetworkInterfaceName() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerNetworkInterfaceName();
</del><ins>+    return client().mediaPlayerNetworkInterfaceName();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::getRawCookies(const URL&amp; url, Vector&lt;Cookie&gt;&amp; cookies) const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerGetRawCookies(url, cookies);
</del><ins>+    return client().mediaPlayerGetRawCookies(url, cookies);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -1439,7 +1458,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool MediaPlayer::shouldDisableSleep() const
</span><span class="cx"> {
</span><del>-    return m_client.mediaPlayerShouldDisableSleep();
</del><ins>+    return client().mediaPlayerShouldDisableSleep();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari603branchSourceWebCoreplatformgraphicsMediaPlayerh"></a>
<div class="modfile"><h4>Modified: branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.h (210711 => 210712)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.h        2017-01-13 06:10:34 UTC (rev 210711)
+++ branches/safari-603-branch/Source/WebCore/platform/graphics/MediaPlayer.h        2017-01-13 06:10:37 UTC (rev 210712)
</span><span class="lines">@@ -48,6 +48,8 @@
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/MediaTime.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><ins>+#include &lt;wtf/Ref.h&gt;
+#include &lt;wtf/RefCounted.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/StringHash.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(AVF_CAPTIONS)
</span><span class="lines">@@ -281,12 +283,14 @@
</span><span class="cx">     virtual String mediaPlayerDocumentHost() const { return String(); }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class MediaPlayer : public MediaPlayerEnums {
</del><ins>+class MediaPlayer : public MediaPlayerEnums, public RefCounted&lt;MediaPlayer&gt; {
</ins><span class="cx">     WTF_MAKE_NONCOPYABLE(MediaPlayer); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    explicit MediaPlayer(MediaPlayerClient&amp;);
</del><ins>+    static Ref&lt;MediaPlayer&gt; create(MediaPlayerClient&amp;);
</ins><span class="cx">     virtual ~MediaPlayer();
</span><span class="cx"> 
</span><ins>+    void invalidate();
+
</ins><span class="cx">     // Media engine support.
</span><span class="cx">     enum SupportsType { IsNotSupported, IsSupported, MayBeSupported };
</span><span class="cx">     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&amp;, const MediaPlayerSupportsTypeClient*);
</span><span class="lines">@@ -386,7 +390,7 @@
</span><span class="cx"> 
</span><span class="cx">     double volume() const;
</span><span class="cx">     void setVolume(double);
</span><del>-    bool platformVolumeConfigurationRequired() const { return m_client.mediaPlayerPlatformVolumeConfigurationRequired(); }
</del><ins>+    bool platformVolumeConfigurationRequired() const { return client().mediaPlayerPlatformVolumeConfigurationRequired(); }
</ins><span class="cx"> 
</span><span class="cx">     bool muted() const;
</span><span class="cx">     void setMuted(bool);
</span><span class="lines">@@ -444,7 +448,7 @@
</span><span class="cx"> 
</span><span class="cx">     void repaint();
</span><span class="cx"> 
</span><del>-    MediaPlayerClient&amp; client() const { return m_client; }
</del><ins>+    MediaPlayerClient&amp; client() const { return *m_client; }
</ins><span class="cx"> 
</span><span class="cx">     bool hasAvailableVideoFrame() const;
</span><span class="cx">     void prepareForRendering();
</span><span class="lines">@@ -582,6 +586,8 @@
</span><span class="cx">     bool shouldDisableSleep() const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    MediaPlayer(MediaPlayerClient&amp;);
+
</ins><span class="cx">     const MediaPlayerFactory* nextBestMediaEngine(const MediaPlayerFactory*) const;
</span><span class="cx">     void loadWithNextMediaEngine(const MediaPlayerFactory*);
</span><span class="cx">     void reloadTimerFired();
</span><span class="lines">@@ -588,7 +594,7 @@
</span><span class="cx"> 
</span><span class="cx">     static void initializeMediaEngines();
</span><span class="cx"> 
</span><del>-    MediaPlayerClient&amp; m_client;
</del><ins>+    MediaPlayerClient* m_client;
</ins><span class="cx">     Timer m_reloadTimer;
</span><span class="cx">     std::unique_ptr&lt;MediaPlayerPrivateInterface&gt; m_private;
</span><span class="cx">     const MediaPlayerFactory* m_currentMediaEngine;
</span></span></pre>
</div>
</div>

</body>
</html>