<!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>[182251] tags/Safari-601.1.25/Source/WebCore</title>
</head>
<body>

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

<h3>Log Message</h3>
<pre>Merged <a href="http://trac.webkit.org/projects/webkit/changeset/182240">r182240</a>.  rdar://problem/19130597</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#tagsSafari601125SourceWebCoreChangeLog">tags/Safari-601.1.25/Source/WebCore/ChangeLog</a></li>
<li><a href="#tagsSafari601125SourceWebCoreModulesmediacontrolsmediaControlsApplejs">tags/Safari-601.1.25/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js</a></li>
<li><a href="#tagsSafari601125SourceWebCoredomDocumentcpp">tags/Safari-601.1.25/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCorehtmlHTMLMediaElementcpp">tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCorehtmlHTMLMediaElementh">tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#tagsSafari601125SourceWebCorehtmlHTMLMediaElementidl">tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.idl</a></li>
<li><a href="#tagsSafari601125SourceWebCorehtmlHTMLMediaSessioncpp">tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCorehtmlHTMLMediaSessionh">tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.h</a></li>
<li><a href="#tagsSafari601125SourceWebCorepagePagecpp">tags/Safari-601.1.25/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCorepagePageh">tags/Safari-601.1.25/Source/WebCore/page/Page.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformaudioMediaSessioncpp">tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformaudioMediaSessionh">tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformaudioMediaSessionManagercpp">tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformaudioMediaSessionManagerh">tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsMediaPlaybackTargeth">tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTarget.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsMediaPlaybackTargetPickerClienth">tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTargetPickerClient.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsMediaPlayercpp">tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsMediaPlayerh">tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsMediaPlayerPrivateh">tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayerPrivate.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsavfoundationMediaPlaybackTargetMacmm">tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlaybackTargetMac.mm</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp">tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh">tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCh">tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCmm">tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKith">tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h</a></li>
<li><a href="#tagsSafari601125SourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKitmm">tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="tagsSafari601125SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/ChangeLog (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/ChangeLog        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/ChangeLog        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -1,3 +1,129 @@
</span><ins>+2015-04-01  Babak Shafiei  &lt;bshafiei@apple.com&gt;
+
+        Merge r182240.
+
+    2015-04-01  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+            [Mac] Do not include route button if element does not support target playback
+            https://bugs.webkit.org/show_bug.cgi?id=143251
+
+            Reviewed by Jer Noble.
+
+            * Modules/mediacontrols/mediaControlsApple.js:
+            (Controller.prototype.currentPlaybackTargetIsWireless): Return false if target playback is disabled.
+            (Controller.prototype.updateWirelessTargetAvailable): Do not show the picker if target 
+                playback is disabled.
+            (Controller.prototype.handleWirelessPlaybackChange): Call updateWirelessTargetAvailable.
+
+            * dom/Document.cpp:
+            (WebCore::Document::showPlaybackTargetPicker): Update for Page::showPlaybackTargetPicker change.
+            (WebCore::Document::didChoosePlaybackTarget): Notify clients in vector-order, lower level code
+                now tracks which one requested the picker.
+
+            * html/HTMLMediaElement.cpp:
+            (WebCore::HTMLMediaElement::loadResource): Don't call applyMediaPlayerRestrictions, it is done
+                in mediaPlayerEngineFailedToLoad.
+            (WebCore::HTMLMediaElement::setReadyState): Enqueue a target availability event if there are
+                listeners readyState reaches HAVE_METADATA so controls are setup correctly.
+            (WebCore::HTMLMediaElement::mediaPlayerEngineFailedToLoad): Call applyMediaPlayerRestrictions.
+            (WebCore::HTMLMediaElement::clearMediaPlayer): Enqueue a target availability event in so controls
+                have a chance to hide the picker.
+            (WebCore::HTMLMediaElement::webkitCurrentPlaybackTargetIsSupported): New, passthrough to the
+                media engine.
+            (WebCore::HTMLMediaElement::canPlayToWirelessPlaybackTarget): Ditto.
+            (WebCore::HTMLMediaElement::startPlayingToPlaybackTarget): Ditto.
+            (WebCore::HTMLMediaElement::stopPlayingToPlaybackTarget): Ditto.
+            * html/HTMLMediaElement.h:
+            * html/HTMLMediaElement.idl:
+
+            * html/HTMLMediaSession.cpp:
+            (WebCore::HTMLMediaSession::HTMLMediaSession): Initialize m_playbackTarget.
+            (WebCore::HTMLMediaSession::currentPlaybackTargetIsSupported): New.
+            (WebCore::HTMLMediaSession::showPlaybackTargetPicker): Pull logic from showingPlaybackTargetPickerPermitted 
+                inline. Don't refuse to show a picker if the element doesn't support target playback, it is up
+                to script to decide which elements can display a picker.
+            (WebCore::HTMLMediaSession::wirelessVideoPlaybackDisabled): Return true if there is no player.
+            (WebCore::HTMLMediaSession::didChoosePlaybackTarget): Call startPlayingToPlaybackTarget or 
+                stopPlayingToPlaybackTarget because setWirelessPlaybackTarget doesn't apply the target.
+            (WebCore::HTMLMediaSession::externalOutputDeviceAvailableDidChange): Add logging.
+            (WebCore::HTMLMediaSession::showingPlaybackTargetPickerPermitted): Deleted.
+            * html/HTMLMediaSession.h:
+
+            * page/Page.cpp:
+            (WebCore::Page::Page): Initialize m_playbackTarget.
+            (WebCore::Page::showPlaybackTargetPicker): Don't set m_documentRequestingPlaybackTargetPicker.
+            (WebCore::Page::didChoosePlaybackTarget): Notify Pages in vector-order, lower level code
+                now tracks which one requested the picker.
+            (WebCore::Page::configurePlaybackTargetMonitoring): Don't track m_requiresPlaybackTargetMonitoring, it
+                is too easy for it to get out of sync with the UI process state.
+            * page/Page.h:
+
+            * platform/audio/MediaSession.cpp:
+            (WebCore::MediaSession::canPlayToWirelessPlaybackTarget): New, client passthrough.
+            (WebCore::MediaSession::startPlayingToPlaybackTarget): Ditto.
+            (WebCore::MediaSession::stopPlayingToPlaybackTarget): Ditto.
+            * platform/audio/MediaSession.h:
+            (WebCore::MediaSessionClient::canPlayToWirelessPlaybackTarget):
+            (WebCore::MediaSessionClient::startPlayingToPlaybackTarget):
+            (WebCore::MediaSessionClient::stopPlayingToPlaybackTarget):
+
+            * platform/audio/MediaSessionManager.cpp:
+            (WebCore::MediaSessionManager::sessionWillBeginPlayback): Call startPlayingToPlaybackTarget &amp;
+                stopPlayingToPlaybackTarget as necessary.
+            * platform/audio/MediaSessionManager.h:
+
+            * platform/graphics/MediaPlaybackTarget.h:
+            (WebCore::MediaPlaybackTarget::hasActiveRoute): New.
+            * platform/graphics/MediaPlaybackTargetPickerClient.h:
+            * platform/graphics/MediaPlayer.cpp:
+            (WebCore::MediaPlayer::isCurrentPlaybackTargetSupported): New, engine passthrough.
+            (WebCore::MediaPlayer::canPlayToWirelessPlaybackTarget): Ditto.
+            (WebCore::MediaPlayer::startPlayingToPlaybackTarget): Ditto.
+            (WebCore::MediaPlayer::stopPlayingToPlaybackTarget): Ditto.
+            * platform/graphics/MediaPlayer.h:
+            * platform/graphics/MediaPlayerPrivate.h:
+            (WebCore::MediaPlayerPrivateInterface::isCurrentPlaybackTargetSupported):
+            (WebCore::MediaPlayerPrivateInterface::wirelessVideoPlaybackDisabled):
+            (WebCore::MediaPlayerPrivateInterface::canPlayToWirelessPlaybackTarget):
+            (WebCore::MediaPlayerPrivateInterface::startPlayingToPlaybackTarget):
+            (WebCore::MediaPlayerPrivateInterface::stopPlayingToPlaybackTarget):
+
+            * platform/graphics/avfoundation/MediaPlaybackTargetMac.mm:
+            (WebCore::MediaPlaybackTarget::hasActiveRoute): New.
+
+            * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::canPlayToWirelessPlaybackTarget):
+            * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Use playerKVOProperties. Drive-by
+                code cleanup.
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer): Use playerKVOProperties.
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName): Implement for Mac.
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessVideoPlaybackDisabled): Delay callbacks
+                while setting AVPlayer property.
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget): Add logging. Don't set
+                the AVPlayer outputContext immediately.
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::startPlayingToPlaybackTarget): New.
+            (WebCore::MediaPlayerPrivateAVFoundationObjC::stopPlayingToPlaybackTarget): New.
+            (WebCore::playerKVOProperties): New.
+            (-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]): Notify when
+                allowsExternalPlayback changes.
+
+            * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h:
+            * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
+            (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::isCurrentPlaybackTargetSupported): New.
+            (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::setWirelessPlaybackTarget): Ditto.
+            (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::togglePlayingToPlaybackTarget): Ditto.
+            (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::startPlayingToPlaybackTarget): Ditto.
+            (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::stopPlayingToPlaybackTarget): Ditto.
+
+            * platform/graphics/mac/MediaPlayerPrivateQTKit.h:
+            * platform/graphics/mac/MediaPlayerPrivateQTKit.mm:
+            (WebCore::MediaPlayerPrivateQTKit::isCurrentPlaybackTargetSupported): Ditto.
+            (WebCore::MediaPlayerPrivateQTKit::setWirelessPlaybackTarget): Ditto.
+            (WebCore::MediaPlayerPrivateQTKit::togglePlayingToPlaybackTarget): Ditto.
+            (WebCore::MediaPlayerPrivateQTKit::startPlayingToPlaybackTarget): Ditto.
+            (WebCore::MediaPlayerPrivateQTKit::stopPlayingToPlaybackTarget): Ditto.
+
</ins><span class="cx"> 2015-03-31  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make it possible to compute a region for elements on the page that have wheel event handlers
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreModulesmediacontrolsmediaControlsApplejs"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -1695,7 +1695,13 @@
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     currentPlaybackTargetIsWireless: function() {
</span><del>-        return Controller.gSimulateWirelessPlaybackTarget || (('webkitCurrentPlaybackTargetIsWireless' in this.video) &amp;&amp; this.video.webkitCurrentPlaybackTargetIsWireless);
</del><ins>+        if (Controller.gSimulateWirelessPlaybackTarget)
+            return true;
+
+        if (!this.video.webkitCurrentPlaybackTargetIsWireless || this.video.webkitWirelessVideoPlaybackDisabled)
+            return false;
+
+        return true;
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     updateShouldListenForPlaybackTargetAvailabilityEvent: function() {
</span><span class="lines">@@ -1740,7 +1746,11 @@
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     updateWirelessTargetAvailable: function() {
</span><del>-        if (Controller.gSimulateWirelessPlaybackTarget || this.hasWirelessPlaybackTargets)
</del><ins>+        var wirelessPlaybackTargetsAvailable = Controller.gSimulateWirelessPlaybackTarget || this.hasWirelessPlaybackTargets;
+        if (this.video.webkitWirelessVideoPlaybackDisabled)
+            wirelessPlaybackTargetsAvailable = false;
+
+        if (wirelessPlaybackTargetsAvailable)
</ins><span class="cx">             this.controls.wirelessTargetPicker.classList.remove(this.ClassNames.hidden);
</span><span class="cx">         else
</span><span class="cx">             this.controls.wirelessTargetPicker.classList.add(this.ClassNames.hidden);
</span><span class="lines">@@ -1753,6 +1763,7 @@
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     handleWirelessPlaybackChange: function(event) {
</span><ins>+        this.updateWirelessTargetAvailable();
</ins><span class="cx">         this.updateWirelessPlaybackStatus();
</span><span class="cx">         this.setNeedsTimelineMetricsUpdate();
</span><span class="cx">     },
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/dom/Document.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/dom/Document.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/dom/Document.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -6550,7 +6550,7 @@
</span><span class="cx">     if (!page)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    page-&gt;showPlaybackTargetPicker(this, view()-&gt;lastKnownMousePosition(), is&lt;HTMLVideoElement&gt;(element));
</del><ins>+    page-&gt;showPlaybackTargetPicker(view()-&gt;lastKnownMousePosition(), is&lt;HTMLVideoElement&gt;(element));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Document::addPlaybackTargetPickerClient(MediaPlaybackTargetPickerClient&amp; client)
</span><span class="lines">@@ -6604,22 +6604,8 @@
</span><span class="cx"> 
</span><span class="cx"> void Document::didChoosePlaybackTarget(const MediaPlaybackTarget&amp; device)
</span><span class="cx"> {
</span><del>-    MediaPlaybackTargetPickerClient* clientThatRequestedPicker = nullptr;
-
-    for (auto* client : m_playbackTargetClients) {
-        if (client-&gt;requestedPlaybackTargetPicker()) {
-            clientThatRequestedPicker = client;
-            continue;
-        }
-
</del><ins>+    for (auto* client : m_playbackTargetClients)
</ins><span class="cx">         client-&gt;didChoosePlaybackTarget(device);
</span><del>-    }
-
-    // Notify the client that requested the chooser last because if more than one
-    // is playing, only the last one to set the context will actually get to play
-    //  to the external device.
-    if (clientThatRequestedPicker)
-        clientThatRequestedPicker-&gt;didChoosePlaybackTarget(device);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -1179,8 +1179,6 @@
</span><span class="cx">     if (!m_player-&gt;load(url, contentType, keySystem))
</span><span class="cx">         mediaLoadingFailed(MediaPlayer::FormatError);
</span><span class="cx"> 
</span><del>-    m_mediaSession-&gt;applyMediaPlayerRestrictions(*this);
-
</del><span class="cx">     // If there is no poster to display, allow the media engine to render video frames as soon as
</span><span class="cx">     // they are available.
</span><span class="cx">     updateDisplayState();
</span><span class="lines">@@ -1987,6 +1985,11 @@
</span><span class="cx">         prepareMediaFragmentURI();
</span><span class="cx">         scheduleEvent(eventNames().durationchangeEvent);
</span><span class="cx">         scheduleEvent(eventNames().loadedmetadataEvent);
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+        if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent))
+            enqueuePlaybackTargetAvailabilityChangedEvent();
+#endif
+        
</ins><span class="cx">         if (hasMediaControls())
</span><span class="cx">             mediaControls()-&gt;loadedMetadata();
</span><span class="cx">         if (renderer())
</span><span class="lines">@@ -4268,6 +4271,8 @@
</span><span class="cx"> 
</span><span class="cx">     m_havePreparedToPlay = false;
</span><span class="cx"> 
</span><ins>+    m_mediaSession-&gt;applyMediaPlayerRestrictions(*this);
+
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     if (!m_player)
</span><span class="cx">         return;
</span><span class="lines">@@ -4654,8 +4659,13 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-    if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent))
</del><ins>+    if (hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent)) {
</ins><span class="cx">         m_mediaSession-&gt;setHasPlaybackTargetAvailabilityListeners(*this, false);
</span><ins>+
+        // Send an availability event in case scripts want to hide the picker when the element
+        // doesn't support playback to a target.
+        enqueuePlaybackTargetAvailabilityChangedEvent();
+    }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     m_player = nullptr;
</span><span class="lines">@@ -4810,6 +4820,11 @@
</span><span class="cx">     return m_mediaSession-&gt;currentPlaybackTargetIsWireless(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool HTMLMediaElement::webkitCurrentPlaybackTargetIsSupported() const
+{
+    return m_mediaSession-&gt;currentPlaybackTargetIsSupported(*this);
+}
+
</ins><span class="cx"> void HTMLMediaElement::wirelessRoutesAvailableDidChange()
</span><span class="cx"> {
</span><span class="cx">     enqueuePlaybackTargetAvailabilityChangedEvent();
</span><span class="lines">@@ -4869,6 +4884,27 @@
</span><span class="cx">     if (m_player)
</span><span class="cx">         m_player-&gt;setWirelessPlaybackTarget(device);
</span><span class="cx"> }
</span><ins>+
+bool HTMLMediaElement::canPlayToWirelessPlaybackTarget()
+{
+    bool canPlay = m_player &amp;&amp; m_player-&gt;canPlayToWirelessPlaybackTarget();
+
+    LOG(Media, &quot;HTMLMediaElement::canPlayToWirelessPlaybackTarget(%p) - returning %s&quot;, this, boolString(canPlay));
+
+    return canPlay;
+}
+
+void HTMLMediaElement::startPlayingToPlaybackTarget()
+{
+    if (m_player)
+        m_player-&gt;startPlayingToPlaybackTarget();
+}
+
+void HTMLMediaElement::stopPlayingToPlaybackTarget()
+{
+    if (m_player)
+        m_player-&gt;stopPlayingToPlaybackTarget();
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> double HTMLMediaElement::minFastReverseRate() const
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -354,12 +354,16 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     void webkitShowPlaybackTargetPicker();
</span><span class="cx">     bool webkitCurrentPlaybackTargetIsWireless() const;
</span><ins>+    bool webkitCurrentPlaybackTargetIsSupported() const;
</ins><span class="cx"> 
</span><span class="cx">     virtual bool addEventListener(const AtomicString&amp; eventType, PassRefPtr&lt;EventListener&gt;, bool useCapture) override;
</span><span class="cx">     virtual bool removeEventListener(const AtomicString&amp; eventType, EventListener*, bool useCapture) override;
</span><span class="cx"> 
</span><span class="cx">     virtual void wirelessRoutesAvailableDidChange() override;
</span><ins>+    virtual bool canPlayToWirelessPlaybackTarget() override;
</ins><span class="cx">     virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;) override;
</span><ins>+    virtual void startPlayingToPlaybackTarget() override;
+    virtual void stopPlayingToPlaybackTarget() override;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     // EventTarget function.
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorehtmlHTMLMediaElementidl"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.idl (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.idl        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaElement.idl        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -116,4 +116,5 @@
</span><span class="cx"> 
</span><span class="cx">     [Conditional=WIRELESS_PLAYBACK_TARGET] void webkitShowPlaybackTargetPicker();
</span><span class="cx">     [Conditional=WIRELESS_PLAYBACK_TARGET] readonly attribute boolean webkitCurrentPlaybackTargetIsWireless;
</span><ins>+    [Conditional=WIRELESS_PLAYBACK_TARGET] readonly attribute boolean webkitCurrentPlaybackTargetIsSupported;
</ins><span class="cx"> };
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorehtmlHTMLMediaSessioncpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -76,6 +76,7 @@
</span><span class="cx">     , m_restrictions(NoRestrictions)
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     , m_targetAvailabilityChangedTimer(*this, &amp;HTMLMediaSession::targetAvailabilityChangedTimerFired)
</span><ins>+    , m_playbackTarget(std::make_unique&lt;MediaPlaybackTarget&gt;())
</ins><span class="cx"> #endif
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -163,43 +164,49 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-bool HTMLMediaSession::showingPlaybackTargetPickerPermitted(const HTMLMediaElement&amp; element) const
</del><ins>+bool HTMLMediaSession::currentPlaybackTargetIsWireless(const HTMLMediaElement&amp; element) const
</ins><span class="cx"> {
</span><del>-    if (m_restrictions &amp; RequireUserGestureToShowPlaybackTargetPicker &amp;&amp; !ScriptController::processingUserGesture()) {
-        LOG(Media, &quot;HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE because of permissions&quot;);
</del><ins>+    MediaPlayer* player = element.player();
+    if (!player) {
+        LOG(Media, &quot;HTMLMediaSession::currentPlaybackTargetIsWireless - returning FALSE because player is NULL&quot;);
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!element.document().page()) {
-        LOG(Media, &quot;HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE because page is NULL&quot;);
-        return false;
-    }
</del><ins>+    bool isWireless = player-&gt;isCurrentPlaybackTargetWireless();
+    LOG(Media, &quot;HTMLMediaSession::currentPlaybackTargetIsWireless - returning %s&quot;, isWireless ? &quot;TRUE&quot; : &quot;FALSE&quot;);
</ins><span class="cx"> 
</span><del>-    return !wirelessVideoPlaybackDisabled(element);
</del><ins>+    return isWireless;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool HTMLMediaSession::currentPlaybackTargetIsWireless(const HTMLMediaElement&amp; element) const
</del><ins>+bool HTMLMediaSession::currentPlaybackTargetIsSupported(const HTMLMediaElement&amp; element) const
</ins><span class="cx"> {
</span><span class="cx">     MediaPlayer* player = element.player();
</span><span class="cx">     if (!player) {
</span><del>-        LOG(Media, &quot;HTMLMediaSession::currentPlaybackTargetIsWireless - returning FALSE because player is NULL&quot;);
</del><ins>+        LOG(Media, &quot;HTMLMediaSession::currentPlaybackTargetIsSupported - returning FALSE because player is NULL&quot;);
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool isWireless = player-&gt;isCurrentPlaybackTargetWireless();
-    LOG(Media, &quot;HTMLMediaSession::currentPlaybackTargetIsWireless - returning %s&quot;, isWireless ? &quot;TRUE&quot; : &quot;FALSE&quot;);
-
-    return isWireless;
</del><ins>+    bool isSupported = player-&gt;isCurrentPlaybackTargetSupported();
+    LOG(Media, &quot;HTMLMediaSession::currentPlaybackTargetIsSupported - returning %s&quot;, isSupported ? &quot;TRUE&quot; : &quot;FALSE&quot;);
+    
+    return isSupported;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaSession::showPlaybackTargetPicker(const HTMLMediaElement&amp; element)
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;HTMLMediaSession::showPlaybackTargetPicker&quot;);
</span><span class="cx"> 
</span><del>-    if (!showingPlaybackTargetPickerPermitted(element))
</del><ins>+    if (m_restrictions &amp; RequireUserGestureToShowPlaybackTargetPicker &amp;&amp; !ScriptController::processingUserGesture()) {
+        LOG(Media, &quot;HTMLMediaSession::showPlaybackTargetPicker - returning early because of permissions&quot;);
</ins><span class="cx">         return;
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-    m_haveRequestedPlaybackTargetPicker = true;
</del><ins>+    if (!element.document().page()) {
+        LOG(Media, &quot;HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning early because page is NULL&quot;);
+        return;
+    }
+
+    MediaSessionManager::sharedManager().setCurrentSession(*this);
</ins><span class="cx">     element.document().showPlaybackTargetPicker(element);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -238,7 +245,7 @@
</span><span class="cx"> 
</span><span class="cx">     MediaPlayer* player = element.player();
</span><span class="cx">     if (!player)
</span><del>-        return false;
</del><ins>+        return true;
</ins><span class="cx"> 
</span><span class="cx">     bool disabled = player-&gt;wirelessVideoPlaybackDisabled();
</span><span class="cx">     LOG(Media, &quot;HTMLMediaSession::wirelessVideoPlaybackDisabled - returning %s because media engine says so&quot;, disabled ? &quot;TRUE&quot; : &quot;FALSE&quot;);
</span><span class="lines">@@ -277,8 +284,12 @@
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaSession::didChoosePlaybackTarget(const MediaPlaybackTarget&amp; device)
</span><span class="cx"> {
</span><del>-    m_haveRequestedPlaybackTargetPicker = false;
-    client().setWirelessPlaybackTarget(device);
</del><ins>+    m_playbackTarget-&gt;setDevicePickerContext(device.devicePickerContext());
+    client().setWirelessPlaybackTarget(*m_playbackTarget.get());
+    if (device.hasActiveRoute() &amp;&amp; MediaSessionManager::sharedManager().currentSession() == this)
+        startPlayingToPlaybackTarget();
+    else
+        stopPlayingToPlaybackTarget();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaSession::targetAvailabilityChangedTimerFired()
</span><span class="lines">@@ -291,6 +302,8 @@
</span><span class="cx">     if (m_hasPlaybackTargets == hasTargets)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    LOG(Media, &quot;HTMLMediaSession::externalOutputDeviceAvailableDidChange - hasTargets %s&quot;, hasTargets ? &quot;TRUE&quot; : &quot;FALSE&quot;);
+
</ins><span class="cx">     m_hasPlaybackTargets = hasTargets;
</span><span class="cx">     if (!m_targetAvailabilityChangedTimer.isActive())
</span><span class="cx">         m_targetAvailabilityChangedTimer.startOneShot(0);
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorehtmlHTMLMediaSessionh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/html/HTMLMediaSession.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -54,8 +54,8 @@
</span><span class="cx">     bool pageAllowsPlaybackAfterResuming(const HTMLMediaElement&amp;) const;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-    bool showingPlaybackTargetPickerPermitted(const HTMLMediaElement&amp;) const;
</del><span class="cx">     bool currentPlaybackTargetIsWireless(const HTMLMediaElement&amp;) const;
</span><ins>+    bool currentPlaybackTargetIsSupported(const HTMLMediaElement&amp;) const;
</ins><span class="cx">     void showPlaybackTargetPicker(const HTMLMediaElement&amp;);
</span><span class="cx">     bool hasWirelessPlaybackTargets(const HTMLMediaElement&amp;) const;
</span><span class="cx"> 
</span><span class="lines">@@ -102,16 +102,15 @@
</span><span class="cx">     virtual void didChoosePlaybackTarget(const MediaPlaybackTarget&amp;) override;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) const override;
</span><span class="cx">     virtual bool requiresPlaybackTargetRouteMonitoring() const override;
</span><del>-    virtual bool requestedPlaybackTargetPicker() const override { return m_haveRequestedPlaybackTargetPicker; }
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     BehaviorRestrictions m_restrictions;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     mutable Timer m_targetAvailabilityChangedTimer;
</span><ins>+    std::unique_ptr&lt;MediaPlaybackTarget&gt; m_playbackTarget;
</ins><span class="cx">     bool m_hasPlaybackTargetAvailabilityListeners { false };
</span><span class="cx">     mutable bool m_hasPlaybackTargets { false };
</span><del>-    mutable bool m_haveRequestedPlaybackTargetPicker { false };
</del><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/page/Page.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/page/Page.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/page/Page.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -212,6 +212,9 @@
</span><span class="cx">     , m_userContentController(WTF::move(pageConfiguration.userContentController))
</span><span class="cx">     , m_visitedLinkStore(*WTF::move(pageConfiguration.visitedLinkStore))
</span><span class="cx">     , m_sessionID(SessionID::defaultSessionID())
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    , m_playbackTarget(std::make_unique&lt;MediaPlaybackTarget&gt;())
+#endif
</ins><span class="cx">     , m_isClosing(false)
</span><span class="cx">     , m_isPlayingAudio(false)
</span><span class="cx"> {
</span><span class="lines">@@ -1681,10 +1684,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-void Page::showPlaybackTargetPicker(Document* document, const WebCore::IntPoint&amp; location, bool isVideo)
</del><ins>+void Page::showPlaybackTargetPicker(const WebCore::IntPoint&amp; location, bool isVideo)
</ins><span class="cx"> {
</span><del>-    m_documentRequestingPlaybackTargetPicker = document;
-
</del><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     // FIXME: refactor iOS implementation.
</span><span class="cx">     UNUSED_PARAM(location);
</span><span class="lines">@@ -1696,25 +1697,9 @@
</span><span class="cx"> 
</span><span class="cx"> void Page::didChoosePlaybackTarget(const MediaPlaybackTarget&amp; target)
</span><span class="cx"> {
</span><del>-    Document* documentThatRequestedPicker = nullptr;
-
-    m_playbackTarget = std::make_unique&lt;MediaPlaybackTarget&gt;(target.devicePickerContext());
-    for (Frame* frame = &amp;mainFrame(); frame; frame = frame-&gt;tree().traverseNext()) {
-        Document* document = frame-&gt;document();
-        if (frame-&gt;document() == m_documentRequestingPlaybackTargetPicker) {
-            documentThatRequestedPicker = document;
-            continue;
-        }
</del><ins>+    m_playbackTarget-&gt;setDevicePickerContext(target.devicePickerContext());
+    for (Frame* frame = &amp;mainFrame(); frame; frame = frame-&gt;tree().traverseNext())
</ins><span class="cx">         frame-&gt;document()-&gt;didChoosePlaybackTarget(target);
</span><del>-    }
-
-    // Notify the document that requested the chooser last because if more than one element
-    // is playing the last one to set the context will be the one that actually gets to
-    //  play to the external device.
-    if (documentThatRequestedPicker)
-        documentThatRequestedPicker-&gt;didChoosePlaybackTarget(target);
-
-    m_documentRequestingPlaybackTargetPicker = nullptr;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Page::playbackTargetAvailabilityDidChange(bool available)
</span><span class="lines">@@ -1734,10 +1719,6 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_requiresPlaybackTargetMonitoring == monitoringRequired)
-        return;
-    m_requiresPlaybackTargetMonitoring = monitoringRequired;
-
</del><span class="cx">     if (monitoringRequired)
</span><span class="cx">         chrome().client().startingMonitoringPlaybackTargets();
</span><span class="cx">     else
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/page/Page.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/page/Page.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/page/Page.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -426,7 +426,7 @@
</span><span class="cx">     WEBCORE_EXPORT void setMuted(bool);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-    void showPlaybackTargetPicker(Document*, const WebCore::IntPoint&amp;, bool);
</del><ins>+    void showPlaybackTargetPicker(const WebCore::IntPoint&amp;, bool);
</ins><span class="cx">     bool hasWirelessPlaybackTarget() const { return m_hasWirelessPlaybackTarget; }
</span><span class="cx">     MediaPlaybackTarget&amp; playbackTarget() const { return *m_playbackTarget.get(); }
</span><span class="cx">     void configurePlaybackTargetMonitoring();
</span><span class="lines">@@ -587,9 +587,7 @@
</span><span class="cx">     SessionID m_sessionID;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-    Document* m_documentRequestingPlaybackTargetPicker { nullptr };
</del><span class="cx">     std::unique_ptr&lt;MediaPlaybackTarget&gt; m_playbackTarget;
</span><del>-    bool m_requiresPlaybackTargetMonitoring { false };
</del><span class="cx">     bool m_hasWirelessPlaybackTarget { false };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformaudioMediaSessioncpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -227,6 +227,21 @@
</span><span class="cx">     return m_client.displayType();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool MediaSession::canPlayToWirelessPlaybackTarget() const
+{
+    return m_client.canPlayToWirelessPlaybackTarget();
+}
+
+void MediaSession::startPlayingToPlaybackTarget()
+{
+    client().startPlayingToPlaybackTarget();
+}
+
+void MediaSession::stopPlayingToPlaybackTarget()
+{
+    client().stopPlayingToPlaybackTarget();
+}
+
</ins><span class="cx"> String MediaSessionClient::mediaSessionTitle() const
</span><span class="cx"> {
</span><span class="cx">     return String();
</span><span class="lines">@@ -241,6 +256,5 @@
</span><span class="cx"> {
</span><span class="cx">     return MediaPlayer::invalidTime();
</span><span class="cx"> }
</span><del>-
</del><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformaudioMediaSessionh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSession.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -117,12 +117,15 @@
</span><span class="cx"> 
</span><span class="cx">     bool isHidden() const;
</span><span class="cx"> 
</span><ins>+    bool canPlayToWirelessPlaybackTarget() const;
+    void startPlayingToPlaybackTarget();
+    void stopPlayingToPlaybackTarget();
+
</ins><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     // MediaPlaybackTargetPickerClient
</span><span class="cx">     virtual void didChoosePlaybackTarget(const MediaPlaybackTarget&amp;) override { }
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) const override { }
</span><span class="cx">     virtual bool requiresPlaybackTargetRouteMonitoring() const override { return false; }
</span><del>-    virtual bool requestedPlaybackTargetPicker() const override { return false; }
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -164,10 +167,11 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool overrideBackgroundPlaybackRestriction() const = 0;
</span><span class="cx"> 
</span><del>-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
</del><span class="cx">     virtual void wirelessRoutesAvailableDidChange() { }
</span><span class="cx">     virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;) { }
</span><del>-#endif
</del><ins>+    virtual bool canPlayToWirelessPlaybackTarget() { return false; }
+    virtual void startPlayingToPlaybackTarget() { }
+    virtual void stopPlayingToPlaybackTarget() { }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     virtual ~MediaSessionClient() { }
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformaudioMediaSessionManagercpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -186,19 +186,18 @@
</span><span class="cx">     if (m_interrupted)
</span><span class="cx">         endInterruption(MediaSession::NoFlags);
</span><span class="cx"> 
</span><del>-    if (!restrictions &amp; ConcurrentPlaybackNotPermitted)
-        return true;
-
</del><ins>+    bool newSessionCanPlayToPlaybackTarget = session.canPlayToWirelessPlaybackTarget();
</ins><span class="cx">     Vector&lt;MediaSession*&gt; sessions = m_sessions;
</span><span class="cx">     for (auto* oneSession : sessions) {
</span><span class="cx">         if (oneSession == &amp;session)
</span><span class="cx">             continue;
</span><del>-        if (oneSession-&gt;mediaType() != sessionType)
-            continue;
-        if (restrictions &amp; ConcurrentPlaybackNotPermitted)
</del><ins>+        if (newSessionCanPlayToPlaybackTarget)
+            oneSession-&gt;stopPlayingToPlaybackTarget();
+        if (oneSession-&gt;mediaType() == sessionType &amp;&amp; restrictions &amp; ConcurrentPlaybackNotPermitted)
</ins><span class="cx">             oneSession-&gt;pauseSession();
</span><span class="cx">     }
</span><del>-    
</del><ins>+    session.startPlayingToPlaybackTarget();
+
</ins><span class="cx">     updateSessionState();
</span><span class="cx">     return true;
</span><span class="cx"> }
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformaudioMediaSessionManagerh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/audio/MediaSessionManager.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -85,6 +85,9 @@
</span><span class="cx">     virtual bool hasWirelessTargetsAvailable() { return false; }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void setCurrentSession(MediaSession&amp;);
+    MediaSession* currentSession();
+
</ins><span class="cx"> protected:
</span><span class="cx">     friend class MediaSession;
</span><span class="cx">     explicit MediaSessionManager();
</span><span class="lines">@@ -92,9 +95,6 @@
</span><span class="cx">     void addSession(MediaSession&amp;);
</span><span class="cx">     void removeSession(MediaSession&amp;);
</span><span class="cx"> 
</span><del>-    void setCurrentSession(MediaSession&amp;);
-    MediaSession* currentSession();
-
</del><span class="cx">     Vector&lt;MediaSession*&gt; sessions() { return m_sessions; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsMediaPlaybackTargeth"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTarget.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTarget.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTarget.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -50,6 +50,11 @@
</span><span class="cx"> 
</span><span class="cx">     void setDevicePickerContext(AVOutputContext *context) { m_devicePickerContext = context; }
</span><span class="cx">     AVOutputContext *devicePickerContext() const { return m_devicePickerContext.get(); }
</span><ins>+    bool hasActiveRoute() const;
+#else
+    void setDevicePickerContext(AVOutputContext *) { }
+    AVOutputContext *devicePickerContext() const { return nullptr; }
+    bool hasActiveRoute() const { return false; }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> protected:
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsMediaPlaybackTargetPickerClienth"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTargetPickerClient.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTargetPickerClient.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlaybackTargetPickerClient.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -42,7 +42,6 @@
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) const = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual bool requiresPlaybackTargetRouteMonitoring() const = 0;
</span><del>-    virtual bool requestedPlaybackTargetPicker() const = 0;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsMediaPlayercpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -843,6 +843,11 @@
</span><span class="cx">     return m_private-&gt;isCurrentPlaybackTargetWireless();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool MediaPlayer::isCurrentPlaybackTargetSupported() const
+{
+    return m_private-&gt;isCurrentPlaybackTargetSupported();
+}
+
</ins><span class="cx"> String MediaPlayer::wirelessPlaybackTargetName() const
</span><span class="cx"> {
</span><span class="cx">     return m_private-&gt;wirelessPlaybackTargetName();
</span><span class="lines">@@ -868,10 +873,25 @@
</span><span class="cx">     m_client.mediaPlayerCurrentPlaybackTargetIsWirelessChanged(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool MediaPlayer::canPlayToWirelessPlaybackTarget() const
+{
+    return m_private-&gt;canPlayToWirelessPlaybackTarget();
+}
+
</ins><span class="cx"> void MediaPlayer::setWirelessPlaybackTarget(const MediaPlaybackTarget&amp; device)
</span><span class="cx"> {
</span><span class="cx">     m_private-&gt;setWirelessPlaybackTarget(device);
</span><span class="cx"> }
</span><ins>+
+void MediaPlayer::startPlayingToPlaybackTarget()
+{
+    m_private-&gt;startPlayingToPlaybackTarget();
+}
+
+void MediaPlayer::stopPlayingToPlaybackTarget()
+{
+    m_private-&gt;stopPlayingToPlaybackTarget();
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> double MediaPlayer::maxFastForwardRate() const
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsMediaPlayerh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayer.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -466,6 +466,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     bool isCurrentPlaybackTargetWireless() const;
</span><ins>+    bool isCurrentPlaybackTargetSupported() const;
</ins><span class="cx"> 
</span><span class="cx">     enum WirelessPlaybackTargetType { TargetTypeNone, TargetTypeAirPlay, TargetTypeTVOut };
</span><span class="cx">     WirelessPlaybackTargetType wirelessPlaybackTargetType() const;
</span><span class="lines">@@ -478,7 +479,11 @@
</span><span class="cx">     void currentPlaybackTargetIsWirelessChanged();
</span><span class="cx">     void playbackTargetAvailabilityChanged();
</span><span class="cx"> 
</span><ins>+    bool canPlayToWirelessPlaybackTarget() const;
</ins><span class="cx">     void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;);
</span><ins>+
+    void startPlayingToPlaybackTarget();
+    void stopPlayingToPlaybackTarget();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     double minFastReverseRate() const;
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsMediaPlayerPrivateh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayerPrivate.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayerPrivate.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/MediaPlayerPrivate.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -161,14 +161,19 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     virtual bool isCurrentPlaybackTargetWireless() const { return false; }
</span><ins>+    virtual bool isCurrentPlaybackTargetSupported() const { return true; }
</ins><span class="cx"> 
</span><span class="cx">     virtual String wirelessPlaybackTargetName() const { return emptyString(); }
</span><span class="cx">     virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const { return MediaPlayer::TargetTypeNone; }
</span><span class="cx"> 
</span><del>-    virtual bool wirelessVideoPlaybackDisabled() const { return false; }
</del><ins>+    virtual bool wirelessVideoPlaybackDisabled() const { return true; }
</ins><span class="cx">     virtual void setWirelessVideoPlaybackDisabled(bool) { }
</span><span class="cx"> 
</span><ins>+    virtual bool canPlayToWirelessPlaybackTarget() const { return false; }
</ins><span class="cx">     virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;) { }
</span><ins>+
+    virtual void startPlayingToPlaybackTarget() { }
+    virtual void stopPlayingToPlaybackTarget() { }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if USE(NATIVE_FULLSCREEN_VIDEO)
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsavfoundationMediaPlaybackTargetMacmm"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlaybackTargetMac.mm (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlaybackTargetMac.mm        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlaybackTargetMac.mm        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx"> 
</span><del>-#import &lt;WebCore/MediaPlaybackTarget.h&gt;
</del><ins>+#import &lt;WebCore/AVFoundationSPI.h&gt;
</ins><span class="cx"> #import &lt;WebCore/SoftLinking.h&gt;
</span><span class="cx"> #import &lt;objc/runtime.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -63,6 +63,12 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool MediaPlaybackTarget::hasActiveRoute() const
+{
+    return m_devicePickerContext &amp;&amp; m_devicePickerContext.get().deviceName;
+}
+
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -619,7 +619,7 @@
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundation::rateChanged()
</span><span class="cx"> {
</span><del>-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
</del><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; PLATFORM(IOS)
</ins><span class="cx">     if (isCurrentPlaybackTargetWireless())
</span><span class="cx">         m_player-&gt;handlePlaybackCommand(rate() ? MediaSession::PlayCommand : MediaSession::PauseCommand);
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -276,13 +276,17 @@
</span><span class="cx">     virtual String wirelessPlaybackTargetName() const override;
</span><span class="cx">     virtual MediaPlayer::WirelessPlaybackTargetType wirelessPlaybackTargetType() const override;
</span><span class="cx">     virtual bool wirelessVideoPlaybackDisabled() const override;
</span><del>-#if !PLATFORM(IOS)
-    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;) override;
-#endif
</del><span class="cx">     virtual void setWirelessVideoPlaybackDisabled(bool) override;
</span><span class="cx">     void updateDisableExternalPlayback();
</span><ins>+    bool canPlayToWirelessPlaybackTarget() const { return true; }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
+    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;) override;
+    virtual void startPlayingToPlaybackTarget() override;
+    virtual void stopPlayingToPlaybackTarget() override;
+#endif
+
</ins><span class="cx">     virtual double maxFastForwardRate() const override { return m_cachedCanPlayFastForward ? std::numeric_limits&lt;double&gt;::infinity() : 2.0; }
</span><span class="cx">     virtual double minFastReverseRate() const override { return m_cachedCanPlayFastReverse ? -std::numeric_limits&lt;double&gt;::infinity() : 0.0; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -347,7 +347,8 @@
</span><span class="cx"> 
</span><span class="cx"> static NSArray *assetMetadataKeyNames();
</span><span class="cx"> static NSArray *itemKVOProperties();
</span><del>-static NSArray* assetTrackMetadataKeyNames();
</del><ins>+static NSArray *assetTrackMetadataKeyNames();
+static NSArray *playerKVOProperties();
</ins><span class="cx"> 
</span><span class="cx"> #if !LOG_DISABLED
</span><span class="cx"> static const char *boolString(bool val)
</span><span class="lines">@@ -545,11 +546,9 @@
</span><span class="cx">         if (m_timeObserver)
</span><span class="cx">             [m_avPlayer.get() removeTimeObserver:m_timeObserver.get()];
</span><span class="cx">         m_timeObserver = nil;
</span><del>-        [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@&quot;rate&quot;];
-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
-        [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@&quot;externalPlaybackActive&quot;];
-        [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@&quot;outputContext&quot;];
-#endif
</del><ins>+
+        for (NSString *keyName in playerKVOProperties())
+            [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:keyName];
</ins><span class="cx">         m_avPlayer = nil;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -927,28 +926,22 @@
</span><span class="cx">     setDelayCallbacks(true);
</span><span class="cx"> 
</span><span class="cx">     m_avPlayer = adoptNS([allocAVPlayerInstance() init]);
</span><del>-    [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@&quot;rate&quot; options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
-    [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@&quot;externalPlaybackActive&quot; options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
-    [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@&quot;outputContext&quot; options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
-#endif
</del><ins>+    for (NSString *keyName in playerKVOProperties())
+        [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:keyName options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
</ins><span class="cx"> 
</span><del>-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
-    updateDisableExternalPlayback();
-#endif
-
</del><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) &amp;&amp; HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
</span><span class="cx">     [m_avPlayer.get() setAppliesMediaSelectionCriteriaAutomatically:NO];
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><ins>+    updateDisableExternalPlayback();
</ins><span class="cx">     [m_avPlayer.get() setAllowsExternalPlayback:m_allowsWirelessVideoPlayback];
</span><del>-#endif
</del><span class="cx"> 
</span><del>-#if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</del><ins>+#if !PLATFORM(IOS)
</ins><span class="cx">     if (m_outputContext)
</span><span class="cx">         m_avPlayer.get().outputContext = m_outputContext.get();
</span><span class="cx"> #endif
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     if (player()-&gt;client().mediaPlayerIsVideo())
</span><span class="cx">         createAVPlayerLayer();
</span><span class="lines">@@ -2731,8 +2724,14 @@
</span><span class="cx"> {
</span><span class="cx">     if (!m_avPlayer)
</span><span class="cx">         return emptyString();
</span><del>-    
-    String wirelessTargetName = wkExernalDeviceDisplayNameForPlayer(m_avPlayer.get());
</del><ins>+
+    String wirelessTargetName;
+#if !PLATFORM(IOS)
+    if (m_outputContext)
+        wirelessTargetName = m_outputContext.get().deviceName;
+#else
+    wirelessTargetName = wkExernalDeviceDisplayNameForPlayer(m_avPlayer.get());
+#endif
</ins><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName(%p) - returning %s&quot;, this, wirelessTargetName.utf8().data());
</span><span class="cx"> 
</span><span class="cx">     return wirelessTargetName;
</span><span class="lines">@@ -2756,21 +2755,41 @@
</span><span class="cx">     if (!m_avPlayer)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    setDelayCallbacks(true);
</ins><span class="cx">     [m_avPlayer.get() setAllowsExternalPlayback:!disabled];
</span><ins>+    setDelayCallbacks(false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> void MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(const MediaPlaybackTarget&amp; target)
</span><span class="cx"> {
</span><span class="cx">     m_outputContext = target.devicePickerContext();
</span><del>-
</del><span class="cx">     LOG(Media, &quot;MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p&quot;, this, m_outputContext.get());
</span><ins>+}
</ins><span class="cx"> 
</span><ins>+void MediaPlayerPrivateAVFoundationObjC::startPlayingToPlaybackTarget()
+{
</ins><span class="cx">     if (!m_avPlayer)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if ([m_avPlayer.get().outputContext isEqual:m_outputContext.get()])
+        return;
+
+    setDelayCallbacks(true);
</ins><span class="cx">     m_avPlayer.get().outputContext = m_outputContext.get();
</span><ins>+    setDelayCallbacks(false);
</ins><span class="cx"> }
</span><ins>+
+void MediaPlayerPrivateAVFoundationObjC::stopPlayingToPlaybackTarget()
+{
+    if (!m_avPlayer)
+        return;
+
+    setDelayCallbacks(true);
+    // FIXME: uncomment the following line once rdar://20335217 has been fixed.
+    // m_avPlayer.get().outputContext = nil;
+    setDelayCallbacks(false);
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationObjC::updateDisableExternalPlayback()
</span><span class="lines">@@ -3084,6 +3103,15 @@
</span><span class="cx">     return keys;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+NSArray* playerKVOProperties()
+{
+    static NSArray* keys = [[NSArray alloc] initWithObjects:@&quot;rate&quot;,
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+                            @&quot;externalPlaybackActive&quot;, @&quot;outputContext&quot;, @&quot;allowsExternalPlayback&quot;,
+#endif
+                            nil];
+    return keys;
+}
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> @implementation WebCoreAVFMovieObserver
</span><span class="lines">@@ -3200,10 +3228,8 @@
</span><span class="cx">         if ([keyPath isEqualToString:@&quot;rate&quot;])
</span><span class="cx">             function = WTF::bind(&amp;MediaPlayerPrivateAVFoundationObjC::rateDidChange, m_callback, [newValue doubleValue]);
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>-        else if ([keyPath isEqualToString:@&quot;externalPlaybackActive&quot;])
</del><ins>+        else if ([keyPath isEqualToString:@&quot;externalPlaybackActive&quot;] || [keyPath isEqualToString:@&quot;outputContext&quot;] || [keyPath isEqualToString:@&quot;allowsExternalPlayback&quot;])
</ins><span class="cx">             function = WTF::bind(&amp;MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback);
</span><del>-        else if ([keyPath isEqualToString:@&quot;outputContext&quot;])
-            function = WTF::bind(&amp;MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback);
</del><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCh"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -171,6 +171,14 @@
</span><span class="cx">     virtual unsigned long corruptedVideoFrames() override;
</span><span class="cx">     virtual MediaTime totalFrameDelay() override;
</span><span class="cx"> 
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    virtual bool isCurrentPlaybackTargetSupported() const override;
+    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;);
+    virtual void startPlayingToPlaybackTarget() override;
+    virtual void stopPlayingToPlaybackTarget() override;
+    void togglePlayingToPlaybackTarget();
+#endif
+
</ins><span class="cx">     void ensureLayer();
</span><span class="cx">     void destroyLayer();
</span><span class="cx">     bool shouldBePlaying() const;
</span><span class="lines">@@ -212,6 +220,10 @@
</span><span class="cx">     bool m_seekCompleted;
</span><span class="cx">     mutable bool m_loadingProgressed;
</span><span class="cx">     bool m_hasAvailableVideoFrame;
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    std::unique_ptr&lt;MediaPlaybackTarget&gt; m_playbackTarget;
+    bool m_currentPlaybackTargetIsSupported { true };
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCmm"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -806,6 +806,42 @@
</span><span class="cx">     m_player-&gt;characteristicChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+bool MediaPlayerPrivateMediaSourceAVFObjC::isCurrentPlaybackTargetSupported() const
+{
+    if (!m_playbackTarget)
+        return true;
+
+    return !m_playbackTarget-&gt;hasActiveRoute();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaPlayerPrivateMediaSourceAVFObjC::setWirelessPlaybackTarget(const MediaPlaybackTarget&amp; target)
+{
+    if (!m_playbackTarget)
+        m_playbackTarget = std::make_unique&lt;MediaPlaybackTarget&gt;();
+    m_playbackTarget-&gt;setDevicePickerContext(target.devicePickerContext());
+}
+
+void MediaPlayerPrivateMediaSourceAVFObjC::togglePlayingToPlaybackTarget()
+{
+    bool oldSupported = m_currentPlaybackTargetIsSupported;
+    m_currentPlaybackTargetIsSupported = !m_playbackTarget || !m_playbackTarget-&gt;hasActiveRoute();
+
+    if (m_player &amp;&amp; oldSupported != m_currentPlaybackTargetIsSupported)
+        m_player-&gt;currentPlaybackTargetIsWirelessChanged();
+}
+
+void MediaPlayerPrivateMediaSourceAVFObjC::startPlayingToPlaybackTarget()
+{
+    togglePlayingToPlaybackTarget();
+}
+
+void MediaPlayerPrivateMediaSourceAVFObjC::stopPlayingToPlaybackTarget()
+{
+    togglePlayingToPlaybackTarget();
+}
</ins><span class="cx"> #endif
</span><ins>+
+}
+
+#endif
</ins></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKith"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.h        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -179,6 +179,14 @@
</span><span class="cx">     virtual String engineDescription() const { return &quot;QTKit&quot;; }
</span><span class="cx">     virtual long platformErrorCode() const;
</span><span class="cx"> 
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    virtual bool isCurrentPlaybackTargetSupported() const override;
+    virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&amp;);
+    virtual void startPlayingToPlaybackTarget() override;
+    virtual void stopPlayingToPlaybackTarget() override;
+    void togglePlayingToPlaybackTarget();
+#endif
+
</ins><span class="cx">     MediaPlayer* m_player;
</span><span class="cx">     RetainPtr&lt;QTMovie&gt; m_qtMovie;
</span><span class="cx">     RetainPtr&lt;QTVideoRendererWebKitOnly&gt; m_qtVideoRenderer;
</span><span class="lines">@@ -206,6 +214,10 @@
</span><span class="cx">     bool m_privateBrowsing;
</span><span class="cx">     mutable MediaTime m_maxTimeLoadedAtLastDidLoadingProgress;
</span><span class="cx">     mutable FloatSize m_cachedNaturalSize;
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    std::unique_ptr&lt;MediaPlaybackTarget&gt; m_playbackTarget;
+    bool m_currentPlaybackTargetIsSupported { true };
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="tagsSafari601125SourceWebCoreplatformgraphicsmacMediaPlayerPrivateQTKitmm"></a>
<div class="modfile"><h4>Modified: tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm (182250 => 182251)</h4>
<pre class="diff"><span>
<span class="info">--- tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm        2015-04-01 19:49:47 UTC (rev 182250)
+++ tags/Safari-601.1.25/Source/WebCore/platform/graphics/mac/MediaPlayerPrivateQTKit.mm        2015-04-01 19:51:00 UTC (rev 182251)
</span><span class="lines">@@ -1540,6 +1540,42 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+bool MediaPlayerPrivateQTKit::isCurrentPlaybackTargetSupported() const
+{
+    if (!m_playbackTarget)
+        return true;
+
+    return !m_playbackTarget-&gt;hasActiveRoute();
+}
+
+void MediaPlayerPrivateQTKit::setWirelessPlaybackTarget(const MediaPlaybackTarget&amp; target)
+{
+    if (!m_playbackTarget)
+        m_playbackTarget = std::make_unique&lt;MediaPlaybackTarget&gt;();
+    m_playbackTarget-&gt;setDevicePickerContext(target.devicePickerContext());
+}
+
+void MediaPlayerPrivateQTKit::togglePlayingToPlaybackTarget()
+{
+    bool oldSupported = m_currentPlaybackTargetIsSupported;
+    m_currentPlaybackTargetIsSupported = !m_playbackTarget || !m_playbackTarget-&gt;hasActiveRoute();
+
+    if (m_player &amp;&amp; oldSupported != m_currentPlaybackTargetIsSupported)
+        m_player-&gt;currentPlaybackTargetIsWirelessChanged();
+}
+
+void MediaPlayerPrivateQTKit::startPlayingToPlaybackTarget()
+{
+    togglePlayingToPlaybackTarget();
+}
+
+void MediaPlayerPrivateQTKit::stopPlayingToPlaybackTarget()
+{
+    togglePlayingToPlaybackTarget();
+}
+#endif
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> @implementation WebCoreMovieObserver
</span></span></pre>
</div>
</div>

</body>
</html>