<!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>[178281] trunk</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/178281">178281</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2015-01-12 10:15:07 -0800 (Mon, 12 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>defaultPlaybackRate not respected when set before source is loaded
https://bugs.webkit.org/show_bug.cgi?id=140282

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/video-defaultplaybackrate-before-load.html

When the HTMLMediaElement is notified that the media player's rate has changed, it asks
for the rate from MediaPlayer. However, MediaPlayer never requests the playback rate
from the underlying MediaPlayerPrivate; it just returns the last rate which was set, or
1 if no rate was set. HTMLMediaElement then sets its playbackRate to the returned
value. So the end result is that the value from defaultPlaybackRate is overwritten by
the default value of 1 in MediaPlayer.

Rather than caching the requested rate in MediaPlayer, cache the value reported by
MediaPlayer inside HTMLMediaElement. And instead of returning the reported playback
rate from HTMLMediaElement.playbackRate, just return the last value set. The reported
value is still used for estimating the current time during playback.

Add MediaPlayerPrivate interface method to return the current playback rate.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::HTMLMediaElement): Initialize m_reportedPlaybackRate.
(WebCore::HTMLMediaElement::effectivePlaybackRate): Return m_reportedPlaybackRate.
(WebCore::HTMLMediaElement::requestedPlaybackRate): Return m_playbackRate.
(WebCore::HTMLMediaElement::updatePlaybackRate): Use requestedPlaybackRate() instead
    of effectivePlaybackRate();
(WebCore::HTMLMediaElement::ended): Ditto.
(WebCore::HTMLMediaElement::playbackProgressTimerFired): Ditto.
(WebCore::HTMLMediaElement::endedPlayback): Ditto.
(WebCore::HTMLMediaElement::updatePlayState): Ditto.
(WebCore::HTMLMediaElement::mediaPlayerRateChanged): Set m_reportedPlaybackRate.
(WebCore::HTMLMediaElement::mediaPlayerRequestedPlaybackRate): Return
    requestedPlaybackRate() if playing and 0 if not.
* html/HTMLMediaElement.h:
* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::MediaPlayer): Removed m_rate.
(WebCore::MediaPlayer::rate): Pass to MediaPlayerPrivate.
(WebCore::MediaPlayer::setRate): Do not cache the rate.
(WebCore::MediaPlayer::requestedRate): Added; ask HTMLMediaElement.
* platform/graphics/MediaPlayer.h:
(WebCore::MediaPlayerClient::mediaPlayerRequestedPlaybackRate): Added.
* platform/graphics/MediaPlayerPrivate.h:
(WebCore::MediaPlayerPrivateInterface::rate): Added.
* platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
(WebCore::MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation):
    Do not cache the requested rate.
(WebCore::MediaPlayerPrivateAVFoundation::requestedRate): Pass to MediaPlayer.
(WebCore::MediaPlayerPrivateAVFoundation::setRate): Deleted.
* platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
(WebCore::MediaPlayerPrivateAVFoundation::requestedRate): Deleted.
* platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
(WebCore::MediaPlayerPrivateAVFoundationCF::setRate): Renamed from updateRate.
(WebCore::MediaPlayerPrivateAVFoundationCF::rate): Fetch the rate from the player.
* platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::setRateDouble): Renamed from updateRate.
(WebCore::MediaPlayerPrivateAVFoundationObjC::rate): Fetch the rate from the player.
* platform/graphics/mac/MediaPlayerPrivateQTKit.h:
* platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
(WebCore::MediaPlayerPrivateQTKit::rate): Fetch the rate from the QTMovie.

LayoutTests:

