<!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 <bshafiei@apple.com>
+
+ Merge r182240.
+
+ 2015-04-01 Eric Carlson <eric.carlson@apple.com>
+
+ [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 &
+ 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 <simon.fraser@apple.com>
</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) && 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->showPlaybackTargetPicker(this, view()->lastKnownMousePosition(), is<HTMLVideoElement>(element));
</del><ins>+ page->showPlaybackTargetPicker(view()->lastKnownMousePosition(), is<HTMLVideoElement>(element));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void Document::addPlaybackTargetPickerClient(MediaPlaybackTargetPickerClient& client)
</span><span class="lines">@@ -6604,22 +6604,8 @@
</span><span class="cx">
</span><span class="cx"> void Document::didChoosePlaybackTarget(const MediaPlaybackTarget& device)
</span><span class="cx"> {
</span><del>- MediaPlaybackTargetPickerClient* clientThatRequestedPicker = nullptr;
-
- for (auto* client : m_playbackTargetClients) {
- if (client->requestedPlaybackTargetPicker()) {
- clientThatRequestedPicker = client;
- continue;
- }
-
</del><ins>+ for (auto* client : m_playbackTargetClients)
</ins><span class="cx"> client->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->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->load(url, contentType, keySystem))
</span><span class="cx"> mediaLoadingFailed(MediaPlayer::FormatError);
</span><span class="cx">
</span><del>- m_mediaSession->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()->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->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->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->currentPlaybackTargetIsWireless(*this);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+bool HTMLMediaElement::webkitCurrentPlaybackTargetIsSupported() const
+{
+ return m_mediaSession->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->setWirelessPlaybackTarget(device);
</span><span class="cx"> }
</span><ins>+
+bool HTMLMediaElement::canPlayToWirelessPlaybackTarget()
+{
+ bool canPlay = m_player && m_player->canPlayToWirelessPlaybackTarget();
+
+ LOG(Media, "HTMLMediaElement::canPlayToWirelessPlaybackTarget(%p) - returning %s", this, boolString(canPlay));
+
+ return canPlay;
+}
+
+void HTMLMediaElement::startPlayingToPlaybackTarget()
+{
+ if (m_player)
+ m_player->startPlayingToPlaybackTarget();
+}
+
+void HTMLMediaElement::stopPlayingToPlaybackTarget()
+{
+ if (m_player)
+ m_player->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& eventType, PassRefPtr<EventListener>, bool useCapture) override;
</span><span class="cx"> virtual bool removeEventListener(const AtomicString& 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&) 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, &HTMLMediaSession::targetAvailabilityChangedTimerFired)
</span><ins>+ , m_playbackTarget(std::make_unique<MediaPlaybackTarget>())
</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& element) const
</del><ins>+bool HTMLMediaSession::currentPlaybackTargetIsWireless(const HTMLMediaElement& element) const
</ins><span class="cx"> {
</span><del>- if (m_restrictions & RequireUserGestureToShowPlaybackTargetPicker && !ScriptController::processingUserGesture()) {
- LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE because of permissions");
</del><ins>+ MediaPlayer* player = element.player();
+ if (!player) {
+ LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsWireless - returning FALSE because player is NULL");
</ins><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (!element.document().page()) {
- LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning FALSE because page is NULL");
- return false;
- }
</del><ins>+ bool isWireless = player->isCurrentPlaybackTargetWireless();
+ LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsWireless - returning %s", isWireless ? "TRUE" : "FALSE");
</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& element) const
</del><ins>+bool HTMLMediaSession::currentPlaybackTargetIsSupported(const HTMLMediaElement& element) const
</ins><span class="cx"> {
</span><span class="cx"> MediaPlayer* player = element.player();
</span><span class="cx"> if (!player) {
</span><del>- LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsWireless - returning FALSE because player is NULL");
</del><ins>+ LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsSupported - returning FALSE because player is NULL");
</ins><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- bool isWireless = player->isCurrentPlaybackTargetWireless();
- LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsWireless - returning %s", isWireless ? "TRUE" : "FALSE");
-
- return isWireless;
</del><ins>+ bool isSupported = player->isCurrentPlaybackTargetSupported();
+ LOG(Media, "HTMLMediaSession::currentPlaybackTargetIsSupported - returning %s", isSupported ? "TRUE" : "FALSE");
+
+ return isSupported;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void HTMLMediaSession::showPlaybackTargetPicker(const HTMLMediaElement& element)
</span><span class="cx"> {
</span><span class="cx"> LOG(Media, "HTMLMediaSession::showPlaybackTargetPicker");
</span><span class="cx">
</span><del>- if (!showingPlaybackTargetPickerPermitted(element))
</del><ins>+ if (m_restrictions & RequireUserGestureToShowPlaybackTargetPicker && !ScriptController::processingUserGesture()) {
+ LOG(Media, "HTMLMediaSession::showPlaybackTargetPicker - returning early because of permissions");
</ins><span class="cx"> return;
</span><ins>+ }
</ins><span class="cx">
</span><del>- m_haveRequestedPlaybackTargetPicker = true;
</del><ins>+ if (!element.document().page()) {
+ LOG(Media, "HTMLMediaSession::showingPlaybackTargetPickerPermitted - returning early because page is NULL");
+ 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->wirelessVideoPlaybackDisabled();
</span><span class="cx"> LOG(Media, "HTMLMediaSession::wirelessVideoPlaybackDisabled - returning %s because media engine says so", disabled ? "TRUE" : "FALSE");
</span><span class="lines">@@ -277,8 +284,12 @@
</span><span class="cx">
</span><span class="cx"> void HTMLMediaSession::didChoosePlaybackTarget(const MediaPlaybackTarget& device)
</span><span class="cx"> {
</span><del>- m_haveRequestedPlaybackTargetPicker = false;
- client().setWirelessPlaybackTarget(device);
</del><ins>+ m_playbackTarget->setDevicePickerContext(device.devicePickerContext());
+ client().setWirelessPlaybackTarget(*m_playbackTarget.get());
+ if (device.hasActiveRoute() && 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, "HTMLMediaSession::externalOutputDeviceAvailableDidChange - hasTargets %s", hasTargets ? "TRUE" : "FALSE");
+
</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&) const;
</span><span class="cx">
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>- bool showingPlaybackTargetPickerPermitted(const HTMLMediaElement&) const;
</del><span class="cx"> bool currentPlaybackTargetIsWireless(const HTMLMediaElement&) const;
</span><ins>+ bool currentPlaybackTargetIsSupported(const HTMLMediaElement&) const;
</ins><span class="cx"> void showPlaybackTargetPicker(const HTMLMediaElement&);
</span><span class="cx"> bool hasWirelessPlaybackTargets(const HTMLMediaElement&) const;
</span><span class="cx">
</span><span class="lines">@@ -102,16 +102,15 @@
</span><span class="cx"> virtual void didChoosePlaybackTarget(const MediaPlaybackTarget&) 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<MediaPlaybackTarget> 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<MediaPlaybackTarget>())
+#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& location, bool isVideo)
</del><ins>+void Page::showPlaybackTargetPicker(const WebCore::IntPoint& 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& target)
</span><span class="cx"> {
</span><del>- Document* documentThatRequestedPicker = nullptr;
-
- m_playbackTarget = std::make_unique<MediaPlaybackTarget>(target.devicePickerContext());
- for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
- Document* document = frame->document();
- if (frame->document() == m_documentRequestingPlaybackTargetPicker) {
- documentThatRequestedPicker = document;
- continue;
- }
</del><ins>+ m_playbackTarget->setDevicePickerContext(target.devicePickerContext());
+ for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext())
</ins><span class="cx"> frame->document()->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->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&, bool);
</del><ins>+ void showPlaybackTargetPicker(const WebCore::IntPoint&, bool);
</ins><span class="cx"> bool hasWirelessPlaybackTarget() const { return m_hasWirelessPlaybackTarget; }
</span><span class="cx"> MediaPlaybackTarget& 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<MediaPlaybackTarget> 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&) 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&) { }
</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 & ConcurrentPlaybackNotPermitted)
- return true;
-
</del><ins>+ bool newSessionCanPlayToPlaybackTarget = session.canPlayToWirelessPlaybackTarget();
</ins><span class="cx"> Vector<MediaSession*> sessions = m_sessions;
</span><span class="cx"> for (auto* oneSession : sessions) {
</span><span class="cx"> if (oneSession == &session)
</span><span class="cx"> continue;
</span><del>- if (oneSession->mediaType() != sessionType)
- continue;
- if (restrictions & ConcurrentPlaybackNotPermitted)
</del><ins>+ if (newSessionCanPlayToPlaybackTarget)
+ oneSession->stopPlayingToPlaybackTarget();
+ if (oneSession->mediaType() == sessionType && restrictions & ConcurrentPlaybackNotPermitted)
</ins><span class="cx"> oneSession->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&);
+ 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&);
</span><span class="cx"> void removeSession(MediaSession&);
</span><span class="cx">
</span><del>- void setCurrentSession(MediaSession&);
- MediaSession* currentSession();
-
</del><span class="cx"> Vector<MediaSession*> 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->isCurrentPlaybackTargetWireless();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+bool MediaPlayer::isCurrentPlaybackTargetSupported() const
+{
+ return m_private->isCurrentPlaybackTargetSupported();
+}
+
</ins><span class="cx"> String MediaPlayer::wirelessPlaybackTargetName() const
</span><span class="cx"> {
</span><span class="cx"> return m_private->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->canPlayToWirelessPlaybackTarget();
+}
+
</ins><span class="cx"> void MediaPlayer::setWirelessPlaybackTarget(const MediaPlaybackTarget& device)
</span><span class="cx"> {
</span><span class="cx"> m_private->setWirelessPlaybackTarget(device);
</span><span class="cx"> }
</span><ins>+
+void MediaPlayer::startPlayingToPlaybackTarget()
+{
+ m_private->startPlayingToPlaybackTarget();
+}
+
+void MediaPlayer::stopPlayingToPlaybackTarget()
+{
+ m_private->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&);
</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&) { }
</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) && !PLATFORM(IOS)
</span><span class="cx">
</span><del>-#import <WebCore/MediaPlaybackTarget.h>
</del><ins>+#import <WebCore/AVFoundationSPI.h>
</ins><span class="cx"> #import <WebCore/SoftLinking.h>
</span><span class="cx"> #import <objc/runtime.h>
</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 && m_devicePickerContext.get().deviceName;
+}
+
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // ENABLE(WIRELESS_PLAYBACK_TARGET) && !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) && PLATFORM(IOS)
</ins><span class="cx"> if (isCurrentPlaybackTargetWireless())
</span><span class="cx"> m_player->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&) 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) && !PLATFORM(IOS)
+ virtual void setWirelessPlaybackTarget(const MediaPlaybackTarget&) 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<double>::infinity() : 2.0; }
</span><span class="cx"> virtual double minFastReverseRate() const override { return m_cachedCanPlayFastReverse ? -std::numeric_limits<double>::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:@"rate"];
-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"externalPlaybackActive"];
- [m_avPlayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"outputContext"];
-#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:@"rate" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"externalPlaybackActive" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
- [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"outputContext" 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) && 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) && !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()->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, "MediaPlayerPrivateAVFoundationObjC::wirelessPlaybackTargetName(%p) - returning %s", 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& target)
</span><span class="cx"> {
</span><span class="cx"> m_outputContext = target.devicePickerContext();
</span><del>-
</del><span class="cx"> LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setWirelessPlaybackTarget(%p) - target = %p", 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:@"rate",
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+ @"externalPlaybackActive", @"outputContext", @"allowsExternalPlayback",
+#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:@"rate"])
</span><span class="cx"> function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::rateDidChange, m_callback, [newValue doubleValue]);
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><del>- else if ([keyPath isEqualToString:@"externalPlaybackActive"])
</del><ins>+ else if ([keyPath isEqualToString:@"externalPlaybackActive"] || [keyPath isEqualToString:@"outputContext"] || [keyPath isEqualToString:@"allowsExternalPlayback"])
</ins><span class="cx"> function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackTargetIsWirelessDidChange, m_callback);
</span><del>- else if ([keyPath isEqualToString:@"outputContext"])
- function = WTF::bind(&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&);
+ 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<MediaPlaybackTarget> 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->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->hasActiveRoute();
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void MediaPlayerPrivateMediaSourceAVFObjC::setWirelessPlaybackTarget(const MediaPlaybackTarget& target)
+{
+ if (!m_playbackTarget)
+ m_playbackTarget = std::make_unique<MediaPlaybackTarget>();
+ m_playbackTarget->setDevicePickerContext(target.devicePickerContext());
+}
+
+void MediaPlayerPrivateMediaSourceAVFObjC::togglePlayingToPlaybackTarget()
+{
+ bool oldSupported = m_currentPlaybackTargetIsSupported;
+ m_currentPlaybackTargetIsSupported = !m_playbackTarget || !m_playbackTarget->hasActiveRoute();
+
+ if (m_player && oldSupported != m_currentPlaybackTargetIsSupported)
+ m_player->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 "QTKit"; }
</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&);
+ virtual void startPlayingToPlaybackTarget() override;
+ virtual void stopPlayingToPlaybackTarget() override;
+ void togglePlayingToPlaybackTarget();
+#endif
+
</ins><span class="cx"> MediaPlayer* m_player;
</span><span class="cx"> RetainPtr<QTMovie> m_qtMovie;
</span><span class="cx"> RetainPtr<QTVideoRendererWebKitOnly> 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<MediaPlaybackTarget> 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->hasActiveRoute();
+}
+
+void MediaPlayerPrivateQTKit::setWirelessPlaybackTarget(const MediaPlaybackTarget& target)
+{
+ if (!m_playbackTarget)
+ m_playbackTarget = std::make_unique<MediaPlaybackTarget>();
+ m_playbackTarget->setDevicePickerContext(target.devicePickerContext());
+}
+
+void MediaPlayerPrivateQTKit::togglePlayingToPlaybackTarget()
+{
+ bool oldSupported = m_currentPlaybackTargetIsSupported;
+ m_currentPlaybackTargetIsSupported = !m_playbackTarget || !m_playbackTarget->hasActiveRoute();
+
+ if (m_player && oldSupported != m_currentPlaybackTargetIsSupported)
+ m_player->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>