<!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>[200490] trunk/Source</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/200490">200490</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2016-05-05 16:18:20 -0700 (Thu, 05 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2] Media controls don't update if controller is created after the interface is created
https://bugs.webkit.org/show_bug.cgi?id=157376

Reviewed by Beth Dakin.

Source/WebCore:

Add getter methods to WebPlaybackSessionModel so that the model's values can be retrieved
if those values were missed before the equivalent WebPlaybackSessionInterface methods were
called. This necessatates a bunch of changes in HTMLMediaElement and related classes to
change PassRefPtr&lt;TimeRanges&gt; types to Ref&lt;TimeRanges&gt; (and one change in TimeRanges itself).
WebPlaybackSessionModelMediaElement can implement these new getter methods by querying the
values from the HTMLMediaElement, something it was doing already, so most of those changes
are simple refactoring.

There's no reason any longer for WebVideoFullscreenModel to inherit from WebPlaybackSessionModel,
so remove that superclass.

In WebPlaybackSessionInterfaceMac, when a new WebPlaybackControlsManager is set, use the new
getter methods on WebPlaybackSessionModel to update the values in the manager.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::mediaPlayerCharacteristicChanged):
(WebCore::HTMLMediaElement::maxBufferedTime):
(WebCore::HTMLMediaElement::played):
(WebCore::HTMLMediaElement::buffered): Deleted.
(WebCore::HTMLMediaElement::seekable): Deleted.
* html/HTMLMediaElement.h:
* html/MediaController.cpp:
(MediaController::buffered):
(MediaController::seekable):
(MediaController::played):
* html/MediaController.h:
* html/MediaControllerInterface.h:
* html/TimeRanges.cpp:
(WebCore::TimeRanges::copy):
* html/TimeRanges.h:
* platform/cocoa/WebPlaybackSessionModel.h:
* platform/cocoa/WebPlaybackSessionModelMediaElement.h:
* platform/cocoa/WebPlaybackSessionModelMediaElement.mm:
(WebPlaybackSessionModelMediaElement::setWebPlaybackSessionInterface):
(WebPlaybackSessionModelMediaElement::updateForEventName):
(WebPlaybackSessionModelMediaElement::updateLegibleOptions):
(WebPlaybackSessionModelMediaElement::observedEventNames):
(WebPlaybackSessionModelMediaElement::eventNameAll):
(WebPlaybackSessionModelMediaElement::duration):
(WebPlaybackSessionModelMediaElement::currentTime):
(WebPlaybackSessionModelMediaElement::bufferedTime):
(WebPlaybackSessionModelMediaElement::isPlaying):
(WebPlaybackSessionModelMediaElement::playbackRate):
(WebPlaybackSessionModelMediaElement::seekableRanges):
(WebPlaybackSessionModelMediaElement::canPlayFastReverse):
(WebPlaybackSessionModelMediaElement::audioMediaSelectionOptions):
(WebPlaybackSessionModelMediaElement::audioMediaSelectedIndex):
(WebPlaybackSessionModelMediaElement::legibleMediaSelectionOptions):
(WebPlaybackSessionModelMediaElement::legibleMediaSelectedIndex):
(WebPlaybackSessionModelMediaElement::externalPlaybackEnabled):
(WebPlaybackSessionModelMediaElement::wirelessVideoPlaybackDisabled):
* platform/cocoa/WebVideoFullscreenModel.h:
* platform/cocoa/WebVideoFullscreenModelVideoElement.h:
* platform/cocoa/WebVideoFullscreenModelVideoElement.mm:
(WebVideoFullscreenModelVideoElement::requestFullscreenMode): Deleted.
(WebVideoFullscreenModelVideoElement::setVideoLayerFrame): Deleted.
(WebVideoFullscreenModelVideoElement::setVideoLayerGravity): Deleted.
(WebVideoFullscreenModelVideoElement::observedEventNames): Deleted.
(WebVideoFullscreenModelVideoElement::eventNameAll): Deleted.
(WebVideoFullscreenModelVideoElement::fullscreenModeChanged): Deleted.
* platform/ios/WebPlaybackSessionInterfaceAVKit.h:
* platform/ios/WebVideoFullscreenControllerAVKit.mm:
(WebVideoFullscreenControllerContext::play): Deleted.
(WebVideoFullscreenControllerContext::pause): Deleted.
(WebVideoFullscreenControllerContext::togglePlayState): Deleted.
(WebVideoFullscreenControllerContext::beginScrubbing): Deleted.
(WebVideoFullscreenControllerContext::endScrubbing): Deleted.
(WebVideoFullscreenControllerContext::seekToTime): Deleted.
(WebVideoFullscreenControllerContext::fastSeek): Deleted.
(WebVideoFullscreenControllerContext::beginScanningForward): Deleted.
(WebVideoFullscreenControllerContext::beginScanningBackward): Deleted.
(WebVideoFullscreenControllerContext::endScanning): Deleted.
(WebVideoFullscreenControllerContext::selectAudioMediaOption): Deleted.
(WebVideoFullscreenControllerContext::selectLegibleMediaOption): Deleted.
* platform/ios/WebVideoFullscreenInterfaceAVKit.h:
* platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
(WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen):
(WebVideoFullscreenInterfaceAVKit::shouldExitFullscreenWithReason):
* platform/mac/WebPlaybackSessionInterfaceMac.mm:
(WebCore::timeRangesToArray):
(WebCore::WebPlaybackSessionInterfaceMac::setSeekableRanges):
(WebCore::WebPlaybackSessionInterfaceMac::setPlayBackControlsManager):
* platform/mac/WebVideoFullscreenInterfaceMac.h:

Source/WebKit2:

Implement the new getter methods on WebPlaybackSessionModelContext by caching the values
passed through WebPlaybackSessionManagerProxy.

* UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h:
* UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm:
(WebKit::WebPlaybackSessionManagerProxy::setCurrentTime):
(WebKit::WebPlaybackSessionManagerProxy::setBufferedTime):
(WebKit::WebPlaybackSessionManagerProxy::setSeekableRangesVector):
(WebKit::WebPlaybackSessionManagerProxy::setCanPlayFastReverse):
(WebKit::WebPlaybackSessionManagerProxy::setAudioMediaSelectionOptions):
(WebKit::WebPlaybackSessionManagerProxy::setLegibleMediaSelectionOptions):
(WebKit::WebPlaybackSessionManagerProxy::setExternalPlaybackProperties):
(WebKit::WebPlaybackSessionManagerProxy::setWirelessVideoPlaybackDisabled):
(WebKit::WebPlaybackSessionManagerProxy::setDuration):
(WebKit::WebPlaybackSessionManagerProxy::setRate):
* UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h:
* UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm:
(WebKit::WebVideoFullscreenModelContext::requestFullscreenMode): Deleted.
(WebKit::WebVideoFullscreenModelContext::setVideoLayerFrame): Deleted.
(WebKit::WebVideoFullscreenModelContext::setVideoLayerGravity): Deleted.
(WebKit::WebVideoFullscreenModelContext::fullscreenModeChanged): Deleted.
(WebKit::WebVideoFullscreenModelContext::isVisible): Deleted.
(WebKit::WebVideoFullscreenModelContext::didSetupFullscreen): Deleted.
(WebKit::WebVideoFullscreenModelContext::didEnterFullscreen): Deleted.
(WebKit::WebVideoFullscreenModelContext::didExitFullscreen): Deleted.
(WebKit::WebVideoFullscreenModelContext::didCleanupFullscreen): Deleted.
(WebKit::WebVideoFullscreenManagerProxy::WebVideoFullscreenManagerProxy): Deleted.
(WebKit::WebVideoFullscreenManagerProxy::~WebVideoFullscreenManagerProxy): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebCorehtmlMediaControllercpp">trunk/Source/WebCore/html/MediaController.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaControllerh">trunk/Source/WebCore/html/MediaController.h</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaControllerInterfaceh">trunk/Source/WebCore/html/MediaControllerInterface.h</a></li>
<li><a href="#trunkSourceWebCorehtmlTimeRangescpp">trunk/Source/WebCore/html/TimeRanges.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlTimeRangesh">trunk/Source/WebCore/html/TimeRanges.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaWebPlaybackSessionModelh">trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementh">trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementmm">trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaWebVideoFullscreenModelh">trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementh">trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementmm">trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebPlaybackSessionInterfaceAVKith">trunk/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenControllerAVKitmm">trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKith">trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKitmm">trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmacWebPlaybackSessionInterfaceMacmm">trunk/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmacWebVideoFullscreenInterfaceMach">trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxyh">trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxymm">trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxyh">trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxymm">trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/ChangeLog        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -1,3 +1,94 @@
</span><ins>+2016-05-05  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        [WK2] Media controls don't update if controller is created after the interface is created
+        https://bugs.webkit.org/show_bug.cgi?id=157376
+
+        Reviewed by Beth Dakin.
+
+        Add getter methods to WebPlaybackSessionModel so that the model's values can be retrieved
+        if those values were missed before the equivalent WebPlaybackSessionInterface methods were
+        called. This necessatates a bunch of changes in HTMLMediaElement and related classes to
+        change PassRefPtr&lt;TimeRanges&gt; types to Ref&lt;TimeRanges&gt; (and one change in TimeRanges itself).
+        WebPlaybackSessionModelMediaElement can implement these new getter methods by querying the
+        values from the HTMLMediaElement, something it was doing already, so most of those changes
+        are simple refactoring.
+
+        There's no reason any longer for WebVideoFullscreenModel to inherit from WebPlaybackSessionModel,
+        so remove that superclass.
+
+        In WebPlaybackSessionInterfaceMac, when a new WebPlaybackControlsManager is set, use the new
+        getter methods on WebPlaybackSessionModel to update the values in the manager.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::mediaPlayerCharacteristicChanged):
+        (WebCore::HTMLMediaElement::maxBufferedTime):
+        (WebCore::HTMLMediaElement::played):
+        (WebCore::HTMLMediaElement::buffered): Deleted.
+        (WebCore::HTMLMediaElement::seekable): Deleted.
+        * html/HTMLMediaElement.h:
+        * html/MediaController.cpp:
+        (MediaController::buffered):
+        (MediaController::seekable):
+        (MediaController::played):
+        * html/MediaController.h:
+        * html/MediaControllerInterface.h:
+        * html/TimeRanges.cpp:
+        (WebCore::TimeRanges::copy):
+        * html/TimeRanges.h:
+        * platform/cocoa/WebPlaybackSessionModel.h:
+        * platform/cocoa/WebPlaybackSessionModelMediaElement.h:
+        * platform/cocoa/WebPlaybackSessionModelMediaElement.mm:
+        (WebPlaybackSessionModelMediaElement::setWebPlaybackSessionInterface):
+        (WebPlaybackSessionModelMediaElement::updateForEventName):
+        (WebPlaybackSessionModelMediaElement::updateLegibleOptions):
+        (WebPlaybackSessionModelMediaElement::observedEventNames):
+        (WebPlaybackSessionModelMediaElement::eventNameAll):
+        (WebPlaybackSessionModelMediaElement::duration):
+        (WebPlaybackSessionModelMediaElement::currentTime):
+        (WebPlaybackSessionModelMediaElement::bufferedTime):
+        (WebPlaybackSessionModelMediaElement::isPlaying):
+        (WebPlaybackSessionModelMediaElement::playbackRate):
+        (WebPlaybackSessionModelMediaElement::seekableRanges):
+        (WebPlaybackSessionModelMediaElement::canPlayFastReverse):
+        (WebPlaybackSessionModelMediaElement::audioMediaSelectionOptions):
+        (WebPlaybackSessionModelMediaElement::audioMediaSelectedIndex):
+        (WebPlaybackSessionModelMediaElement::legibleMediaSelectionOptions):
+        (WebPlaybackSessionModelMediaElement::legibleMediaSelectedIndex):
+        (WebPlaybackSessionModelMediaElement::externalPlaybackEnabled):
+        (WebPlaybackSessionModelMediaElement::wirelessVideoPlaybackDisabled):
+        * platform/cocoa/WebVideoFullscreenModel.h:
+        * platform/cocoa/WebVideoFullscreenModelVideoElement.h:
+        * platform/cocoa/WebVideoFullscreenModelVideoElement.mm:
+        (WebVideoFullscreenModelVideoElement::requestFullscreenMode): Deleted.
+        (WebVideoFullscreenModelVideoElement::setVideoLayerFrame): Deleted.
+        (WebVideoFullscreenModelVideoElement::setVideoLayerGravity): Deleted.
+        (WebVideoFullscreenModelVideoElement::observedEventNames): Deleted.
+        (WebVideoFullscreenModelVideoElement::eventNameAll): Deleted.
+        (WebVideoFullscreenModelVideoElement::fullscreenModeChanged): Deleted.
+        * platform/ios/WebPlaybackSessionInterfaceAVKit.h:
+        * platform/ios/WebVideoFullscreenControllerAVKit.mm:
+        (WebVideoFullscreenControllerContext::play): Deleted.
+        (WebVideoFullscreenControllerContext::pause): Deleted.
+        (WebVideoFullscreenControllerContext::togglePlayState): Deleted.
+        (WebVideoFullscreenControllerContext::beginScrubbing): Deleted.
+        (WebVideoFullscreenControllerContext::endScrubbing): Deleted.
+        (WebVideoFullscreenControllerContext::seekToTime): Deleted.
+        (WebVideoFullscreenControllerContext::fastSeek): Deleted.
+        (WebVideoFullscreenControllerContext::beginScanningForward): Deleted.
+        (WebVideoFullscreenControllerContext::beginScanningBackward): Deleted.
+        (WebVideoFullscreenControllerContext::endScanning): Deleted.
+        (WebVideoFullscreenControllerContext::selectAudioMediaOption): Deleted.
+        (WebVideoFullscreenControllerContext::selectLegibleMediaOption): Deleted.
+        * platform/ios/WebVideoFullscreenInterfaceAVKit.h:
+        * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
+        (WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen):
+        (WebVideoFullscreenInterfaceAVKit::shouldExitFullscreenWithReason):
+        * platform/mac/WebPlaybackSessionInterfaceMac.mm:
+        (WebCore::timeRangesToArray):
+        (WebCore::WebPlaybackSessionInterfaceMac::setSeekableRanges):
+        (WebCore::WebPlaybackSessionInterfaceMac::setPlayBackControlsManager):
+        * platform/mac/WebVideoFullscreenInterfaceMac.h:
+
</ins><span class="cx"> 2016-05-05  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Modern IDB (Workers): Move TransactionOperation management from IDBConnectionToServer to IDBConnectionProxy.
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -4636,7 +4636,7 @@
</span><span class="cx">     endProcessingMediaPlayerCallback();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; HTMLMediaElement::buffered() const
</del><ins>+Ref&lt;TimeRanges&gt; HTMLMediaElement::buffered() const
</ins><span class="cx"> {
</span><span class="cx">     if (!m_player)
</span><span class="cx">         return TimeRanges::create();
</span><span class="lines">@@ -4659,7 +4659,7 @@
</span><span class="cx">     return bufferedRanges-&gt;end(numRanges - 1, ASSERT_NO_EXCEPTION);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; HTMLMediaElement::played()
</del><ins>+Ref&lt;TimeRanges&gt; HTMLMediaElement::played()
</ins><span class="cx"> {
</span><span class="cx">     if (m_playing) {
</span><span class="cx">         MediaTime time = currentMediaTime();
</span><span class="lines">@@ -4673,7 +4673,7 @@
</span><span class="cx">     return m_playedTimeRanges-&gt;copy();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; HTMLMediaElement::seekable() const
</del><ins>+Ref&lt;TimeRanges&gt; HTMLMediaElement::seekable() const
</ins><span class="cx"> {
</span><span class="cx">     if (m_player)
</span><span class="cx">         return TimeRanges::create(*m_player-&gt;seekable());
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx">     String preload() const;    
</span><span class="cx">     void setPreload(const String&amp;);
</span><span class="cx"> 
</span><del>-    PassRefPtr&lt;TimeRanges&gt; buffered() const override;
</del><ins>+    Ref&lt;TimeRanges&gt; buffered() const override;
</ins><span class="cx">     void load();
</span><span class="cx">     String canPlayType(const String&amp; mimeType, const String&amp; keySystem = String(), const URL&amp; = URL()) const;
</span><span class="cx"> 
</span><span class="lines">@@ -197,8 +197,8 @@
</span><span class="cx">     void updatePlaybackRate();
</span><span class="cx">     bool webkitPreservesPitch() const;
</span><span class="cx">     void setWebkitPreservesPitch(bool);
</span><del>-    PassRefPtr&lt;TimeRanges&gt; played() override;
-    PassRefPtr&lt;TimeRanges&gt; seekable() const override;
</del><ins>+    Ref&lt;TimeRanges&gt; played() override;
+    Ref&lt;TimeRanges&gt; seekable() const override;
</ins><span class="cx">     WEBCORE_EXPORT bool ended() const;
</span><span class="cx">     bool autoplay() const;
</span><span class="cx">     bool isAutoplaying() const { return m_autoplaying; }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaController.cpp (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaController.cpp        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/MediaController.cpp        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -85,7 +85,7 @@
</span><span class="cx">     return m_mediaElements.contains(element);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; MediaController::buffered() const
</del><ins>+Ref&lt;TimeRanges&gt; MediaController::buffered() const
</ins><span class="cx"> {
</span><span class="cx">     if (m_mediaElements.isEmpty())
</span><span class="cx">         return TimeRanges::create();
</span><span class="lines">@@ -93,13 +93,13 @@
</span><span class="cx">     // The buffered attribute must return a new static normalized TimeRanges object that represents 
</span><span class="cx">     // the intersection of the ranges of the media resources of the slaved media elements that the 
</span><span class="cx">     // user agent has buffered, at the time the attribute is evaluated.
</span><del>-    RefPtr&lt;TimeRanges&gt; bufferedRanges = m_mediaElements.first()-&gt;buffered();
</del><ins>+    Ref&lt;TimeRanges&gt; bufferedRanges = m_mediaElements.first()-&gt;buffered();
</ins><span class="cx">     for (size_t index = 1; index &lt; m_mediaElements.size(); ++index)
</span><del>-        bufferedRanges-&gt;intersectWith(*m_mediaElements[index]-&gt;buffered().get());
</del><ins>+        bufferedRanges-&gt;intersectWith(m_mediaElements[index]-&gt;buffered());
</ins><span class="cx">     return bufferedRanges;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; MediaController::seekable() const
</del><ins>+Ref&lt;TimeRanges&gt; MediaController::seekable() const
</ins><span class="cx"> {
</span><span class="cx">     if (m_mediaElements.isEmpty())
</span><span class="cx">         return TimeRanges::create();
</span><span class="lines">@@ -107,13 +107,13 @@
</span><span class="cx">     // The seekable attribute must return a new static normalized TimeRanges object that represents
</span><span class="cx">     // the intersection of the ranges of the media resources of the slaved media elements that the
</span><span class="cx">     // user agent is able to seek to, at the time the attribute is evaluated.
</span><del>-    RefPtr&lt;TimeRanges&gt; seekableRanges = m_mediaElements.first()-&gt;seekable();
</del><ins>+    Ref&lt;TimeRanges&gt; seekableRanges = m_mediaElements.first()-&gt;seekable();
</ins><span class="cx">     for (size_t index = 1; index &lt; m_mediaElements.size(); ++index)
</span><del>-        seekableRanges-&gt;intersectWith(*m_mediaElements[index]-&gt;seekable().get());
</del><ins>+        seekableRanges-&gt;intersectWith(m_mediaElements[index]-&gt;seekable());
</ins><span class="cx">     return seekableRanges;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; MediaController::played()
</del><ins>+Ref&lt;TimeRanges&gt; MediaController::played()
</ins><span class="cx"> {
</span><span class="cx">     if (m_mediaElements.isEmpty())
</span><span class="cx">         return TimeRanges::create();
</span><span class="lines">@@ -121,9 +121,9 @@
</span><span class="cx">     // The played attribute must return a new static normalized TimeRanges object that represents 
</span><span class="cx">     // the union of the ranges of the media resources of the slaved media elements that the 
</span><span class="cx">     // user agent has so far rendered, at the time the attribute is evaluated.
</span><del>-    RefPtr&lt;TimeRanges&gt; playedRanges = m_mediaElements.first()-&gt;played();
</del><ins>+    Ref&lt;TimeRanges&gt; playedRanges = m_mediaElements.first()-&gt;played();
</ins><span class="cx">     for (size_t index = 1; index &lt; m_mediaElements.size(); ++index)
</span><del>-        playedRanges-&gt;unionWith(*m_mediaElements[index]-&gt;played().get());
</del><ins>+        playedRanges-&gt;unionWith(m_mediaElements[index]-&gt;played());
</ins><span class="cx">     return playedRanges;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaController.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaController.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/MediaController.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -54,9 +54,9 @@
</span><span class="cx"> 
</span><span class="cx">     const String&amp; mediaGroup() const { return m_mediaGroup; }
</span><span class="cx">     
</span><del>-    PassRefPtr&lt;TimeRanges&gt; buffered() const override;
-    PassRefPtr&lt;TimeRanges&gt; seekable() const override;
-    PassRefPtr&lt;TimeRanges&gt; played() override;
</del><ins>+    Ref&lt;TimeRanges&gt; buffered() const override;
+    Ref&lt;TimeRanges&gt; seekable() const override;
+    Ref&lt;TimeRanges&gt; played() override;
</ins><span class="cx">     
</span><span class="cx">     double duration() const override;
</span><span class="cx">     double currentTime() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaControllerInterfaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaControllerInterface.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaControllerInterface.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/MediaControllerInterface.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -42,9 +42,9 @@
</span><span class="cx">     virtual ~MediaControllerInterface() { };
</span><span class="cx">     
</span><span class="cx">     // MediaController IDL:
</span><del>-    virtual PassRefPtr&lt;TimeRanges&gt; buffered() const = 0;
-    virtual PassRefPtr&lt;TimeRanges&gt; seekable() const = 0;
-    virtual PassRefPtr&lt;TimeRanges&gt; played() = 0;
</del><ins>+    virtual Ref&lt;TimeRanges&gt; buffered() const = 0;
+    virtual Ref&lt;TimeRanges&gt; seekable() const = 0;
+    virtual Ref&lt;TimeRanges&gt; played() = 0;
</ins><span class="cx">     
</span><span class="cx">     virtual double duration() const = 0;
</span><span class="cx">     virtual double currentTime() const = 0;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlTimeRangescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/TimeRanges.cpp (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/TimeRanges.cpp        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/TimeRanges.cpp        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx">     m_ranges.invert();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;TimeRanges&gt; TimeRanges::copy() const
</del><ins>+Ref&lt;TimeRanges&gt; TimeRanges::copy() const
</ins><span class="cx"> {
</span><span class="cx">     return TimeRanges::create(m_ranges);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlTimeRangesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/TimeRanges.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/TimeRanges.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/html/TimeRanges.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">     WEBCORE_EXPORT double start(unsigned index, ExceptionCode&amp;) const;
</span><span class="cx">     WEBCORE_EXPORT double end(unsigned index, ExceptionCode&amp;) const;
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT PassRefPtr&lt;TimeRanges&gt; copy() const;
</del><ins>+    WEBCORE_EXPORT Ref&lt;TimeRanges&gt; copy() const;
</ins><span class="cx">     void invert();
</span><span class="cx">     WEBCORE_EXPORT void intersectWith(const TimeRanges&amp;);
</span><span class="cx">     void unionWith(const TimeRanges&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaWebPlaybackSessionModelh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -28,8 +28,14 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS) || (PLATFORM(MAC) &amp;&amp; ENABLE(VIDEO_PRESENTATION_MODE))
</span><span class="cx"> 
</span><ins>+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/Ref.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class TimeRanges;
+
</ins><span class="cx"> class WebPlaybackSessionModel {
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebPlaybackSessionModel() { };
</span><span class="lines">@@ -45,6 +51,20 @@
</span><span class="cx">     virtual void endScanning() = 0;
</span><span class="cx">     virtual void selectAudioMediaOption(uint64_t index) = 0;
</span><span class="cx">     virtual void selectLegibleMediaOption(uint64_t index) = 0;
</span><ins>+
+    virtual double duration() const = 0;
+    virtual double currentTime() const = 0;
+    virtual double bufferedTime() const = 0;
+    virtual bool isPlaying() const = 0;
+    virtual float playbackRate() const = 0;
+    virtual Ref&lt;TimeRanges&gt; seekableRanges() const = 0;
+    virtual bool canPlayFastReverse() const = 0;
+    virtual Vector&lt;WTF::String&gt; audioMediaSelectionOptions() const = 0;
+    virtual uint64_t audioMediaSelectedIndex() const = 0;
+    virtual Vector&lt;WTF::String&gt; legibleMediaSelectionOptions() const = 0;
+    virtual uint64_t legibleMediaSelectedIndex() const = 0;
+    virtual bool externalPlaybackEnabled() const = 0;
+    virtual bool wirelessVideoPlaybackDisabled() const = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -68,6 +68,20 @@
</span><span class="cx">     WEBCORE_EXPORT void selectAudioMediaOption(uint64_t index) final;
</span><span class="cx">     WEBCORE_EXPORT void selectLegibleMediaOption(uint64_t index) final;
</span><span class="cx"> 
</span><ins>+    double duration() const final;
+    double currentTime() const final;
+    double bufferedTime() const final;
+    bool isPlaying() const final;
+    float playbackRate() const final;
+    Ref&lt;TimeRanges&gt; seekableRanges() const final;
+    bool canPlayFastReverse() const final;
+    Vector&lt;WTF::String&gt; audioMediaSelectionOptions() const final;
+    uint64_t audioMediaSelectedIndex() const final;
+    Vector&lt;WTF::String&gt; legibleMediaSelectionOptions() const final;
+    uint64_t legibleMediaSelectedIndex() const final;
+    bool externalPlaybackEnabled() const final;
+    bool wirelessVideoPlaybackDisabled() const final;
+
</ins><span class="cx"> protected:
</span><span class="cx">     WEBCORE_EXPORT WebPlaybackSessionModelMediaElement();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -69,16 +69,13 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_playbackSessionInterface-&gt;resetMediaState();
</span><del>-    if (!m_mediaElement)
-        return;
-
-    m_playbackSessionInterface-&gt;setDuration(m_mediaElement-&gt;duration());
-    m_playbackSessionInterface-&gt;setCurrentTime(m_mediaElement-&gt;currentTime(), [[NSProcessInfo processInfo] systemUptime]);
-    m_playbackSessionInterface-&gt;setBufferedTime(m_mediaElement-&gt;maxBufferedTime());
-    m_playbackSessionInterface-&gt;setRate(!m_mediaElement-&gt;paused(), m_mediaElement-&gt;playbackRate());
-    m_playbackSessionInterface-&gt;setSeekableRanges(*m_mediaElement-&gt;seekable());
-    m_playbackSessionInterface-&gt;setCanPlayFastReverse(m_mediaElement-&gt;minFastReverseRate() &lt; 0.0);
-    m_playbackSessionInterface-&gt;setWirelessVideoPlaybackDisabled(m_mediaElement-&gt;mediaSession().wirelessVideoPlaybackDisabled(*m_mediaElement));
</del><ins>+    m_playbackSessionInterface-&gt;setDuration(duration());
+    m_playbackSessionInterface-&gt;setCurrentTime(currentTime(), [[NSProcessInfo processInfo] systemUptime]);
+    m_playbackSessionInterface-&gt;setBufferedTime(bufferedTime());
+    m_playbackSessionInterface-&gt;setRate(isPlaying(), playbackRate());
+    m_playbackSessionInterface-&gt;setSeekableRanges(seekableRanges());
+    m_playbackSessionInterface-&gt;setCanPlayFastReverse(canPlayFastReverse());
+    m_playbackSessionInterface-&gt;setWirelessVideoPlaybackDisabled(wirelessVideoPlaybackDisabled());
</ins><span class="cx">     updateLegibleOptions();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -142,7 +139,7 @@
</span><span class="cx">         m_playbackSessionInterface-&gt;setCurrentTime(m_mediaElement-&gt;currentTime(), [[NSProcessInfo processInfo] systemUptime]);
</span><span class="cx">         m_playbackSessionInterface-&gt;setBufferedTime(m_mediaElement-&gt;maxBufferedTime());
</span><span class="cx">         // FIXME: 130788 - find a better event to update seekable ranges from.
</span><del>-        m_playbackSessionInterface-&gt;setSeekableRanges(*m_mediaElement-&gt;seekable());
</del><ins>+        m_playbackSessionInterface-&gt;setSeekableRanges(m_mediaElement-&gt;seekable());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (all
</span><span class="lines">@@ -259,42 +256,135 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionModelMediaElement::updateLegibleOptions()
</span><span class="cx"> {
</span><ins>+    if (!m_mediaElement)
+        return;
+
</ins><span class="cx">     AudioTrackList* audioTrackList = m_mediaElement-&gt;audioTracks();
</span><span class="cx">     TextTrackList* trackList = m_mediaElement-&gt;textTracks();
</span><span class="cx"> 
</span><del>-    if ((!trackList &amp;&amp; !audioTrackList) || !m_mediaElement-&gt;document().page() || !m_mediaElement-&gt;mediaControlsHost())
</del><ins>+    if ((!trackList &amp;&amp; !audioTrackList) || !m_mediaElement-&gt;document().page())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    AtomicString displayMode = m_mediaElement-&gt;mediaControlsHost()-&gt;captionDisplayMode();
-    TextTrack* offItem = m_mediaElement-&gt;mediaControlsHost()-&gt;captionMenuOffItem();
-    TextTrack* automaticItem = m_mediaElement-&gt;mediaControlsHost()-&gt;captionMenuAutomaticItem();
-
</del><span class="cx">     auto&amp; captionPreferences = m_mediaElement-&gt;document().page()-&gt;group().captionPreferences();
</span><span class="cx">     m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(trackList);
</span><span class="cx">     m_audioTracksForMenu = captionPreferences.sortedTrackListForMenu(audioTrackList);
</span><span class="cx"> 
</span><ins>+    m_playbackSessionInterface-&gt;setAudioMediaSelectionOptions(audioMediaSelectionOptions(), audioMediaSelectedIndex());
+    m_playbackSessionInterface-&gt;setLegibleMediaSelectionOptions(legibleMediaSelectionOptions(), legibleMediaSelectedIndex());
+}
+
+const Vector&lt;AtomicString&gt;&amp;  WebPlaybackSessionModelMediaElement::observedEventNames()
+{
+    static NeverDestroyed&lt;Vector&lt;AtomicString&gt;&gt; sEventNames;
+
+    if (!sEventNames.get().size()) {
+        sEventNames.get().append(eventNames().durationchangeEvent);
+        sEventNames.get().append(eventNames().pauseEvent);
+        sEventNames.get().append(eventNames().playEvent);
+        sEventNames.get().append(eventNames().ratechangeEvent);
+        sEventNames.get().append(eventNames().timeupdateEvent);
+        sEventNames.get().append(eventNames().addtrackEvent);
+        sEventNames.get().append(eventNames().removetrackEvent);
+        sEventNames.get().append(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
+    }
+    return sEventNames.get();
+}
+
+const AtomicString&amp;  WebPlaybackSessionModelMediaElement::eventNameAll()
+{
+    static NeverDestroyed&lt;AtomicString&gt; sEventNameAll = &quot;allEvents&quot;;
+    return sEventNameAll;
+}
+
+double WebPlaybackSessionModelMediaElement::duration() const
+{
+    return m_mediaElement ? m_mediaElement-&gt;duration() : 0;
+}
+
+double WebPlaybackSessionModelMediaElement::currentTime() const
+{
+    return m_mediaElement ? m_mediaElement-&gt;currentTime() : 0;
+}
+
+double WebPlaybackSessionModelMediaElement::bufferedTime() const
+{
+    return m_mediaElement ? m_mediaElement-&gt;maxBufferedTime() : 0;
+}
+
+bool WebPlaybackSessionModelMediaElement::isPlaying() const
+{
+    return m_mediaElement ? !m_mediaElement-&gt;paused() : false;
+}
+
+float WebPlaybackSessionModelMediaElement::playbackRate() const
+{
+    return m_mediaElement ? m_mediaElement-&gt;playbackRate() : 0;
+}
+
+Ref&lt;TimeRanges&gt; WebPlaybackSessionModelMediaElement::seekableRanges() const
+{
+    return m_mediaElement ? m_mediaElement-&gt;seekable() : TimeRanges::create();
+}
+
+bool WebPlaybackSessionModelMediaElement::canPlayFastReverse() const
+{
+    return m_mediaElement ? m_mediaElement-&gt;minFastReverseRate() &lt; 0.0 : false;
+}
+
+Vector&lt;WTF::String&gt; WebPlaybackSessionModelMediaElement::audioMediaSelectionOptions() const
+{
</ins><span class="cx">     Vector&lt;String&gt; audioTrackDisplayNames;
</span><del>-    uint64_t selectedAudioIndex = 0;
</del><span class="cx"> 
</span><ins>+    if (!m_mediaElement || !m_mediaElement-&gt;document().page())
+        return audioTrackDisplayNames;
+
+    auto&amp; captionPreferences = m_mediaElement-&gt;document().page()-&gt;group().captionPreferences();
+
+    for (auto&amp; audioTrack : m_audioTracksForMenu)
+        audioTrackDisplayNames.append(captionPreferences.displayNameForTrack(audioTrack.get()));
+
+    return audioTrackDisplayNames;
+}
+
+uint64_t WebPlaybackSessionModelMediaElement::audioMediaSelectedIndex() const
+{
</ins><span class="cx">     for (size_t index = 0; index &lt; m_audioTracksForMenu.size(); ++index) {
</span><del>-        auto&amp; track = m_audioTracksForMenu[index];
-        audioTrackDisplayNames.append(captionPreferences.displayNameForTrack(track.get()));
-
-        if (track-&gt;enabled())
-            selectedAudioIndex = index;
</del><ins>+        if (m_audioTracksForMenu[index]-&gt;enabled())
+            return index;
</ins><span class="cx">     }
</span><ins>+    return 0;
+}
</ins><span class="cx"> 
</span><del>-    m_playbackSessionInterface-&gt;setAudioMediaSelectionOptions(audioTrackDisplayNames, selectedAudioIndex);
</del><ins>+Vector&lt;WTF::String&gt; WebPlaybackSessionModelMediaElement::legibleMediaSelectionOptions() const
+{
+    Vector&lt;String&gt; trackDisplayNames;
</ins><span class="cx"> 
</span><del>-    Vector&lt;String&gt; trackDisplayNames;
</del><ins>+    if (!m_mediaElement || !m_mediaElement-&gt;document().page())
+        return trackDisplayNames;
+
+    auto&amp; captionPreferences = m_mediaElement-&gt;document().page()-&gt;group().captionPreferences();
+
+    for (auto&amp; track : m_legibleTracksForMenu)
+        trackDisplayNames.append(captionPreferences.displayNameForTrack(track.get()));
+
+    return trackDisplayNames;
+}
+
+uint64_t WebPlaybackSessionModelMediaElement::legibleMediaSelectedIndex() const
+{
</ins><span class="cx">     uint64_t selectedIndex = 0;
</span><span class="cx">     uint64_t offIndex = 0;
</span><span class="cx">     bool trackMenuItemSelected = false;
</span><span class="cx"> 
</span><ins>+    if (!m_mediaElement || !m_mediaElement-&gt;mediaControlsHost())
+        return selectedIndex;
+
+    AtomicString displayMode = m_mediaElement-&gt;mediaControlsHost()-&gt;captionDisplayMode();
+    TextTrack* offItem = m_mediaElement-&gt;mediaControlsHost()-&gt;captionMenuOffItem();
+    TextTrack* automaticItem = m_mediaElement-&gt;mediaControlsHost()-&gt;captionMenuAutomaticItem();
+
</ins><span class="cx">     for (size_t index = 0; index &lt; m_legibleTracksForMenu.size(); index++) {
</span><span class="cx">         auto&amp; track = m_legibleTracksForMenu[index];
</span><del>-        trackDisplayNames.append(captionPreferences.displayNameForTrack(track.get()));
-
</del><span class="cx">         if (track == offItem)
</span><span class="cx">             offIndex = index;
</span><span class="cx"> 
</span><span class="lines">@@ -309,35 +399,20 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (offIndex &amp;&amp; !trackMenuItemSelected &amp;&amp; displayMode == MediaControlsHost::forcedOnlyKeyword()) {
</del><ins>+    if (offIndex &amp;&amp; !trackMenuItemSelected &amp;&amp; displayMode == MediaControlsHost::forcedOnlyKeyword())
</ins><span class="cx">         selectedIndex = offIndex;
</span><del>-        trackMenuItemSelected = true;
-    }
</del><span class="cx"> 
</span><del>-    m_playbackSessionInterface-&gt;setLegibleMediaSelectionOptions(trackDisplayNames, selectedIndex);
</del><ins>+    return selectedIndex;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const Vector&lt;AtomicString&gt;&amp;  WebPlaybackSessionModelMediaElement::observedEventNames()
</del><ins>+bool WebPlaybackSessionModelMediaElement::externalPlaybackEnabled() const
</ins><span class="cx"> {
</span><del>-    static NeverDestroyed&lt;Vector&lt;AtomicString&gt;&gt; sEventNames;
-
-    if (!sEventNames.get().size()) {
-        sEventNames.get().append(eventNames().durationchangeEvent);
-        sEventNames.get().append(eventNames().pauseEvent);
-        sEventNames.get().append(eventNames().playEvent);
-        sEventNames.get().append(eventNames().ratechangeEvent);
-        sEventNames.get().append(eventNames().timeupdateEvent);
-        sEventNames.get().append(eventNames().addtrackEvent);
-        sEventNames.get().append(eventNames().removetrackEvent);
-        sEventNames.get().append(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
-    }
-    return sEventNames.get();
</del><ins>+    return m_mediaElement ? m_mediaElement-&gt;webkitCurrentPlaybackTargetIsWireless() : false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString&amp;  WebPlaybackSessionModelMediaElement::eventNameAll()
</del><ins>+bool WebPlaybackSessionModelMediaElement::wirelessVideoPlaybackDisabled() const
</ins><span class="cx"> {
</span><del>-    static NeverDestroyed&lt;AtomicString&gt; sEventNameAll = &quot;allEvents&quot;;
-    return sEventNameAll;
</del><ins>+    return m_mediaElement ? m_mediaElement-&gt;mediaSession().wirelessVideoPlaybackDisabled(*m_mediaElement) : false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaWebVideoFullscreenModelh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class WebVideoFullscreenModel : public WebPlaybackSessionModel {
</del><ins>+class WebVideoFullscreenModel {
</ins><span class="cx"> public:
</span><span class="cx">     virtual ~WebVideoFullscreenModel() { };
</span><span class="cx">     virtual void requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode) = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -62,21 +62,9 @@
</span><span class="cx">     bool operator==(const EventListener&amp; rhs) override
</span><span class="cx">         {return static_cast&lt;WebCore::EventListener*&gt;(this) == &amp;rhs;}
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void play() override;
-    WEBCORE_EXPORT void pause() override;
-    WEBCORE_EXPORT void togglePlayState() override;
-    WEBCORE_EXPORT void beginScrubbing() override;
-    WEBCORE_EXPORT void endScrubbing() override;
-    WEBCORE_EXPORT void seekToTime(double time) override;
-    WEBCORE_EXPORT void fastSeek(double time) override;
-    WEBCORE_EXPORT void beginScanningForward() override;
-    WEBCORE_EXPORT void beginScanningBackward() override;
-    WEBCORE_EXPORT void endScanning() override;
</del><span class="cx">     WEBCORE_EXPORT void requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx">     WEBCORE_EXPORT void setVideoLayerFrame(FloatRect) override;
</span><span class="cx">     WEBCORE_EXPORT void setVideoLayerGravity(VideoGravity) override;
</span><del>-    WEBCORE_EXPORT void selectAudioMediaOption(uint64_t index) override;
-    WEBCORE_EXPORT void selectLegibleMediaOption(uint64_t index) override;
</del><span class="cx">     WEBCORE_EXPORT void fullscreenModeChanged(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx">     WEBCORE_EXPORT bool isVisible() const override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -135,56 +135,6 @@
</span><span class="cx">         m_videoElement-&gt;setVideoFullscreenLayer(m_videoFullscreenLayer.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenModelVideoElement::play()
-{
-    m_playbackSessionModel-&gt;play();
-}
-
-void WebVideoFullscreenModelVideoElement::pause()
-{
-    m_playbackSessionModel-&gt;pause();
-}
-
-void WebVideoFullscreenModelVideoElement::togglePlayState()
-{
-    m_playbackSessionModel-&gt;togglePlayState();
-}
-
-void WebVideoFullscreenModelVideoElement::beginScrubbing()
-{
-    m_playbackSessionModel-&gt;beginScrubbing();
-}
-
-void WebVideoFullscreenModelVideoElement::endScrubbing()
-{
-    m_playbackSessionModel-&gt;endScrubbing();
-}
-
-void WebVideoFullscreenModelVideoElement::seekToTime(double time)
-{
-    m_playbackSessionModel-&gt;seekToTime(time);
-}
-
-void WebVideoFullscreenModelVideoElement::fastSeek(double time)
-{
-    m_playbackSessionModel-&gt;fastSeek(time);
-}
-
-void WebVideoFullscreenModelVideoElement::beginScanningForward()
-{
-    m_playbackSessionModel-&gt;beginScanningForward();
-}
-
-void WebVideoFullscreenModelVideoElement::beginScanningBackward()
-{
-    m_playbackSessionModel-&gt;beginScanningBackward();
-}
-
-void WebVideoFullscreenModelVideoElement::endScanning()
-{
-    m_playbackSessionModel-&gt;endScanning();
-}
-
</del><span class="cx"> void WebVideoFullscreenModelVideoElement::requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx">     if (m_videoElement &amp;&amp; m_videoElement-&gt;fullscreenMode() != mode)
</span><span class="lines">@@ -214,16 +164,6 @@
</span><span class="cx">     m_videoElement-&gt;setVideoFullscreenGravity(videoGravity);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenModelVideoElement::selectAudioMediaOption(uint64_t selectedAudioIndex)
-{
-    m_playbackSessionModel-&gt;selectAudioMediaOption(selectedAudioIndex);
-}
-
-void WebVideoFullscreenModelVideoElement::selectLegibleMediaOption(uint64_t index)
-{
-    m_playbackSessionModel-&gt;selectLegibleMediaOption(index);
-}
-
</del><span class="cx"> const Vector&lt;AtomicString&gt;&amp; WebVideoFullscreenModelVideoElement::observedEventNames()
</span><span class="cx"> {
</span><span class="cx">     static NeverDestroyed&lt;Vector&lt;AtomicString&gt;&gt; sEventNames;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebPlaybackSessionInterfaceAVKith"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -72,6 +72,7 @@
</span><span class="cx">     }
</span><span class="cx">     virtual ~WebPlaybackSessionInterfaceAVKit();
</span><span class="cx">     WEBCORE_EXPORT void setWebPlaybackSessionModel(WebPlaybackSessionModel*);
</span><ins>+    WebPlaybackSessionModel* webPlaybackSessionModel() const { return m_playbackSessionModel; }
</ins><span class="cx">     void setClient(WebPlaybackSessionInterfaceAVKitClient* client) { m_client = client; }
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void resetMediaState() override;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenControllerAVKitmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -136,21 +136,9 @@
</span><span class="cx">     void setWirelessVideoPlaybackDisabled(bool) override;
</span><span class="cx"> 
</span><span class="cx">     // WebVideoFullscreenModel
</span><del>-    void play() override;
-    void pause() override;
-    void togglePlayState() override;
-    void beginScrubbing() override;
-    void endScrubbing() override;
-    void seekToTime(double time) override;
-    void fastSeek(double time) override;
-    void beginScanningForward() override;
-    void beginScanningBackward() override;
-    void endScanning() override;
</del><span class="cx">     void requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx">     void setVideoLayerFrame(FloatRect) override;
</span><span class="cx">     void setVideoLayerGravity(WebVideoFullscreenModel::VideoGravity) override;
</span><del>-    void selectAudioMediaOption(uint64_t index) override;
-    void selectLegibleMediaOption(uint64_t index) override;
</del><span class="cx">     void fullscreenModeChanged(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx">     bool isVisible() const override;
</span><span class="cx"> 
</span><span class="lines">@@ -365,106 +353,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma mark WebVideoFullscreenModel
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenControllerContext::play()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;play();
-    });
-}
-
-void WebVideoFullscreenControllerContext::pause()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;pause();
-    });
-}
-
-void WebVideoFullscreenControllerContext::togglePlayState()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;togglePlayState();
-    });
-}
-
-void WebVideoFullscreenControllerContext::beginScrubbing()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;beginScrubbing();
-    });
-}
-
-void WebVideoFullscreenControllerContext::endScrubbing()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;endScrubbing();
-    });
-}
-
-void WebVideoFullscreenControllerContext::seekToTime(double time)
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this, time] {
-        if (m_model)
-            m_model-&gt;seekToTime(time);
-    });
-}
-
-void WebVideoFullscreenControllerContext::fastSeek(double time)
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this, time] {
-        if (m_model)
-            m_model-&gt;fastSeek(time);
-    });
-}
-
-void WebVideoFullscreenControllerContext::beginScanningForward()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;beginScanningForward();
-    });
-}
-
-void WebVideoFullscreenControllerContext::beginScanningBackward()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;beginScanningBackward();
-    });
-}
-
-void WebVideoFullscreenControllerContext::endScanning()
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this] {
-        if (m_model)
-            m_model-&gt;endScanning();
-    });
-}
-
</del><span class="cx"> void WebVideoFullscreenControllerContext::requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isUIThread());
</span><span class="lines">@@ -508,26 +396,6 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenControllerContext::selectAudioMediaOption(uint64_t index)
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this, index] {
-        if (m_model)
-            m_model-&gt;selectAudioMediaOption(index);
-    });
-}
-
-void WebVideoFullscreenControllerContext::selectLegibleMediaOption(uint64_t index)
-{
-    ASSERT(isUIThread());
-    RefPtr&lt;WebVideoFullscreenControllerContext&gt; strongThis(this);
-    WebThreadRun([strongThis, this, index] {
-        if (m_model)
-            m_model-&gt;selectLegibleMediaOption(index);
-    });
-}
-
</del><span class="cx"> void WebVideoFullscreenControllerContext::fullscreenModeChanged(HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isUIThread());
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKith"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -70,7 +70,8 @@
</span><span class="cx">     virtual ~WebVideoFullscreenInterfaceAVKit();
</span><span class="cx">     WEBCORE_EXPORT void setWebVideoFullscreenModel(WebVideoFullscreenModel*);
</span><span class="cx">     WEBCORE_EXPORT void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*);
</span><del>-    
</del><ins>+    WebPlaybackSessionModel* webPlaybackSessionModel() const { return m_playbackSessionInterface-&gt;webPlaybackSessionModel(); }
+
</ins><span class="cx">     WEBCORE_EXPORT void resetMediaState() final;
</span><span class="cx">     WEBCORE_EXPORT void setDuration(double) final;
</span><span class="cx">     WEBCORE_EXPORT void setCurrentTime(double currentTime, double anchorTime) final;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKitmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -863,8 +863,8 @@
</span><span class="cx">     [m_window setHidden:YES];
</span><span class="cx">     [[m_playerViewController view] setHidden:YES];
</span><span class="cx"> 
</span><del>-    if (m_videoFullscreenModel &amp;&amp; !m_exitRequested) {
-        m_videoFullscreenModel-&gt;pause();
</del><ins>+    if (webPlaybackSessionModel() &amp;&amp; m_videoFullscreenModel &amp;&amp; !m_exitRequested) {
+        webPlaybackSessionModel()-&gt;pause();
</ins><span class="cx">         m_videoFullscreenModel-&gt;requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenModeNone);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -1019,8 +1019,8 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (reason == ExitFullScreenReason::DoneButtonTapped || reason == ExitFullScreenReason::RemoteControlStopEventReceived)
-        m_videoFullscreenModel-&gt;pause();
</del><ins>+    if (webPlaybackSessionModel() &amp;&amp; (reason == ExitFullScreenReason::DoneButtonTapped || reason == ExitFullScreenReason::RemoteControlStopEventReceived))
+        webPlaybackSessionModel()-&gt;pause();
</ins><span class="cx">     
</span><span class="cx"> 
</span><span class="cx">     m_videoFullscreenModel-&gt;requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenModeNone);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacWebPlaybackSessionInterfaceMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -95,21 +95,25 @@
</span><span class="cx">         m_client-&gt;rateChanged(isPlaying, playbackRate);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPlaybackSessionInterfaceMac::setSeekableRanges(const TimeRanges&amp; timeRanges)
</del><ins>+static RetainPtr&lt;NSMutableArray&gt; timeRangesToArray(const TimeRanges&amp; timeRanges)
</ins><span class="cx"> {
</span><del>-    WebPlaybackControlsManager* controlsManager = playBackControlsManager();
</del><ins>+    RetainPtr&lt;NSMutableArray&gt; rangeArray = adoptNS([[NSMutableArray alloc] init]);
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;NSMutableArray&gt; seekableRanges = adoptNS([[NSMutableArray alloc] init]);
-
</del><span class="cx">     for (unsigned i = 0; i &lt; timeRanges.length(); i++) {
</span><span class="cx">         const PlatformTimeRanges&amp; ranges = timeRanges.ranges();
</span><span class="cx">         CMTimeRange range = CMTimeRangeMake(toCMTime(ranges.start(i)), toCMTime(ranges.end(i)));
</span><del>-        [seekableRanges addObject:[NSValue valueWithCMTimeRange:range]];
</del><ins>+        [rangeArray addObject:[NSValue valueWithCMTimeRange:range]];
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    [controlsManager setSeekableTimeRanges:seekableRanges.get()];
</del><ins>+    return rangeArray;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPlaybackSessionInterfaceMac::setSeekableRanges(const TimeRanges&amp; timeRanges)
+{
+    WebPlaybackControlsManager* controlsManager = playBackControlsManager();
+    [controlsManager setSeekableTimeRanges:timeRangesToArray(timeRanges).get()];
+}
+
</ins><span class="cx"> void WebPlaybackSessionInterfaceMac::setAudioMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; options, uint64_t selectedIndex)
</span><span class="cx"> {
</span><span class="cx">     WebPlaybackControlsManager* controlsManager = playBackControlsManager();
</span><span class="lines">@@ -143,6 +147,20 @@
</span><span class="cx"> void WebPlaybackSessionInterfaceMac::setPlayBackControlsManager(WebPlaybackControlsManager *manager)
</span><span class="cx"> {
</span><span class="cx">     m_playbackControlsManager = manager;
</span><ins>+
+    if (!manager || !m_playbackSessionModel)
+        return;
+
+    NSTimeInterval anchorTimeStamp = ![manager rate] ? NAN : [[NSProcessInfo processInfo] systemUptime];
+    manager.timing = [getAVValueTimingClass() valueTimingWithAnchorValue:m_playbackSessionModel-&gt;currentTime() anchorTimeStamp:anchorTimeStamp rate:0];
+    double duration = m_playbackSessionModel-&gt;duration();
+    manager.contentDuration = duration;
+    manager.hasEnabledAudio = duration &gt; 0;
+    manager.hasEnabledVideo = duration &gt; 0;
+    manager.rate = m_playbackSessionModel-&gt;isPlaying() ? m_playbackSessionModel-&gt;playbackRate() : 0.;
+    manager.seekableTimeRanges = timeRangesToArray(m_playbackSessionModel-&gt;seekableRanges()).get();
+    [manager setAudioMediaSelectionOptions:m_playbackSessionModel-&gt;audioMediaSelectionOptions() withSelectedIndex:static_cast&lt;NSUInteger&gt;(m_playbackSessionModel-&gt;audioMediaSelectedIndex())];
+    [manager setLegibleMediaSelectionOptions:m_playbackSessionModel-&gt;legibleMediaSelectionOptions() withSelectedIndex:static_cast&lt;NSUInteger&gt;(m_playbackSessionModel-&gt;legibleMediaSelectedIndex())];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacWebVideoFullscreenInterfaceMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -59,6 +59,7 @@
</span><span class="cx">     }
</span><span class="cx">     virtual ~WebVideoFullscreenInterfaceMac();
</span><span class="cx">     WebVideoFullscreenModel* webVideoFullscreenModel() const { return m_videoFullscreenModel; }
</span><ins>+    WebPlaybackSessionModel* webPlaybackSessionModel() const { return m_playbackSessionInterface-&gt;webPlaybackSessionModel(); }
</ins><span class="cx">     WEBCORE_EXPORT void setWebVideoFullscreenModel(WebVideoFullscreenModel*);
</span><span class="cx">     WebVideoFullscreenChangeObserver* webVideoFullscreenChangeObserver() const { return m_fullscreenChangeObserver; }
</span><span class="cx">     WEBCORE_EXPORT void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*);
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebKit2/ChangeLog        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2016-05-05  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        [WK2] Media controls don't update if controller is created after the interface is created
+        https://bugs.webkit.org/show_bug.cgi?id=157376
+
+        Reviewed by Beth Dakin.
+
+        Implement the new getter methods on WebPlaybackSessionModelContext by caching the values
+        passed through WebPlaybackSessionManagerProxy.
+
+        * UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h:
+        * UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm:
+        (WebKit::WebPlaybackSessionManagerProxy::setCurrentTime):
+        (WebKit::WebPlaybackSessionManagerProxy::setBufferedTime):
+        (WebKit::WebPlaybackSessionManagerProxy::setSeekableRangesVector):
+        (WebKit::WebPlaybackSessionManagerProxy::setCanPlayFastReverse):
+        (WebKit::WebPlaybackSessionManagerProxy::setAudioMediaSelectionOptions):
+        (WebKit::WebPlaybackSessionManagerProxy::setLegibleMediaSelectionOptions):
+        (WebKit::WebPlaybackSessionManagerProxy::setExternalPlaybackProperties):
+        (WebKit::WebPlaybackSessionManagerProxy::setWirelessVideoPlaybackDisabled):
+        (WebKit::WebPlaybackSessionManagerProxy::setDuration):
+        (WebKit::WebPlaybackSessionManagerProxy::setRate):
+        * UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h:
+        * UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm:
+        (WebKit::WebVideoFullscreenModelContext::requestFullscreenMode): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::setVideoLayerFrame): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::setVideoLayerGravity): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::fullscreenModeChanged): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::isVisible): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::didSetupFullscreen): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::didEnterFullscreen): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::didExitFullscreen): Deleted.
+        (WebKit::WebVideoFullscreenModelContext::didCleanupFullscreen): Deleted.
+        (WebKit::WebVideoFullscreenManagerProxy::WebVideoFullscreenManagerProxy): Deleted.
+        (WebKit::WebVideoFullscreenManagerProxy::~WebVideoFullscreenManagerProxy): Deleted.
+
</ins><span class="cx"> 2016-05-05  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Shadow DOM should not be experimental
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;MessageReceiver.h&quot;
</span><span class="cx"> #include &lt;WebCore/GraphicsLayer.h&gt;
</span><span class="cx"> #include &lt;WebCore/PlatformView.h&gt;
</span><ins>+#include &lt;WebCore/TimeRanges.h&gt;
</ins><span class="cx"> #include &lt;WebCore/WebPlaybackSessionModel.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="lines">@@ -63,6 +64,20 @@
</span><span class="cx"> 
</span><span class="cx">     void invalidate() { m_manager = nullptr; }
</span><span class="cx"> 
</span><ins>+    void setDuration(double duration) { m_duration = duration; }
+    void setCurrentTime(double currentTime) { m_currentTime = currentTime; }
+    void setBufferedTime(double bufferedTime) { m_bufferedTime = bufferedTime; }
+    void setIsPlaying(bool isPlaying) { m_isPlaying = isPlaying; }
+    void setPlaybackRate(float playbackRate) { m_playbackRate = playbackRate; }
+    void setSeekableRanges(WebCore::TimeRanges&amp; seekableRanges) { m_seekableRanges = seekableRanges; }
+    void setCanPlayFastReverse(bool canPlayFastReverse) { m_canPlayFastReverse = canPlayFastReverse; }
+    void setAudioMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; audioMediaSelectionOptions) { m_audioMediaSelectionOptions = audioMediaSelectionOptions; }
+    void setAudioMediaSelectedIndex(uint64_t audioMediaSelectedIndex) { m_audioMediaSelectedIndex = audioMediaSelectedIndex; }
+    void setLegibleMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; legibleMediaSelectionOptions) { m_legibleMediaSelectionOptions = legibleMediaSelectionOptions; }
+    void setLegibleMediaSelectedIndex(uint64_t legibleMediaSelectedIndex) { m_legibleMediaSelectedIndex = legibleMediaSelectedIndex; }
+    void setExternalPlaybackEnabled(bool externalPlaybackEnabled) { m_externalPlaybackEnabled = externalPlaybackEnabled; }
+    void setWirelessVideoPlaybackDisabled(bool wirelessVideoPlaybackDisabled) { m_wirelessVideoPlaybackDisabled = wirelessVideoPlaybackDisabled; }
+
</ins><span class="cx"> private:
</span><span class="cx">     friend class WebVideoFullscreenModelContext;
</span><span class="cx"> 
</span><span class="lines">@@ -86,8 +101,35 @@
</span><span class="cx">     void selectAudioMediaOption(uint64_t) final;
</span><span class="cx">     void selectLegibleMediaOption(uint64_t) final;
</span><span class="cx"> 
</span><ins>+    double duration() const final { return m_duration; }
+    double currentTime() const final { return m_currentTime; }
+    double bufferedTime() const final { return m_bufferedTime; }
+    bool isPlaying() const final { return m_isPlaying; }
+    float playbackRate() const final { return m_playbackRate; }
+    Ref&lt;WebCore::TimeRanges&gt; seekableRanges() const final { return m_seekableRanges.copyRef(); }
+    bool canPlayFastReverse() const final { return m_canPlayFastReverse; }
+    Vector&lt;WTF::String&gt; audioMediaSelectionOptions() const final { return m_audioMediaSelectionOptions; }
+    uint64_t audioMediaSelectedIndex() const final { return m_audioMediaSelectedIndex; }
+    Vector&lt;WTF::String&gt; legibleMediaSelectionOptions() const final { return m_legibleMediaSelectionOptions; }
+    uint64_t legibleMediaSelectedIndex() const final { return m_legibleMediaSelectedIndex; }
+    bool externalPlaybackEnabled() const final { return m_externalPlaybackEnabled; }
+    bool wirelessVideoPlaybackDisabled() const final { return m_wirelessVideoPlaybackDisabled; }
+
</ins><span class="cx">     WebPlaybackSessionManagerProxy* m_manager;
</span><span class="cx">     uint64_t m_contextId;
</span><ins>+    double m_duration { 0 };
+    double m_currentTime { 0 };
+    double m_bufferedTime { 0 };
+    bool m_isPlaying { false };
+    float m_playbackRate { 0 };
+    Ref&lt;WebCore::TimeRanges&gt; m_seekableRanges { WebCore::TimeRanges::create() };
+    bool m_canPlayFastReverse { false };
+    Vector&lt;WTF::String&gt; m_audioMediaSelectionOptions;
+    uint64_t m_audioMediaSelectedIndex { 0 };
+    Vector&lt;WTF::String&gt; m_legibleMediaSelectionOptions;
+    uint64_t m_legibleMediaSelectedIndex { 0 };
+    bool m_externalPlaybackEnabled { false };
+    bool m_wirelessVideoPlaybackDisabled { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class WebPlaybackSessionManagerProxy : public RefCounted&lt;WebPlaybackSessionManagerProxy&gt;, private IPC::MessageReceiver {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #import &quot;WebPlaybackSessionManagerMessages.h&quot;
</span><span class="cx"> #import &quot;WebPlaybackSessionManagerProxyMessages.h&quot;
</span><span class="cx"> #import &quot;WebProcessProxy.h&quot;
</span><del>-#import &lt;WebCore/TimeRanges.h&gt;
</del><span class="cx"> #import &lt;WebKitSystemInterface.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -242,17 +241,25 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setCurrentTime(uint64_t contextId, double currentTime, double hostTime)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setCurrentTime(currentTime, hostTime);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setCurrentTime(currentTime);
+    interface-&gt;setCurrentTime(currentTime, hostTime);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setBufferedTime(uint64_t contextId, double bufferedTime)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setBufferedTime(bufferedTime);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setBufferedTime(bufferedTime);
+    interface-&gt;setBufferedTime(bufferedTime);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setSeekableRangesVector(uint64_t contextId, Vector&lt;std::pair&lt;double, double&gt;&gt; ranges)
</span><span class="cx"> {
</span><del>-    RefPtr&lt;TimeRanges&gt; timeRanges = TimeRanges::create();
</del><ins>+    Ref&lt;TimeRanges&gt; timeRanges = TimeRanges::create();
</ins><span class="cx">     for (const auto&amp; range : ranges) {
</span><span class="cx">         ASSERT(isfinite(range.first));
</span><span class="cx">         ASSERT(isfinite(range.second));
</span><span class="lines">@@ -260,22 +267,40 @@
</span><span class="cx">         timeRanges-&gt;add(range.first, range.second);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ensureInterface(contextId).setSeekableRanges(*timeRanges);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setSeekableRanges(timeRanges);
+    interface-&gt;setSeekableRanges(timeRanges);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setCanPlayFastReverse(uint64_t contextId, bool value)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setCanPlayFastReverse(value);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setCanPlayFastReverse(value);
+    interface-&gt;setCanPlayFastReverse(value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setAudioMediaSelectionOptions(uint64_t contextId, Vector&lt;String&gt; options, uint64_t selectedIndex)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setAudioMediaSelectionOptions(options, selectedIndex);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setAudioMediaSelectionOptions(options);
+    model-&gt;setAudioMediaSelectedIndex(selectedIndex);
+    interface-&gt;setAudioMediaSelectionOptions(options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setLegibleMediaSelectionOptions(uint64_t contextId, Vector&lt;String&gt; options, uint64_t selectedIndex)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setLegibleMediaSelectionOptions(options, selectedIndex);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setLegibleMediaSelectionOptions(options);
+    model-&gt;setLegibleMediaSelectedIndex(selectedIndex);
+    interface-&gt;setLegibleMediaSelectionOptions(options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setExternalPlaybackProperties(uint64_t contextId, bool enabled, uint32_t targetType, String localizedDeviceName)
</span><span class="lines">@@ -283,22 +308,39 @@
</span><span class="cx">     WebPlaybackSessionInterface::ExternalPlaybackTargetType type = static_cast&lt;WebPlaybackSessionInterface::ExternalPlaybackTargetType&gt;(targetType);
</span><span class="cx">     ASSERT(type == WebPlaybackSessionInterface::TargetTypeAirPlay || type == WebPlaybackSessionInterface::TargetTypeTVOut || type == WebPlaybackSessionInterface::TargetTypeNone);
</span><span class="cx"> 
</span><del>-    ensureInterface(contextId).setExternalPlayback(enabled, type, localizedDeviceName);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setExternalPlaybackEnabled(enabled);
+    interface-&gt;setExternalPlayback(enabled, type, localizedDeviceName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setWirelessVideoPlaybackDisabled(uint64_t contextId, bool disabled)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setWirelessVideoPlaybackDisabled(disabled);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setWirelessVideoPlaybackDisabled(disabled);
+    interface-&gt;setWirelessVideoPlaybackDisabled(disabled);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setDuration(uint64_t contextId, double duration)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setDuration(duration);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setDuration(duration);
+    interface-&gt;setDuration(duration);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setRate(uint64_t contextId, bool isPlaying, double rate)
</span><span class="cx"> {
</span><del>-    ensureInterface(contextId).setRate(isPlaying, rate);
</del><ins>+    RefPtr&lt;WebPlaybackSessionModelContext&gt; model;
+    RefPtr&lt;PlatformWebPlaybackSessionInterface&gt; interface;
+    std::tie(model, interface) = ensureModelAndInterface(contextId);
+    model-&gt;setIsPlaying(isPlaying);
+    model-&gt;setPlaybackRate(rate);
+    interface-&gt;setRate(isPlaying, rate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #pragma mark Messages to WebPlaybackSessionManager
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -74,21 +74,9 @@
</span><span class="cx">     WebVideoFullscreenModelContext(WebVideoFullscreenManagerProxy&amp;, WebPlaybackSessionModelContext&amp;, uint64_t);
</span><span class="cx"> 
</span><span class="cx">     // WebVideoFullscreenModel
</span><del>-    void play() override;
-    void pause() override;
-    void togglePlayState() override;
-    void beginScrubbing() override;
-    void endScrubbing() override;
-    void seekToTime(double) override;
-    void fastSeek(double time) override;
-    void beginScanningForward() override;
-    void beginScanningBackward() override;
-    void endScanning() override;
</del><span class="cx">     void requestFullscreenMode(WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx">     void setVideoLayerFrame(WebCore::FloatRect) override;
</span><span class="cx">     void setVideoLayerGravity(VideoGravity) override;
</span><del>-    void selectAudioMediaOption(uint64_t) override;
-    void selectLegibleMediaOption(uint64_t) override;
</del><span class="cx">     void fullscreenModeChanged(WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx">     bool isVisible() const override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm (200489 => 200490)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm        2016-05-05 23:11:13 UTC (rev 200489)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm        2016-05-05 23:18:20 UTC (rev 200490)
</span><span class="lines">@@ -123,56 +123,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenModelContext::play()
-{
-    m_playbackSessionModel-&gt;play();
-}
-
-void WebVideoFullscreenModelContext::pause()
-{
-    m_playbackSessionModel-&gt;pause();
-}
-
-void WebVideoFullscreenModelContext::togglePlayState()
-{
-    m_playbackSessionModel-&gt;togglePlayState();
-}
-
-void WebVideoFullscreenModelContext::beginScrubbing()
-{
-    m_playbackSessionModel-&gt;beginScrubbing();
-}
-
-void WebVideoFullscreenModelContext::endScrubbing()
-{
-    m_playbackSessionModel-&gt;endScrubbing();
-}
-
-void WebVideoFullscreenModelContext::seekToTime(double time)
-{
-    m_playbackSessionModel-&gt;seekToTime(time);
-}
-
-void WebVideoFullscreenModelContext::fastSeek(double time)
-{
-    m_playbackSessionModel-&gt;fastSeek(time);
-}
-
-void WebVideoFullscreenModelContext::beginScanningForward()
-{
-    m_playbackSessionModel-&gt;beginScanningForward();
-}
-
-void WebVideoFullscreenModelContext::beginScanningBackward()
-{
-    m_playbackSessionModel-&gt;beginScanningBackward();
-}
-
-void WebVideoFullscreenModelContext::endScanning()
-{
-    m_playbackSessionModel-&gt;endScanning();
-}
-
</del><span class="cx"> void WebVideoFullscreenModelContext::requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx">     if (m_manager)
</span><span class="lines">@@ -191,16 +141,6 @@
</span><span class="cx">         m_manager-&gt;setVideoLayerGravity(m_contextId, gravity);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenModelContext::selectAudioMediaOption(uint64_t optionId)
-{
-    m_playbackSessionModel-&gt;selectAudioMediaOption(optionId);
-}
-
-void WebVideoFullscreenModelContext::selectLegibleMediaOption(uint64_t optionId)
-{
-    m_playbackSessionModel-&gt;selectLegibleMediaOption(optionId);
-}
-
</del><span class="cx"> void WebVideoFullscreenModelContext::fullscreenModeChanged(WebCore::HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx">     if (m_manager)
</span></span></pre>
</div>
</div>

</body>
</html>