* media/video-defaultplaybackrate-before-load-expected.txt: Added.
* media/video-defaultplaybackrate-before-load.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlayercpp">trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlayerh">trunk/Source/WebCore/platform/graphics/MediaPlayer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlayerPrivateh">trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp">trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationh">trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFh">trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKith">trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKitmm">trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmediavideodefaultplaybackratebeforeloadexpectedtxt">trunk/LayoutTests/media/video-defaultplaybackrate-before-load-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediavideodefaultplaybackratebeforeloadhtml">trunk/LayoutTests/media/video-defaultplaybackrate-before-load.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/LayoutTests/ChangeLog        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2015-01-12  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        defaultPlaybackRate not respected when set before source is loaded
+        https://bugs.webkit.org/show_bug.cgi?id=140282
+
+        Reviewed by Eric Carlson.
+
+        * media/video-defaultplaybackrate-before-load-expected.txt: Added.
+        * media/video-defaultplaybackrate-before-load.html: Added.
+
</ins><span class="cx"> 2015-01-12  Andrzej Badowski  &lt;a.badowski@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: [ATK] Whether to show the title attribute, if there is a label with the attribute for?
</span></span></pre></div>
<a id="trunkLayoutTestsmediavideodefaultplaybackratebeforeloadexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/video-defaultplaybackrate-before-load-expected.txt (0 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/video-defaultplaybackrate-before-load-expected.txt                                (rev 0)
+++ trunk/LayoutTests/media/video-defaultplaybackrate-before-load-expected.txt        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+
+RUN(video.defaultPlaybackRate = 0.5)
+EVENT(canplaythrough)
+EXPECTED (video.playbackRate == '0.5') OK
+EXPECTED (video.defaultPlaybackRate == '0.5') OK
+EVENT(timeupdate)
+EVENT(timeupdate)
+EXPECTED (effectivePlaybackRate &lt; '0.75') OK
+END OF TEST
+
</ins></span></pre></div>
<a id="trunkLayoutTestsmediavideodefaultplaybackratebeforeloadhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/video-defaultplaybackrate-before-load.html (0 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/video-defaultplaybackrate-before-load.html                                (rev 0)
+++ trunk/LayoutTests/media/video-defaultplaybackrate-before-load.html        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+    &lt;head&gt;
+        &lt;title&gt;test playbackRate and defaultPlaybackRate&lt;/title&gt;
+        &lt;script src=media-file.js&gt;&lt;/script&gt;
+        &lt;script src=video-test.js&gt;&lt;/script&gt;
+        &lt;script&gt;
+            var wallClockAtFirstTimeUpdate;
+            var mediaTimeAtFirstTimeUpdate;
+            var effectivePlaybackRate;
+
+            function start()
+            {
+                findMediaElement();
+                waitForEvent('canplaythrough', canplaythrough);
+                run('video.defaultPlaybackRate = 0.5');
+                setSrcByTagName('video', findMediaFile('video', 'content/test'));
+            }
+
+            function canplaythrough()
+            {
+                testExpected('video.playbackRate', 0.5);
+                testExpected('video.defaultPlaybackRate', 0.5);
+
+                waitForEvent('timeupdate', timeupdate);
+                video.play();
+            }
+
+            function timeupdate()
+            {
+                var now = Date.now() / 1000;
+                if (!wallClockAtFirstTimeUpdate) {
+                    wallClockAtFirstTimeUpdate = now;
+                    mediaTimeAtFirstTimeUpdate = video.currentTime;
+                    return;
+                }
+
+                if (wallClockAtFirstTimeUpdate == now)
+                    return;
+
+                var wallClockDelta = wallClockAtFirstTimeUpdate - now;
+                var mediaTimeDelta = mediaTimeAtFirstTimeUpdate - video.currentTime;
+                effectivePlaybackRate = mediaTimeDelta / wallClockDelta;
+
+                testExpected('effectivePlaybackRate', .75, '&lt;');
+                endTest();
+            }
+
+        &lt;/script&gt;
+    &lt;/head&gt;
+
+    &lt;body onload=&quot;start()&quot;&gt;
+        &lt;video controls&gt;&lt;/video&gt;
+    &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/ChangeLog        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -1,3 +1,68 @@
</span><ins>+2015-01-12  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        defaultPlaybackRate not respected when set before source is loaded
+        https://bugs.webkit.org/show_bug.cgi?id=140282
+
+        Reviewed by Eric Carlson.
+
+        Test: media/video-defaultplaybackrate-before-load.html
+
+        When the HTMLMediaElement is notified that the media player's rate has changed, it asks
+        for the rate from MediaPlayer. However, MediaPlayer never requests the playback rate
+        from the underlying MediaPlayerPrivate; it just returns the last rate which was set, or
+        1 if no rate was set. HTMLMediaElement then sets its playbackRate to the returned
+        value. So the end result is that the value from defaultPlaybackRate is overwritten by
+        the default value of 1 in MediaPlayer.
+
+        Rather than caching the requested rate in MediaPlayer, cache the value reported by
+        MediaPlayer inside HTMLMediaElement. And instead of returning the reported playback
+        rate from HTMLMediaElement.playbackRate, just return the last value set. The reported
+        value is still used for estimating the current time during playback.
+
+        Add MediaPlayerPrivate interface method to return the current playback rate.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::HTMLMediaElement): Initialize m_reportedPlaybackRate.
+        (WebCore::HTMLMediaElement::effectivePlaybackRate): Return m_reportedPlaybackRate.
+        (WebCore::HTMLMediaElement::requestedPlaybackRate): Return m_playbackRate.
+        (WebCore::HTMLMediaElement::updatePlaybackRate): Use requestedPlaybackRate() instead
+            of effectivePlaybackRate();
+        (WebCore::HTMLMediaElement::ended): Ditto.
+        (WebCore::HTMLMediaElement::playbackProgressTimerFired): Ditto.
+        (WebCore::HTMLMediaElement::endedPlayback): Ditto.
+        (WebCore::HTMLMediaElement::updatePlayState): Ditto.
+        (WebCore::HTMLMediaElement::mediaPlayerRateChanged): Set m_reportedPlaybackRate.
+        (WebCore::HTMLMediaElement::mediaPlayerRequestedPlaybackRate): Return
+            requestedPlaybackRate() if playing and 0 if not.
+        * html/HTMLMediaElement.h:
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::MediaPlayer::MediaPlayer): Removed m_rate.
+        (WebCore::MediaPlayer::rate): Pass to MediaPlayerPrivate.
+        (WebCore::MediaPlayer::setRate): Do not cache the rate.
+        (WebCore::MediaPlayer::requestedRate): Added; ask HTMLMediaElement.
+        * platform/graphics/MediaPlayer.h:
+        (WebCore::MediaPlayerClient::mediaPlayerRequestedPlaybackRate): Added.
+        * platform/graphics/MediaPlayerPrivate.h:
+        (WebCore::MediaPlayerPrivateInterface::rate): Added.
+        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
+        (WebCore::MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation):
+            Do not cache the requested rate.
+        (WebCore::MediaPlayerPrivateAVFoundation::requestedRate): Pass to MediaPlayer.
+        (WebCore::MediaPlayerPrivateAVFoundation::setRate): Deleted.
+        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
+        (WebCore::MediaPlayerPrivateAVFoundation::requestedRate): Deleted.
+        * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
+        (WebCore::MediaPlayerPrivateAVFoundationCF::setRate): Renamed from updateRate.
+        (WebCore::MediaPlayerPrivateAVFoundationCF::rate): Fetch the rate from the player.
+        * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::setRateDouble): Renamed from updateRate.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::rate): Fetch the rate from the player.
+        * platform/graphics/mac/MediaPlayerPrivateQTKit.h:
+        * platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
+        (WebCore::MediaPlayerPrivateQTKit::rate): Fetch the rate from the QTMovie.
+
</ins><span class="cx"> 2015-01-11  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Merge DatabaseBase into Database
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -262,8 +262,9 @@
</span><span class="cx">     , m_seekTimer(*this, &amp;HTMLMediaElement::seekTimerFired)
</span><span class="cx">     , m_playedTimeRanges()
</span><span class="cx">     , m_asyncEventQueue(*this)
</span><del>-    , m_playbackRate(1.0f)
-    , m_defaultPlaybackRate(1.0f)
</del><ins>+    , m_requestedPlaybackRate(1)
+    , m_reportedPlaybackRate(1)
+    , m_defaultPlaybackRate(1)
</ins><span class="cx">     , m_webkitPreservesPitch(true)
</span><span class="cx">     , m_networkState(NETWORK_EMPTY)
</span><span class="cx">     , m_readyState(HAVE_NOTHING)
</span><span class="lines">@@ -2653,12 +2654,17 @@
</span><span class="cx"> 
</span><span class="cx"> double HTMLMediaElement::effectivePlaybackRate() const
</span><span class="cx"> {
</span><del>-    return m_mediaController ? m_mediaController-&gt;playbackRate() : m_playbackRate;
</del><ins>+    return m_mediaController ? m_mediaController-&gt;playbackRate() : m_reportedPlaybackRate;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+double HTMLMediaElement::requestedPlaybackRate() const
+{
+    return m_mediaController ? m_mediaController-&gt;playbackRate() : m_requestedPlaybackRate;
+}
+
</ins><span class="cx"> double HTMLMediaElement::playbackRate() const
</span><span class="cx"> {
</span><del>-    return m_playbackRate;
</del><ins>+    return m_requestedPlaybackRate;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaElement::setPlaybackRate(double rate)
</span><span class="lines">@@ -2668,8 +2674,8 @@
</span><span class="cx">     if (m_player &amp;&amp; potentiallyPlaying() &amp;&amp; m_player-&gt;rate() != rate &amp;&amp; !m_mediaController)
</span><span class="cx">         m_player-&gt;setRate(rate);
</span><span class="cx"> 
</span><del>-    if (m_playbackRate != rate) {
-        m_playbackRate = rate;
</del><ins>+    if (m_requestedPlaybackRate != rate) {
+        m_reportedPlaybackRate = m_requestedPlaybackRate = rate;
</ins><span class="cx">         invalidateCachedTime();
</span><span class="cx">         scheduleEvent(eventNames().ratechangeEvent);
</span><span class="cx">     }
</span><span class="lines">@@ -2677,9 +2683,9 @@
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaElement::updatePlaybackRate()
</span><span class="cx"> {
</span><del>-    double effectiveRate = effectivePlaybackRate();
-    if (m_player &amp;&amp; potentiallyPlaying() &amp;&amp; m_player-&gt;rate() != effectiveRate)
-        m_player-&gt;setRate(effectiveRate);
</del><ins>+    double requestedRate = requestedPlaybackRate();
+    if (m_player &amp;&amp; potentiallyPlaying() &amp;&amp; m_player-&gt;rate() != requestedRate)
+        m_player-&gt;setRate(requestedRate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool HTMLMediaElement::webkitPreservesPitch() const
</span><span class="lines">@@ -2704,7 +2710,7 @@
</span><span class="cx">     // 4.8.10.8 Playing the media resource
</span><span class="cx">     // The ended attribute must return true if the media element has ended 
</span><span class="cx">     // playback and the direction of playback is forwards, and false otherwise.
</span><del>-    return endedPlayback() &amp;&amp; effectivePlaybackRate() &gt; 0;
</del><ins>+    return endedPlayback() &amp;&amp; requestedPlaybackRate() &gt; 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool HTMLMediaElement::autoplay() const
</span><span class="lines">@@ -3141,7 +3147,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_player);
</span><span class="cx"> 
</span><del>-    if (m_fragmentEndTime.isValid() &amp;&amp; currentMediaTime() &gt;= m_fragmentEndTime &amp;&amp; effectivePlaybackRate() &gt; 0) {
</del><ins>+    if (m_fragmentEndTime.isValid() &amp;&amp; currentMediaTime() &gt;= m_fragmentEndTime &amp;&amp; requestedPlaybackRate() &gt; 0) {
</ins><span class="cx">         m_fragmentEndTime = MediaTime::invalidTime();
</span><span class="cx">         if (!m_mediaController &amp;&amp; !m_paused) {
</span><span class="cx">             // changes paused to true and fires a simple event named pause at the media element.
</span><span class="lines">@@ -4195,13 +4201,14 @@
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaElement::mediaPlayerRateChanged(MediaPlayer*)
</span><span class="cx"> {
</span><del>-    LOG(Media, &quot;HTMLMediaElement::mediaPlayerRateChanged(%p)&quot;, this);
-
</del><span class="cx">     beginProcessingMediaPlayerCallback();
</span><span class="cx"> 
</span><span class="cx">     // Stash the rate in case the one we tried to set isn't what the engine is
</span><span class="cx">     // using (eg. it can't handle the rate we set)
</span><del>-    m_playbackRate = m_player-&gt;rate();
</del><ins>+    m_reportedPlaybackRate = m_player-&gt;rate();
+
+    LOG(Media, &quot;HTMLMediaElement::mediaPlayerRateChanged(%p) - rate: %lf&quot;, this, m_reportedPlaybackRate);
+
</ins><span class="cx">     if (m_playing)
</span><span class="cx">         invalidateCachedTime();
</span><span class="cx"> 
</span><span class="lines">@@ -4433,12 +4440,12 @@
</span><span class="cx">     // of playback is forwards, Either the media element does not have a loop attribute specified,
</span><span class="cx">     // or the media element has a current media controller.
</span><span class="cx">     MediaTime now = currentMediaTime();
</span><del>-    if (effectivePlaybackRate() &gt; 0)
</del><ins>+    if (requestedPlaybackRate() &gt; 0)
</ins><span class="cx">         return dur &gt; MediaTime::zeroTime() &amp;&amp; now &gt;= dur &amp;&amp; (!loop() || m_mediaController);
</span><span class="cx"> 
</span><span class="cx">     // or the current playback position is the earliest possible position and the direction 
</span><span class="cx">     // of playback is backwards
</span><del>-    if (effectivePlaybackRate() &lt; 0)
</del><ins>+    if (requestedPlaybackRate() &lt; 0)
</ins><span class="cx">         return now &lt;= MediaTime::zeroTime();
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="lines">@@ -4539,7 +4546,7 @@
</span><span class="cx"> 
</span><span class="cx">             // Set rate, muted before calling play in case they were set before the media engine was setup.
</span><span class="cx">             // The media engine should just stash the rate and muted values since it isn't already playing.
</span><del>-            m_player-&gt;setRate(effectivePlaybackRate());
</del><ins>+            m_player-&gt;setRate(requestedPlaybackRate());
</ins><span class="cx">             m_player-&gt;setMuted(effectiveMuted());
</span><span class="cx"> 
</span><span class="cx">             if (m_firstTimePlaying) {
</span><span class="lines">@@ -5790,6 +5797,11 @@
</span><span class="cx">     diagnosticLoggingClient-&gt;logDiagnosticMessageWithValue(DiagnosticLoggingKeys::engineFailedToLoadKey(), engine, String::number(m_player-&gt;platformErrorCode()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+double HTMLMediaElement::mediaPlayerRequestedPlaybackRate() const
+{
+    return potentiallyPlaying() ? requestedPlaybackRate() : 0;
+}
+
</ins><span class="cx"> void HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture()
</span><span class="cx"> {
</span><span class="cx">     m_mediaSession-&gt;removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureForLoad);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -532,6 +532,7 @@
</span><span class="cx">     void setNetworkState(MediaPlayer::NetworkState);
</span><span class="cx"> 
</span><span class="cx">     double effectivePlaybackRate() const;
</span><ins>+    double requestedPlaybackRate() const;
</ins><span class="cx"> 
</span><span class="cx">     virtual void mediaPlayerNetworkStateChanged(MediaPlayer*) override;
</span><span class="cx">     virtual void mediaPlayerReadyStateChanged(MediaPlayer*) override;
</span><span class="lines">@@ -606,6 +607,8 @@
</span><span class="cx">     virtual bool mediaPlayerIsInMediaDocument() const override final;
</span><span class="cx">     virtual void mediaPlayerEngineFailedToLoad() const override final;
</span><span class="cx"> 
</span><ins>+    virtual double mediaPlayerRequestedPlaybackRate() const override final;
+
</ins><span class="cx">     void loadTimerFired();
</span><span class="cx">     void progressEventTimerFired();
</span><span class="cx">     void playbackProgressTimerFired();
</span><span class="lines">@@ -745,7 +748,8 @@
</span><span class="cx">     RefPtr&lt;TimeRanges&gt; m_playedTimeRanges;
</span><span class="cx">     GenericEventQueue m_asyncEventQueue;
</span><span class="cx"> 
</span><del>-    double m_playbackRate;
</del><ins>+    double m_requestedPlaybackRate;
+    double m_reportedPlaybackRate;
</ins><span class="cx">     double m_defaultPlaybackRate;
</span><span class="cx">     bool m_webkitPreservesPitch;
</span><span class="cx">     NetworkState m_networkState;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -312,7 +312,6 @@
</span><span class="cx">     , m_currentMediaEngine(0)
</span><span class="cx">     , m_preload(Auto)
</span><span class="cx">     , m_visible(false)
</span><del>-    , m_rate(1.0f)
</del><span class="cx">     , m_volume(1.0f)
</span><span class="cx">     , m_muted(false)
</span><span class="cx">     , m_preservesPitch(true)
</span><span class="lines">@@ -679,15 +678,19 @@
</span><span class="cx"> 
</span><span class="cx"> double MediaPlayer::rate() const
</span><span class="cx"> {
</span><del>-    return m_rate;
</del><ins>+    return m_private-&gt;rate();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayer::setRate(double rate)
</span><span class="cx"> {
</span><del>-    m_rate = rate;
</del><span class="cx">     m_private-&gt;setRateDouble(rate);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+double MediaPlayer::requestedRate() const
+{
+    return m_client.mediaPlayerRequestedPlaybackRate();
+}
+
</ins><span class="cx"> bool MediaPlayer::preservesPitch() const
</span><span class="cx"> {
</span><span class="cx">     return m_preservesPitch;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -262,6 +262,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool mediaPlayerIsInMediaDocument() const { return false; }
</span><span class="cx">     virtual void mediaPlayerEngineFailedToLoad() const { }
</span><ins>+
+    virtual double mediaPlayerRequestedPlaybackRate() const { return 0; }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class MediaPlayerSupportsTypeClient {
</span><span class="lines">@@ -364,6 +366,7 @@
</span><span class="cx"> 
</span><span class="cx">     double rate() const;
</span><span class="cx">     void setRate(double);
</span><ins>+    double requestedRate() const;
</ins><span class="cx"> 
</span><span class="cx">     bool preservesPitch() const;
</span><span class="cx">     void setPreservesPitch(bool);
</span><span class="lines">@@ -595,7 +598,6 @@
</span><span class="cx">     IntSize m_size;
</span><span class="cx">     Preload m_preload;
</span><span class="cx">     bool m_visible;
</span><del>-    double m_rate;
</del><span class="cx">     double m_volume;
</span><span class="cx">     bool m_muted;
</span><span class="cx">     bool m_preservesPitch;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlayerPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -102,6 +102,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void setRate(float) { }
</span><span class="cx">     virtual void setRateDouble(double rate) { setRate(rate); }
</span><ins>+    virtual double rate() const { return 0; }
</ins><span class="cx"> 
</span><span class="cx">     virtual void setPreservesPitch(bool) { }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -60,7 +60,6 @@
</span><span class="cx">     , m_cachedDuration(MediaTime::invalidTime())
</span><span class="cx">     , m_reportedDuration(MediaTime::invalidTime())
</span><span class="cx">     , m_maxTimeLoadedAtLastDidLoadingProgress(MediaTime::invalidTime())
</span><del>-    , m_requestedRate(1)
</del><span class="cx">     , m_delayCallbacks(0)
</span><span class="cx">     , m_delayCharacteristicsChangedNotification(0)
</span><span class="cx">     , m_mainThreadCallPending(false)
</span><span class="lines">@@ -290,14 +289,6 @@
</span><span class="cx">     seekToTime(time, negativeTolerance, positiveTolerance);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlayerPrivateAVFoundation::setRate(float rate)
-{
-    LOG(Media, &quot;MediaPlayerPrivateAVFoundation::setRate(%p) - seting to %f&quot;, this, rate);
-    m_requestedRate = rate;
-
-    updateRate();
-}
-
</del><span class="cx"> bool MediaPlayerPrivateAVFoundation::paused() const
</span><span class="cx"> {
</span><span class="cx">     if (!metaDataAvailable())
</span><span class="lines">@@ -419,6 +410,11 @@
</span><span class="cx">     return m_cachedMinTimeSeekable;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+double MediaPlayerPrivateAVFoundation::requestedRate() const
+{
+    return m_player-&gt;requestedRate();
+}
+
</ins><span class="cx"> MediaTime MediaPlayerPrivateAVFoundation::maxTimeLoaded() const
</span><span class="cx"> {
</span><span class="cx">     if (!metaDataAvailable())
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -171,7 +171,6 @@
</span><span class="cx">     virtual void seek(const MediaTime&amp;) override;
</span><span class="cx">     virtual void seekWithTolerance(const MediaTime&amp;, const MediaTime&amp;, const MediaTime&amp;) override;
</span><span class="cx">     virtual bool seeking() const override;
</span><del>-    virtual void setRate(float) override;
</del><span class="cx">     virtual bool paused() const override;
</span><span class="cx">     virtual void setVolume(float) = 0;
</span><span class="cx">     virtual bool hasClosedCaptions() const override { return m_cachedHasCaptions; }
</span><span class="lines">@@ -232,8 +231,6 @@
</span><span class="cx">     virtual void platformPlay() = 0;
</span><span class="cx">     virtual void platformPause() = 0;
</span><span class="cx">     virtual void checkPlayability() = 0;
</span><del>-    virtual void updateRate() = 0;
-    virtual float rate() const = 0;
</del><span class="cx">     virtual void seekToTime(const MediaTime&amp;, const MediaTime&amp; negativeTolerance, const MediaTime&amp; positiveTolerance) = 0;
</span><span class="cx">     virtual unsigned long long totalBytes() const = 0;
</span><span class="cx">     virtual std::unique_ptr&lt;PlatformTimeRanges&gt; platformBufferedTimeRanges() const = 0;
</span><span class="lines">@@ -277,7 +274,7 @@
</span><span class="cx">     MediaRenderingMode preferredRenderingMode() const;
</span><span class="cx"> 
</span><span class="cx">     bool metaDataAvailable() const { return m_readyState &gt;= MediaPlayer::HaveMetadata; }
</span><del>-    float requestedRate() const { return m_requestedRate; }
</del><ins>+    double requestedRate() const;
</ins><span class="cx">     MediaTime maxTimeLoaded() const;
</span><span class="cx">     bool isReadyForVideoSetup() const;
</span><span class="cx">     virtual void setUpVideoRendering();
</span><span class="lines">@@ -331,7 +328,6 @@
</span><span class="cx">     mutable MediaTime m_cachedDuration;
</span><span class="cx">     MediaTime m_reportedDuration;
</span><span class="cx">     mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress;
</span><del>-    float m_requestedRate;
</del><span class="cx">     mutable int m_delayCallbacks;
</span><span class="cx">     int m_delayCharacteristicsChangedNotification;
</span><span class="cx">     bool m_mainThreadCallPending;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -643,24 +643,24 @@
</span><span class="cx">     AVCFPlayerSetClosedCaptionDisplayEnabled(avPlayer(m_avfWrapper), closedCaptionsVisible);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlayerPrivateAVFoundationCF::updateRate()
</del><ins>+void MediaPlayerPrivateAVFoundationCF::setRate(float rate)
</ins><span class="cx"> {
</span><del>-    LOG(Media, &quot;MediaPlayerPrivateAVFoundationCF::updateRate(%p)&quot;, this);
</del><ins>+    LOG(Media, &quot;MediaPlayerPrivateAVFoundationCF::setRate(%p) - rate: %f&quot;, this, rate);
</ins><span class="cx">     if (!metaDataAvailable() || !avPlayer(m_avfWrapper))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     setDelayCallbacks(true);
</span><del>-    AVCFPlayerSetRate(avPlayer(m_avfWrapper), requestedRate());
</del><ins>+    AVCFPlayerSetRate(avPlayer(m_avfWrapper), rate);
</ins><span class="cx">     setDelayCallbacks(false);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-float MediaPlayerPrivateAVFoundationCF::rate() const
</del><ins>+double MediaPlayerPrivateAVFoundationCF::rate() const
</ins><span class="cx"> {
</span><span class="cx">     if (!metaDataAvailable() || !avPlayer(m_avfWrapper))
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><span class="cx">     setDelayCallbacks(true);
</span><del>-    float currentRate = AVCFPlayerGetRate(avPlayer(m_avfWrapper));
</del><ins>+    double currentRate = AVCFPlayerGetRate(avPlayer(m_avfWrapper));
</ins><span class="cx">     setDelayCallbacks(false);
</span><span class="cx"> 
</span><span class="cx">     return currentRate;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -90,8 +90,8 @@
</span><span class="cx">     virtual MediaPlayerPrivateAVFoundation::AssetStatus assetStatus() const;
</span><span class="cx"> 
</span><span class="cx">     virtual void checkPlayability();
</span><del>-    virtual void updateRate();
-    virtual float rate() const;
</del><ins>+    virtual void setRate(float) override;
+    virtual double rate() const override;
</ins><span class="cx">     virtual void seekToTime(const MediaTime&amp;, const MediaTime&amp; negativeTolerance, const MediaTime&amp; positiveTolerance);
</span><span class="cx">     virtual unsigned long long totalBytes() const;
</span><span class="cx">     virtual std::unique_ptr&lt;PlatformTimeRanges&gt; platformBufferedTimeRanges() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -177,8 +177,8 @@
</span><span class="cx">     virtual long assetErrorCode() const;
</span><span class="cx"> 
</span><span class="cx">     virtual void checkPlayability();
</span><del>-    virtual void updateRate();
-    virtual float rate() const;
</del><ins>+    virtual void setRateDouble(double) override;
+    virtual double rate() const;
</ins><span class="cx">     virtual void seekToTime(const MediaTime&amp;, const MediaTime&amp; negativeTolerance, const MediaTime&amp; positiveTolerance);
</span><span class="cx">     virtual unsigned long long totalBytes() const;
</span><span class="cx">     virtual std::unique_ptr&lt;PlatformTimeRanges&gt; platformBufferedTimeRanges() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -1253,15 +1253,16 @@
</span><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateAVFoundationObjC::setClosedCaptionsVisible(%p) - set to %s&quot;, this, boolString(closedCaptionsVisible));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlayerPrivateAVFoundationObjC::updateRate()
</del><ins>+void MediaPlayerPrivateAVFoundationObjC::setRateDouble(double rate)
+
</ins><span class="cx"> {
</span><span class="cx">     setDelayCallbacks(true);
</span><del>-    m_cachedRate = requestedRate();
-    [m_avPlayer.get() setRate:requestedRate()];
</del><ins>+    m_cachedRate = rate;
+    [m_avPlayer.get() setRate:rate];
</ins><span class="cx">     setDelayCallbacks(false);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-float MediaPlayerPrivateAVFoundationObjC::rate() const
</del><ins>+double MediaPlayerPrivateAVFoundationObjC::rate() const
</ins><span class="cx"> {
</span><span class="cx">     if (!metaDataAvailable())
</span><span class="cx">         return 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKith"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -104,6 +104,7 @@
</span><span class="cx">     virtual void seek(const MediaTime&amp;) override;
</span><span class="cx">     
</span><span class="cx">     void setRate(float);
</span><ins>+    virtual double rate() const override;
</ins><span class="cx">     void setVolume(float);
</span><span class="cx">     void setPreservesPitch(bool);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKitmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm (178280 => 178281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm        2015-01-12 18:10:36 UTC (rev 178280)
+++ trunk/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm        2015-01-12 18:15:07 UTC (rev 178281)
</span><span class="lines">@@ -792,6 +792,11 @@
</span><span class="cx">         [m_qtMovie.get() setRate:rate];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+double MediaPlayerPrivateQTKit::rate() const
+{
+    return m_qtMovie ? [m_qtMovie rate] : 0;
+}
+
</ins><span class="cx"> void MediaPlayerPrivateQTKit::setPreservesPitch(bool preservesPitch)
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateQTKit::setPreservesPitch(%p) - preservesPitch %d&quot;, this, (int)preservesPitch);
</span></span></pre>
</div>
</div>

</body>
</html>