<!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>[197429] trunk/Source</title>
</head>
<body>

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

<h3>Log Message</h3>
<pre>Adopt the new version of AVOutputDeviceMenuController's showMenuForRect method.
https://bugs.webkit.org/show_bug.cgi?id=154823

Reviewed by Tim Horton.

Source/WebCore:

* Modules/mediasession/WebMediaSessionManager.cpp:
(WebCore::WebMediaSessionManager::showPlaybackTargetPicker):
(WebCore::WebMediaSessionManager::customPlaybackActionSelected):
Call customPlaybackActionSelected() on the client that requested the picker.
* Modules/mediasession/WebMediaSessionManager.h:
* Modules/mediasession/WebMediaSessionManagerClient.h:
* dom/Document.cpp:
(WebCore::Document::showPlaybackTargetPicker):
(WebCore::Document::customPlaybackActionSelected):
* dom/Document.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::customPlaybackActionSelected):
(WebCore::HTMLMediaElement::playbackTargetPickerCustomActionName):
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::showPlaybackTargetPicker):
(WebCore::MediaElementSession::customPlaybackActionSelected):
* html/MediaElementSession.h:
* page/ChromeClient.h:
* page/Page.cpp:
(WebCore::Page::showPlaybackTargetPicker):
(WebCore::Page::customPlaybackActionSelected):
* page/Page.h:
* platform/audio/PlatformMediaSession.h:
(WebCore::PlatformMediaSessionClient::customPlaybackActionSelected):
* platform/graphics/MediaPlaybackTargetClient.h:
* platform/graphics/MediaPlaybackTargetPicker.cpp:
(WebCore::MediaPlaybackTargetPicker::pendingActionTimerFired):
(WebCore::MediaPlaybackTargetPicker::showPlaybackTargetPicker):
* platform/graphics/MediaPlaybackTargetPicker.h:
(WebCore::MediaPlaybackTargetPicker::Client::customPlaybackActionSelected):
(WebCore::MediaPlaybackTargetPicker::customPlaybackActionSelected):
* platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h:
* platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
Update the forward declaration of AVOutputDeviceMenuController's showMenuForRect method.
(WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker):
Call the new version of showMenuForRect if available.
* platform/mac/WebVideoFullscreenInterfaceMac.h:
* platform/mac/WebVideoFullscreenInterfaceMac.mm:
(WebCore::WebVideoFullscreenInterfaceMac::setExternalPlayback):
* platform/mock/MediaPlaybackTargetPickerMock.cpp:
(WebCore::MediaPlaybackTargetPickerMock::showPlaybackTargetPicker):
* platform/mock/MediaPlaybackTargetPickerMock.h:
* platform/spi/cocoa/AVKitSPI.h:
Updated with the new version of showMenuForRect.

Source/WebKit/mac:

* WebCoreSupport/WebChromeClient.h:
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::showPlaybackTargetPicker):
* WebView/WebMediaPlaybackTargetPicker.h:
* WebView/WebMediaPlaybackTargetPicker.mm:
(WebMediaPlaybackTargetPicker::showPlaybackTargetPicker):
(WebMediaPlaybackTargetPicker::customPlaybackActionSelected):
* WebView/WebView.mm:
(-[WebView _showPlaybackTargetPicker:location:hasVideo:]):

Source/WebKit2:

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::showPlaybackTargetPicker):
(WebKit::WebPageProxy::customPlaybackActionSelected):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::showPlaybackTargetPicker):
* WebProcess/WebCoreSupport/WebChromeClient.h:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::customPlaybackActionSelected):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasessionWebMediaSessionManagercpp">trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasessionWebMediaSessionManagerh">trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasessionWebMediaSessionManagerClienth">trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManagerClient.h</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumenth">trunk/Source/WebCore/dom/Document.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaElementSessioncpp">trunk/Source/WebCore/html/MediaElementSession.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaElementSessionh">trunk/Source/WebCore/html/MediaElementSession.h</a></li>
<li><a href="#trunkSourceWebCorepageChromeClienth">trunk/Source/WebCore/page/ChromeClient.h</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioPlatformMediaSessionh">trunk/Source/WebCore/platform/audio/PlatformMediaSession.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlaybackTargetClienth">trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlaybackTargetPickercpp">trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlaybackTargetPickerh">trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMach">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMacmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmacWebVideoFullscreenInterfaceMach">trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmacWebVideoFullscreenInterfaceMacmm">trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMediaPlaybackTargetPickerMockcpp">trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMediaPlaybackTargetPickerMockh">trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.h</a></li>
<li><a href="#trunkSourceWebCoreplatformspicocoaAVKitSPIh">trunk/Source/WebCore/platform/spi/cocoa/AVKitSPI.h</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebChromeClienth">trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebChromeClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebMediaPlaybackTargetPickerh">trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.h</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebMediaPlaybackTargetPickermm">trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebViewmm">trunk/Source/WebKit/mac/WebView/WebView.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxymessagesin">trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClienth">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm">trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/ChangeLog        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1,3 +1,56 @@
</span><ins>+2016-02-29  Ada Chan  &lt;adachan@apple.com&gt;
+
+        Adopt the new version of AVOutputDeviceMenuController's showMenuForRect method.
+        https://bugs.webkit.org/show_bug.cgi?id=154823
+
+        Reviewed by Tim Horton.
+
+        * Modules/mediasession/WebMediaSessionManager.cpp:
+        (WebCore::WebMediaSessionManager::showPlaybackTargetPicker):
+        (WebCore::WebMediaSessionManager::customPlaybackActionSelected):
+        Call customPlaybackActionSelected() on the client that requested the picker.
+        * Modules/mediasession/WebMediaSessionManager.h:
+        * Modules/mediasession/WebMediaSessionManagerClient.h:
+        * dom/Document.cpp:
+        (WebCore::Document::showPlaybackTargetPicker):
+        (WebCore::Document::customPlaybackActionSelected):
+        * dom/Document.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::customPlaybackActionSelected):
+        (WebCore::HTMLMediaElement::playbackTargetPickerCustomActionName):
+        * html/HTMLMediaElement.h:
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::showPlaybackTargetPicker):
+        (WebCore::MediaElementSession::customPlaybackActionSelected):
+        * html/MediaElementSession.h:
+        * page/ChromeClient.h:
+        * page/Page.cpp:
+        (WebCore::Page::showPlaybackTargetPicker):
+        (WebCore::Page::customPlaybackActionSelected):
+        * page/Page.h:
+        * platform/audio/PlatformMediaSession.h:
+        (WebCore::PlatformMediaSessionClient::customPlaybackActionSelected):
+        * platform/graphics/MediaPlaybackTargetClient.h:
+        * platform/graphics/MediaPlaybackTargetPicker.cpp:
+        (WebCore::MediaPlaybackTargetPicker::pendingActionTimerFired):
+        (WebCore::MediaPlaybackTargetPicker::showPlaybackTargetPicker):
+        * platform/graphics/MediaPlaybackTargetPicker.h:
+        (WebCore::MediaPlaybackTargetPicker::Client::customPlaybackActionSelected):
+        (WebCore::MediaPlaybackTargetPicker::customPlaybackActionSelected):
+        * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h:
+        * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
+        Update the forward declaration of AVOutputDeviceMenuController's showMenuForRect method.
+        (WebCore::MediaPlaybackTargetPickerMac::showPlaybackTargetPicker):
+        Call the new version of showMenuForRect if available.
+        * platform/mac/WebVideoFullscreenInterfaceMac.h:
+        * platform/mac/WebVideoFullscreenInterfaceMac.mm:
+        (WebCore::WebVideoFullscreenInterfaceMac::setExternalPlayback):
+        * platform/mock/MediaPlaybackTargetPickerMock.cpp:
+        (WebCore::MediaPlaybackTargetPickerMock::showPlaybackTargetPicker):
+        * platform/mock/MediaPlaybackTargetPickerMock.h:
+        * platform/spi/cocoa/AVKitSPI.h:
+        Updated with the new version of showMenuForRect.
+
</ins><span class="cx"> 2016-03-01  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         com.apple.WebKit.Networking.Development crashes in WebCore::formOpen()
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasessionWebMediaSessionManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -180,7 +180,7 @@
</span><span class="cx">     scheduleDelayedTask(TargetMonitoringConfigurationTask | TargetClientsConfigurationTask);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebMediaSessionManager::showPlaybackTargetPicker(WebMediaSessionManagerClient&amp; client, uint64_t contextId, const IntRect&amp; rect, bool)
</del><ins>+void WebMediaSessionManager::showPlaybackTargetPicker(WebMediaSessionManagerClient&amp; client, uint64_t contextId, const IntRect&amp; rect, bool, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><span class="cx">     size_t index = find(&amp;client, contextId);
</span><span class="cx">     ASSERT(index != notFound);
</span><span class="lines">@@ -195,7 +195,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasActiveRoute = flagsAreSet(m_clientState[index]-&gt;flags, MediaProducer::IsPlayingToExternalDevice);
</span><span class="cx">     LOG(Media, &quot;WebMediaSessionManager::showPlaybackTargetPicker(%p + %llu) - hasActiveRoute = %i&quot;, &amp;client, contextId, (int)hasActiveRoute);
</span><del>-    targetPicker().showPlaybackTargetPicker(FloatRect(rect), hasActiveRoute);
</del><ins>+
+    targetPicker().showPlaybackTargetPicker(FloatRect(rect), hasActiveRoute, customMenuItemTitle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebMediaSessionManager::clientStateDidChange(WebMediaSessionManagerClient&amp; client, uint64_t contextId, MediaProducer::MediaStateFlags newFlags)
</span><span class="lines">@@ -269,6 +270,17 @@
</span><span class="cx">         state-&gt;client.externalOutputDeviceAvailableDidChange(state-&gt;contextId, available);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebMediaSessionManager::customPlaybackActionSelected()
+{
+    for (auto&amp; state : m_clientState) {
+        if (!state-&gt;requestedPicker)
+            continue;
+
+        state-&gt;client.customPlaybackActionSelected(state-&gt;contextId);
+        state-&gt;requestedPicker = false;
+    }
+}
+
</ins><span class="cx"> void WebMediaSessionManager::configureNewClients()
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; state : m_clientState) {
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasessionWebMediaSessionManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManager.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -55,7 +55,9 @@
</span><span class="cx">     WEBCORE_EXPORT uint64_t addPlaybackTargetPickerClient(WebMediaSessionManagerClient&amp;, uint64_t);
</span><span class="cx">     WEBCORE_EXPORT void removePlaybackTargetPickerClient(WebMediaSessionManagerClient&amp;, uint64_t);
</span><span class="cx">     WEBCORE_EXPORT void removeAllPlaybackTargetPickerClients(WebMediaSessionManagerClient&amp;);
</span><del>-    WEBCORE_EXPORT void showPlaybackTargetPicker(WebMediaSessionManagerClient&amp;, uint64_t, const IntRect&amp;, bool);
</del><ins>+
+    WEBCORE_EXPORT void showPlaybackTargetPicker(WebMediaSessionManagerClient&amp;, uint64_t, const IntRect&amp;, bool, const String&amp;);
+
</ins><span class="cx">     WEBCORE_EXPORT void clientStateDidChange(WebMediaSessionManagerClient&amp;, uint64_t, WebCore::MediaProducer::MediaStateFlags);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -73,6 +75,7 @@
</span><span class="cx">     // MediaPlaybackTargetPicker::Client
</span><span class="cx">     virtual void setPlaybackTarget(Ref&lt;WebCore::MediaPlaybackTarget&gt;&amp;&amp;) override;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) override;
</span><ins>+    virtual void customPlaybackActionSelected() override;
</ins><span class="cx"> 
</span><span class="cx">     size_t find(WebMediaSessionManagerClient*, uint64_t);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasessionWebMediaSessionManagerClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManagerClient.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManagerClient.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/Modules/mediasession/WebMediaSessionManagerClient.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -43,6 +43,7 @@
</span><span class="cx">     virtual void setPlaybackTarget(uint64_t, Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;) = 0;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(uint64_t, bool) = 0;
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(uint64_t, bool) = 0;
</span><ins>+    virtual void customPlaybackActionSelected(uint64_t) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -6828,7 +6828,7 @@
</span><span class="cx">     page-&gt;removePlaybackTargetPickerClient(clientId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Document::showPlaybackTargetPicker(MediaPlaybackTargetClient&amp; client, bool isVideo)
</del><ins>+void Document::showPlaybackTargetPicker(MediaPlaybackTargetClient&amp; client, bool isVideo, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><span class="cx">     Page* page = this-&gt;page();
</span><span class="cx">     if (!page)
</span><span class="lines">@@ -6838,7 +6838,7 @@
</span><span class="cx">     if (it == m_clientToIDMap.end())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    page-&gt;showPlaybackTargetPicker(it-&gt;value, view()-&gt;lastKnownMousePosition(), isVideo);
</del><ins>+    page-&gt;showPlaybackTargetPicker(it-&gt;value, view()-&gt;lastKnownMousePosition(), isVideo, customMenuItemTitle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Document::playbackTargetPickerClientStateDidChange(MediaPlaybackTargetClient&amp; client, MediaProducer::MediaStateFlags state)
</span><span class="lines">@@ -6880,6 +6880,12 @@
</span><span class="cx"> 
</span><span class="cx">     it-&gt;value-&gt;setShouldPlayToPlaybackTarget(shouldPlay);
</span><span class="cx"> }
</span><ins>+
+void Document::customPlaybackActionSelected(uint64_t clientId)
+{
+    if (auto* client = m_idToClientMap.get(clientId))
+        client-&gt;customPlaybackActionSelected();
+}
</ins><span class="cx"> #endif // ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_SESSION)
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/dom/Document.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1288,12 +1288,15 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     void addPlaybackTargetPickerClient(MediaPlaybackTargetClient&amp;);
</span><span class="cx">     void removePlaybackTargetPickerClient(MediaPlaybackTargetClient&amp;);
</span><del>-    void showPlaybackTargetPicker(MediaPlaybackTargetClient&amp;, bool);
</del><ins>+
+    void showPlaybackTargetPicker(MediaPlaybackTargetClient&amp;, bool, const String&amp;);
+
</ins><span class="cx">     void playbackTargetPickerClientStateDidChange(MediaPlaybackTargetClient&amp;, MediaProducer::MediaStateFlags);
</span><span class="cx"> 
</span><span class="cx">     void setPlaybackTarget(uint64_t, Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;);
</span><span class="cx">     void playbackTargetAvailabilityDidChange(uint64_t, bool);
</span><span class="cx">     void setShouldPlayToPlaybackTarget(uint64_t, bool);
</span><ins>+    void customPlaybackActionSelected(uint64_t);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicyToPropagate() const;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -150,6 +150,10 @@
</span><span class="cx"> #include &lt;bindings/ScriptObject.h&gt;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if USE(APPLE_INTERNAL_SDK)
+#include &lt;WebKitAdditions/HTMLMediaElementAdditions.cpp&gt;
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> static const double SeekRepeatDelay = 0.1;
</span><span class="lines">@@ -5201,6 +5205,19 @@
</span><span class="cx">     if (m_player)
</span><span class="cx">         m_player-&gt;setShouldPlayToPlaybackTarget(shouldPlay);
</span><span class="cx"> }
</span><ins>+
+#if !USE(APPLE_INTERNAL_SDK)
+void HTMLMediaElement::customPlaybackActionSelected()
+{
+    LOG(Media, &quot;HTMLMediaElement::customPlaybackActionSelected(%p)&quot;, this);
+}
+
+String HTMLMediaElement::playbackTargetPickerCustomActionName() const
+{
+    return { };
+}
+#endif
+
</ins><span class="cx"> #else // ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx"> 
</span><span class="cx"> bool HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless() const
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -344,6 +344,8 @@
</span><span class="cx">     virtual bool isPlayingToWirelessPlaybackTarget() const override;
</span><span class="cx">     virtual void setWirelessPlaybackTarget(Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;) override;
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(bool) override;
</span><ins>+    virtual void customPlaybackActionSelected() override;
+    String playbackTargetPickerCustomActionName() const;
</ins><span class="cx"> #endif
</span><span class="cx">     bool webkitCurrentPlaybackTargetIsWireless() const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaElementSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaElementSession.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include &quot;Frame.h&quot;
</span><span class="cx"> #include &quot;FrameView.h&quot;
</span><span class="cx"> #include &quot;HTMLMediaElement.h&quot;
</span><ins>+#include &quot;HTMLMediaElementEnums.h&quot;
</ins><span class="cx"> #include &quot;HTMLNames.h&quot;
</span><span class="cx"> #include &quot;HTMLVideoElement.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="lines">@@ -207,7 +208,8 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    element.document().showPlaybackTargetPicker(*this, is&lt;HTMLVideoElement&gt;(element));
</del><ins>+    String customMenuItemTitle = element.playbackTargetPickerCustomActionName();
+    element.document().showPlaybackTargetPicker(*this, is&lt;HTMLVideoElement&gt;(element), customMenuItemTitle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MediaElementSession::hasWirelessPlaybackTargets(const HTMLMediaElement&amp;) const
</span><span class="lines">@@ -331,6 +333,11 @@
</span><span class="cx">     client().setShouldPlayToPlaybackTarget(shouldPlay);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MediaElementSession::customPlaybackActionSelected()
+{
+    client().customPlaybackActionSelected();
+}
+
</ins><span class="cx"> void MediaElementSession::mediaStateDidChange(const HTMLMediaElement&amp; element, MediaProducer::MediaStateFlags state)
</span><span class="cx"> {
</span><span class="cx">     element.document().playbackTargetPickerClientStateDidChange(*this, state);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaElementSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaElementSession.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaElementSession.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/html/MediaElementSession.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -113,6 +113,7 @@
</span><span class="cx">     virtual void setPlaybackTarget(Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;) override;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) override;
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(bool) override;
</span><ins>+    virtual void customPlaybackActionSelected() override;
</ins><span class="cx"> #endif
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     bool requiresPlaybackTargetRouteMonitoring() const override;
</span></span></pre></div>
<a id="trunkSourceWebCorepageChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ChromeClient.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ChromeClient.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/page/ChromeClient.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -452,7 +452,9 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     virtual void addPlaybackTargetPickerClient(uint64_t /*contextId*/) { }
</span><span class="cx">     virtual void removePlaybackTargetPickerClient(uint64_t /*contextId*/) { }
</span><del>-    virtual void showPlaybackTargetPicker(uint64_t /*contextId*/, const WebCore::IntPoint&amp;, bool /* isVideo */) { }
</del><ins>+
+    virtual void showPlaybackTargetPicker(uint64_t /*contextId*/, const WebCore::IntPoint&amp;, bool /* isVideo */, const String&amp; /*customMenuItemTitle*/) { }
+
</ins><span class="cx">     virtual void playbackTargetPickerClientStateDidChange(uint64_t /*contextId*/, MediaProducer::MediaStateFlags) { }
</span><span class="cx">     virtual void setMockMediaPlaybackTargetPickerEnabled(bool)  { }
</span><span class="cx">     virtual void setMockMediaPlaybackTargetPickerState(const String&amp;, WebCore::MediaPlaybackTargetContext::State) { }
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/page/Page.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1853,15 +1853,16 @@
</span><span class="cx">     chrome().client().removePlaybackTargetPickerClient(contextId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Page::showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp; location, bool isVideo)
</del><ins>+void Page::showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp; location, bool isVideo, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     // FIXME: refactor iOS implementation.
</span><span class="cx">     UNUSED_PARAM(contextId);
</span><span class="cx">     UNUSED_PARAM(location);
</span><ins>+    UNUSED_PARAM(customMenuItemTitle);
</ins><span class="cx">     chrome().client().showPlaybackTargetPicker(isVideo);
</span><span class="cx"> #else
</span><del>-    chrome().client().showPlaybackTargetPicker(contextId, location, isVideo);
</del><ins>+    chrome().client().showPlaybackTargetPicker(contextId, location, isVideo, customMenuItemTitle);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1906,6 +1907,12 @@
</span><span class="cx">         frame-&gt;document()-&gt;setShouldPlayToPlaybackTarget(clientId, shouldPlay);
</span><span class="cx">     }
</span><span class="cx"> }
</span><ins>+
+void Page::customPlaybackActionSelected(uint64_t contextId)
+{
+    for (Frame* frame = &amp;mainFrame(); frame; frame = frame-&gt;tree().traverseNext())
+        frame-&gt;document()-&gt;customPlaybackActionSelected(contextId);
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> WheelEventTestTrigger&amp; Page::ensureTestTrigger()
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/page/Page.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -472,7 +472,9 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET)
</span><span class="cx">     void addPlaybackTargetPickerClient(uint64_t);
</span><span class="cx">     void removePlaybackTargetPickerClient(uint64_t);
</span><del>-    void showPlaybackTargetPicker(uint64_t, const IntPoint&amp;, bool);
</del><ins>+
+    void showPlaybackTargetPicker(uint64_t, const IntPoint&amp;, bool, const String&amp;);
+
</ins><span class="cx">     void playbackTargetPickerClientStateDidChange(uint64_t, MediaProducer::MediaStateFlags);
</span><span class="cx">     WEBCORE_EXPORT void setMockMediaPlaybackTargetPickerEnabled(bool);
</span><span class="cx">     WEBCORE_EXPORT void setMockMediaPlaybackTargetPickerState(const String&amp;, MediaPlaybackTargetContext::State);
</span><span class="lines">@@ -480,6 +482,7 @@
</span><span class="cx">     WEBCORE_EXPORT void setPlaybackTarget(uint64_t, Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;);
</span><span class="cx">     WEBCORE_EXPORT void playbackTargetAvailabilityDidChange(uint64_t, bool);
</span><span class="cx">     WEBCORE_EXPORT void setShouldPlayToPlaybackTarget(uint64_t, bool);
</span><ins>+    WEBCORE_EXPORT void customPlaybackActionSelected(uint64_t);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;WheelEventTestTrigger&gt; testTrigger() const { return m_testTrigger; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioPlatformMediaSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSession.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/PlatformMediaSession.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSession.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -135,6 +135,7 @@
</span><span class="cx">     virtual void setPlaybackTarget(Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;) override { }
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) override { }
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(bool) override { }
</span><ins>+    virtual void customPlaybackActionSelected() override { }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="lines">@@ -197,6 +198,7 @@
</span><span class="cx">     virtual bool canPlayToWirelessPlaybackTarget() const { return false; }
</span><span class="cx">     virtual bool isPlayingToWirelessPlaybackTarget() const { return false; }
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(bool) { }
</span><ins>+    virtual void customPlaybackActionSelected() { }
</ins><span class="cx"> 
</span><span class="cx">     virtual const Document* hostingDocument() const = 0;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlaybackTargetClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetClient.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetClient.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetClient.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx">     virtual void setPlaybackTarget(Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;) = 0;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(bool) = 0;
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(bool) = 0;
</span><ins>+    virtual void customPlaybackActionSelected() = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlaybackTargetPickercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -59,6 +59,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (pendingActions &amp; OutputDeviceAvailabilityChanged)
</span><span class="cx">         m_client-&gt;externalOutputDeviceAvailableDidChange(externalOutputDeviceAvailable());
</span><ins>+
+    if (pendingActions &amp; CustomPlaybackActionSelected)
+        m_client-&gt;customPlaybackActionSelected();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlaybackTargetPicker::addPendingAction(PendingActionFlags action)
</span><span class="lines">@@ -70,7 +73,7 @@
</span><span class="cx">     m_pendingActionTimer.startOneShot(pendingActionInterval);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlaybackTargetPicker::showPlaybackTargetPicker(const FloatRect&amp;, bool)
</del><ins>+void MediaPlaybackTargetPicker::showPlaybackTargetPicker(const FloatRect&amp;, bool, const String&amp;)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlaybackTargetPickerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/graphics/MediaPlaybackTargetPicker.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -45,19 +45,21 @@
</span><span class="cx">     public:
</span><span class="cx">         virtual void setPlaybackTarget(Ref&lt;MediaPlaybackTarget&gt;&amp;&amp;) = 0;
</span><span class="cx">         virtual void externalOutputDeviceAvailableDidChange(bool) = 0;
</span><ins>+        virtual void customPlaybackActionSelected() { }
</ins><span class="cx"> 
</span><span class="cx">         void invalidate();
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     virtual ~MediaPlaybackTargetPicker();
</span><span class="cx"> 
</span><del>-    virtual void showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute);
</del><ins>+    virtual void showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute, const String&amp;);
</ins><span class="cx">     virtual void startingMonitoringPlaybackTargets();
</span><span class="cx">     virtual void stopMonitoringPlaybackTargets();
</span><span class="cx">     virtual void invalidatePlaybackTargets();
</span><span class="cx"> 
</span><span class="cx">     void availableDevicesDidChange() { addPendingAction(OutputDeviceAvailabilityChanged); }
</span><span class="cx">     void currentDeviceDidChange() { addPendingAction(CurrentDeviceDidChange); }
</span><ins>+    void customPlaybackActionSelected() { addPendingAction(CustomPlaybackActionSelected); }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     explicit MediaPlaybackTargetPicker(Client&amp;);
</span><span class="lines">@@ -65,6 +67,7 @@
</span><span class="cx">     enum ActionType {
</span><span class="cx">         OutputDeviceAvailabilityChanged = 1 &lt;&lt; 0,
</span><span class="cx">         CurrentDeviceDidChange = 1 &lt;&lt; 1,
</span><ins>+        CustomPlaybackActionSelected = 1 &lt;&lt; 2,
</ins><span class="cx">     };
</span><span class="cx">     typedef unsigned PendingActionFlags;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -43,7 +43,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual ~MediaPlaybackTargetPickerMac();
</span><span class="cx"> 
</span><del>-    void showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute) override;
</del><ins>+    virtual void showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute, const String&amp;) override;
+
</ins><span class="cx">     void startingMonitoringPlaybackTargets() override;
</span><span class="cx">     void stopMonitoringPlaybackTargets() override;
</span><span class="cx">     void invalidatePlaybackTargets() override;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -51,11 +51,6 @@
</span><span class="cx"> static NSString *externalOutputDeviceAvailableKeyName = @&quot;externalOutputDeviceAvailable&quot;;
</span><span class="cx"> static NSString *externalOutputDevicePickedKeyName = @&quot;externalOutputDevicePicked&quot;;
</span><span class="cx"> 
</span><del>-// FIXME: remove this once the headers are available.
-@interface AVOutputDeviceMenuController (ForwardDeclaration)
-- (BOOL)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName allowReselectionOfSelectedOutputDevice:(BOOL)allowReselectionOfSelectedOutputDevice;
-@end
-
</del><span class="cx"> @interface WebAVOutputDeviceMenuControllerHelper : NSObject {
</span><span class="cx">     MediaPlaybackTargetPickerMac* m_callback;
</span><span class="cx"> }
</span><span class="lines">@@ -114,7 +109,7 @@
</span><span class="cx">     return m_outputDeviceMenuController.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlaybackTargetPickerMac::showPlaybackTargetPicker(const FloatRect&amp; location, bool checkActiveRoute)
</del><ins>+void MediaPlaybackTargetPickerMac::showPlaybackTargetPicker(const FloatRect&amp; location, bool checkActiveRoute, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><span class="cx">     if (!client() || m_showingMenu)
</span><span class="cx">         return;
</span><span class="lines">@@ -122,14 +117,29 @@
</span><span class="cx">     LOG(Media, &quot;MediaPlaybackTargetPickerMac::showPlaybackTargetPicker - checkActiveRoute = %i&quot;, (int)checkActiveRoute);
</span><span class="cx"> 
</span><span class="cx">     AVOutputDeviceMenuControllerType *picker = devicePicker();
</span><del>-    if (![picker respondsToSelector:@selector(showMenuForRect:appearanceName:allowReselectionOfSelectedOutputDevice:)])
</del><ins>+    if (![picker respondsToSelector:@selector(showMenuForRect:appearanceName:allowReselectionOfSelectedOutputDevice:customMenuItemTitle:customMenuItemEnabled:)] &amp;&amp; ![picker respondsToSelector:@selector(showMenuForRect:appearanceName:allowReselectionOfSelectedOutputDevice:)])
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_showingMenu = true;
</span><del>-    if ([picker showMenuForRect:location appearanceName:NSAppearanceNameVibrantLight allowReselectionOfSelectedOutputDevice:!checkActiveRoute]) {
</del><ins>+
+    if ([picker respondsToSelector:@selector(showMenuForRect:appearanceName:allowReselectionOfSelectedOutputDevice:customMenuItemTitle:customMenuItemEnabled:)]) {
+        NSString *customMenuItemTitleNSString = customMenuItemTitle.isEmpty() ? nil : (NSString *)customMenuItemTitle;
+        switch ([picker showMenuForRect:location appearanceName:NSAppearanceNameVibrantLight allowReselectionOfSelectedOutputDevice:!checkActiveRoute customMenuItemTitle:customMenuItemTitleNSString customMenuItemEnabled:YES]) {
+        case AVOutputDeviceMenuControllerSelectionCustomMenuItem:
+            customPlaybackActionSelected();
+            break;
+        case AVOutputDeviceMenuControllerSelectionOutputDevice:
+            if (!checkActiveRoute)
+                currentDeviceDidChange();
+            break;
+        case AVOutputDeviceMenuControllerSelectionNone:
+            break;
+        }
+    } else if ([picker showMenuForRect:location appearanceName:NSAppearanceNameVibrantLight allowReselectionOfSelectedOutputDevice:!checkActiveRoute]) {
</ins><span class="cx">         if (!checkActiveRoute)
</span><span class="cx">             currentDeviceDidChange();
</span><span class="cx">     }
</span><ins>+
</ins><span class="cx">     m_showingMenu = false;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacWebVideoFullscreenInterfaceMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx">     WEBCORE_EXPORT void setCanPlayFastReverse(bool) override { }
</span><span class="cx">     WEBCORE_EXPORT void setAudioMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; /*options*/, uint64_t /*selectedIndex*/) override { }
</span><span class="cx">     WEBCORE_EXPORT void setLegibleMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; /*options*/, uint64_t /*selectedIndex*/) override { }
</span><del>-    WEBCORE_EXPORT void setExternalPlayback(bool /*enabled*/, ExternalPlaybackTargetType, WTF::String /*localizedDeviceName*/) override { }
</del><ins>+    WEBCORE_EXPORT void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) override;
</ins><span class="cx">     WEBCORE_EXPORT void setWirelessVideoPlaybackDisabled(bool) override { }
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void setupFullscreen(NSView&amp; layerHostedView, const IntRect&amp; initialRect, NSWindow *parentWindow, HTMLMediaElementEnums::VideoFullscreenMode, bool allowsPictureInPicturePlayback);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacWebVideoFullscreenInterfaceMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -99,6 +99,10 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebVideoFullscreenInterfaceMac::setExternalPlayback(bool, ExternalPlaybackTargetType, WTF::String)
+{
+}
+
</ins><span class="cx"> bool supportsPictureInPicture()
</span><span class="cx"> {
</span><span class="cx">     return false;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMediaPlaybackTargetPickerMockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx">     currentDeviceDidChange();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlaybackTargetPickerMock::showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute)
</del><ins>+void MediaPlaybackTargetPickerMock::showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute, const String&amp;)
</ins><span class="cx"> {
</span><span class="cx">     if (!client() || m_showingMenu)
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMediaPlaybackTargetPickerMockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/mock/MediaPlaybackTargetPickerMock.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual ~MediaPlaybackTargetPickerMock();
</span><span class="cx"> 
</span><del>-    void showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute) override;
</del><ins>+    void showPlaybackTargetPicker(const FloatRect&amp;, bool checkActiveRoute, const String&amp;) override;
</ins><span class="cx">     void startingMonitoringPlaybackTargets() override;
</span><span class="cx">     void stopMonitoringPlaybackTargets() override;
</span><span class="cx">     void invalidatePlaybackTargets() override;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformspicocoaAVKitSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/spi/cocoa/AVKitSPI.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/spi/cocoa/AVKitSPI.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebCore/platform/spi/cocoa/AVKitSPI.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -134,6 +134,13 @@
</span><span class="cx"> - (void)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName;
</span><span class="cx"> - (BOOL)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName allowReselectionOfSelectedOutputDevice:(BOOL)allowReselectionOfSelectedOutputDevice;
</span><span class="cx"> 
</span><ins>+typedef NS_ENUM(NSInteger, AVOutputDeviceMenuControllerSelection) {
+    AVOutputDeviceMenuControllerSelectionOutputDevice,
+    AVOutputDeviceMenuControllerSelectionCustomMenuItem,
+    AVOutputDeviceMenuControllerSelectionNone
+};
+
+- (AVOutputDeviceMenuControllerSelection)showMenuForRect:(NSRect)screenRect appearanceName:(NSString *)appearanceName allowReselectionOfSelectedOutputDevice:(BOOL)allowReselectionOfSelectedOutputDevice customMenuItemTitle:(NSString *)customMenuItemTitle customMenuItemEnabled:(BOOL)customMenuItemEnabled;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-02-29  Ada Chan  &lt;adachan@apple.com&gt;
+
+        Adopt the new version of AVOutputDeviceMenuController's showMenuForRect method.
+        https://bugs.webkit.org/show_bug.cgi?id=154823
+
+        Reviewed by Tim Horton.
+
+        * WebCoreSupport/WebChromeClient.h:
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::showPlaybackTargetPicker):
+        * WebView/WebMediaPlaybackTargetPicker.h:
+        * WebView/WebMediaPlaybackTargetPicker.mm:
+        (WebMediaPlaybackTargetPicker::showPlaybackTargetPicker):
+        (WebMediaPlaybackTargetPicker::customPlaybackActionSelected):
+        * WebView/WebView.mm:
+        (-[WebView _showPlaybackTargetPicker:location:hasVideo:]):
+
</ins><span class="cx"> 2016-03-01  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Expose MediaElement and VideoElement to the Objective-C DOM bindings
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -213,7 +213,7 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx">     void addPlaybackTargetPickerClient(uint64_t /*contextId*/) override;
</span><span class="cx">     void removePlaybackTargetPickerClient(uint64_t /*contextId*/) override;
</span><del>-    void showPlaybackTargetPicker(uint64_t /*contextId*/, const WebCore::IntPoint&amp;, bool /* hasVideo */) override;
</del><ins>+    void showPlaybackTargetPicker(uint64_t /*contextId*/, const WebCore::IntPoint&amp;, bool /* hasVideo */, const String&amp;) override;
</ins><span class="cx">     void playbackTargetPickerClientStateDidChange(uint64_t /*contextId*/, WebCore::MediaProducer::MediaStateFlags) override;
</span><span class="cx">     void setMockMediaPlaybackTargetPickerEnabled(bool) override;
</span><span class="cx">     void setMockMediaPlaybackTargetPickerState(const String&amp;, WebCore::MediaPlaybackTargetContext::State) override;
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebChromeClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1032,7 +1032,7 @@
</span><span class="cx">     [m_webView _removePlaybackTargetPickerClient:contextId];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebChromeClient::showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp; location, bool hasVideo)
</del><ins>+void WebChromeClient::showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp; location, bool hasVideo, const String&amp;)
</ins><span class="cx"> {
</span><span class="cx">     [m_webView _showPlaybackTargetPicker:contextId location:location hasVideo:hasVideo];
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebMediaPlaybackTargetPickerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx"> 
</span><span class="cx">     void addPlaybackTargetPickerClient(uint64_t);
</span><span class="cx">     void removePlaybackTargetPickerClient(uint64_t);
</span><del>-    void showPlaybackTargetPicker(uint64_t, const WebCore::FloatRect&amp;, bool hasVideo);
</del><ins>+    void showPlaybackTargetPicker(uint64_t, const WebCore::FloatRect&amp;, bool hasVideo, const String&amp;);
</ins><span class="cx">     void playbackTargetPickerClientStateDidChange(uint64_t, WebCore::MediaProducer::MediaStateFlags);
</span><span class="cx">     void setMockMediaPlaybackTargetPickerEnabled(bool);
</span><span class="cx">     void setMockMediaPlaybackTargetPickerState(const String&amp;, WebCore::MediaPlaybackTargetContext::State);
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx">     virtual void setPlaybackTarget(uint64_t, Ref&lt;WebCore::MediaPlaybackTarget&gt;&amp;&amp;) override;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(uint64_t, bool) override;
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(uint64_t, bool) override;
</span><ins>+    virtual void customPlaybackActionSelected(uint64_t) override;
</ins><span class="cx"> 
</span><span class="cx">     void invalidate();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebMediaPlaybackTargetPickermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.mm (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.mm        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit/mac/WebView/WebMediaPlaybackTargetPicker.mm        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -51,9 +51,9 @@
</span><span class="cx">     WebCore::WebMediaSessionManager::shared().removePlaybackTargetPickerClient(*this, contextId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebMediaPlaybackTargetPicker::showPlaybackTargetPicker(uint64_t contextId, const WebCore::FloatRect&amp; rect, bool hasVideo)
</del><ins>+void WebMediaPlaybackTargetPicker::showPlaybackTargetPicker(uint64_t contextId, const WebCore::FloatRect&amp; rect, bool hasVideo, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><del>-    WebCore::WebMediaSessionManager::shared().showPlaybackTargetPicker(*this, contextId, WebCore::IntRect(rect), hasVideo);
</del><ins>+    WebCore::WebMediaSessionManager::shared().showPlaybackTargetPicker(*this, contextId, WebCore::IntRect(rect), hasVideo, customMenuItemTitle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebMediaPlaybackTargetPicker::playbackTargetPickerClientStateDidChange(uint64_t contextId, WebCore::MediaProducer::MediaStateFlags state)
</span><span class="lines">@@ -95,6 +95,14 @@
</span><span class="cx">     m_page-&gt;setShouldPlayToPlaybackTarget(contextId, shouldPlay);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebMediaPlaybackTargetPicker::customPlaybackActionSelected(uint64_t contextId)
+{
+    if (!m_page)
+        return;
+
+    m_page-&gt;customPlaybackActionSelected(contextId);
+}
+
</ins><span class="cx"> void WebMediaPlaybackTargetPicker::invalidate()
</span><span class="cx"> {
</span><span class="cx">     m_page = nullptr;
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebView.mm        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -8739,7 +8739,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     NSRect rectInScreenCoordinates = [self.window convertRectToScreen:NSMakeRect(location.x(), location.y(), 0, 0)];
</span><del>-    [self _devicePicker]-&gt;showPlaybackTargetPicker(clientId, rectInScreenCoordinates, hasVideo);
</del><ins>+    [self _devicePicker]-&gt;showPlaybackTargetPicker(clientId, rectInScreenCoordinates, hasVideo, { });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)_playbackTargetPickerClientStateDidChange:(uint64_t)clientId state:(WebCore::MediaProducer::MediaStateFlags)state
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/ChangeLog        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-02-29  Ada Chan  &lt;adachan@apple.com&gt;
+
+        Adopt the new version of AVOutputDeviceMenuController's showMenuForRect method.
+        https://bugs.webkit.org/show_bug.cgi?id=154823
+
+        Reviewed by Tim Horton.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::showPlaybackTargetPicker):
+        (WebKit::WebPageProxy::customPlaybackActionSelected):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::showPlaybackTargetPicker):
+        * WebProcess/WebCoreSupport/WebChromeClient.h:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/mac/WebPageMac.mm:
+        (WebKit::WebPage::customPlaybackActionSelected):
+
</ins><span class="cx"> 2016-02-29  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] Stub support for WebsiteDataTypeResourceLoadStatistics
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -6106,9 +6106,9 @@
</span><span class="cx">     m_pageClient.mediaSessionManager().removePlaybackTargetPickerClient(*this, contextId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::showPlaybackTargetPicker(uint64_t contextId, const WebCore::FloatRect&amp; rect, bool hasVideo)
</del><ins>+void WebPageProxy::showPlaybackTargetPicker(uint64_t contextId, const WebCore::FloatRect&amp; rect, bool hasVideo, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><del>-    m_pageClient.mediaSessionManager().showPlaybackTargetPicker(*this, contextId, m_pageClient.rootViewToScreen(IntRect(rect)), hasVideo);
</del><ins>+    m_pageClient.mediaSessionManager().showPlaybackTargetPicker(*this, contextId, m_pageClient.rootViewToScreen(IntRect(rect)), hasVideo, customMenuItemTitle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::playbackTargetPickerClientStateDidChange(uint64_t contextId, WebCore::MediaProducer::MediaStateFlags state)
</span><span class="lines">@@ -6149,6 +6149,14 @@
</span><span class="cx"> 
</span><span class="cx">     m_process-&gt;send(Messages::WebPage::SetShouldPlayToPlaybackTarget(contextId, shouldPlay), m_pageID);
</span><span class="cx"> }
</span><ins>+
+void WebPageProxy::customPlaybackActionSelected(uint64_t contextId)
+{
+    if (!isValid())
+        return;
+
+    m_process-&gt;send(Messages::WebPage::CustomPlaybackActionSelected(contextId), m_pageID);
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::didChangeBackgroundColor()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1062,7 +1062,7 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx">     void addPlaybackTargetPickerClient(uint64_t);
</span><span class="cx">     void removePlaybackTargetPickerClient(uint64_t);
</span><del>-    void showPlaybackTargetPicker(uint64_t, const WebCore::FloatRect&amp;, bool hasVideo);
</del><ins>+    void showPlaybackTargetPicker(uint64_t, const WebCore::FloatRect&amp;, bool hasVideo, const String&amp;);
</ins><span class="cx">     void playbackTargetPickerClientStateDidChange(uint64_t, WebCore::MediaProducer::MediaStateFlags);
</span><span class="cx">     void setMockMediaPlaybackTargetPickerEnabled(bool);
</span><span class="cx">     void setMockMediaPlaybackTargetPickerState(const String&amp;, WebCore::MediaPlaybackTargetContext::State);
</span><span class="lines">@@ -1071,6 +1071,7 @@
</span><span class="cx">     virtual void setPlaybackTarget(uint64_t, Ref&lt;WebCore::MediaPlaybackTarget&gt;&amp;&amp;) override;
</span><span class="cx">     virtual void externalOutputDeviceAvailableDidChange(uint64_t, bool) override;
</span><span class="cx">     virtual void setShouldPlayToPlaybackTarget(uint64_t, bool) override;
</span><ins>+    virtual void customPlaybackActionSelected(uint64_t) override;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void didChangeBackgroundColor();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -435,7 +435,7 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx">     AddPlaybackTargetPickerClient(uint64_t contextId)
</span><span class="cx">     RemovePlaybackTargetPickerClient(uint64_t contextId)
</span><del>-    ShowPlaybackTargetPicker(uint64_t clientId, WebCore::FloatRect pickerLocation, bool hasVideo)
</del><ins>+    ShowPlaybackTargetPicker(uint64_t clientId, WebCore::FloatRect pickerLocation, bool hasVideo, String customMenuItemTitle)
</ins><span class="cx">     PlaybackTargetPickerClientStateDidChange(uint64_t contextId, unsigned mediaState)
</span><span class="cx">     SetMockMediaPlaybackTargetPickerEnabled(bool enabled)
</span><span class="cx">     SetMockMediaPlaybackTargetPickerState(String name, unsigned pickerState)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1092,11 +1092,11 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-void WebChromeClient::showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp; position, bool isVideo)
</del><ins>+void WebChromeClient::showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp; position, bool isVideo, const String&amp; customMenuItemTitle)
</ins><span class="cx"> {
</span><span class="cx">     FrameView* frameView = m_page-&gt;mainFrame()-&gt;view();
</span><span class="cx">     FloatRect rect(frameView-&gt;contentsToRootView(frameView-&gt;windowToContents(position)), FloatSize());
</span><del>-    m_page-&gt;send(Messages::WebPageProxy::ShowPlaybackTargetPicker(contextId, rect, isVideo));
</del><ins>+    m_page-&gt;send(Messages::WebPageProxy::ShowPlaybackTargetPicker(contextId, rect, isVideo, customMenuItemTitle));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebChromeClient::playbackTargetPickerClientStateDidChange(uint64_t contextId, WebCore::MediaProducer::MediaStateFlags state)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -317,7 +317,7 @@
</span><span class="cx"> #if ENABLE(WIRELESS_PLAYBACK_TARGET) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx">     void addPlaybackTargetPickerClient(uint64_t /*contextId*/) override;
</span><span class="cx">     void removePlaybackTargetPickerClient(uint64_t /*contextId*/) override;
</span><del>-    void showPlaybackTargetPicker(uint64_t contextId, const WebCore::IntPoint&amp;, bool) override;
</del><ins>+    void showPlaybackTargetPicker(uint64_t /*contextId*/, const WebCore::IntPoint&amp;, bool, const String&amp;) override;
</ins><span class="cx">     void playbackTargetPickerClientStateDidChange(uint64_t, WebCore::MediaProducer::MediaStateFlags) override;
</span><span class="cx">     void setMockMediaPlaybackTargetPickerEnabled(bool) override;
</span><span class="cx">     void setMockMediaPlaybackTargetPickerState(const String&amp;, WebCore::MediaPlaybackTargetContext::State) override;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1168,6 +1168,7 @@
</span><span class="cx">     void playbackTargetSelected(uint64_t, const WebCore::MediaPlaybackTargetContext&amp; outputDevice) const;
</span><span class="cx">     void playbackTargetAvailabilityDidChange(uint64_t, bool);
</span><span class="cx">     void setShouldPlayToPlaybackTarget(uint64_t, bool);
</span><ins>+    void customPlaybackActionSelected(uint64_t);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void clearWheelEventTestTrigger();
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -414,6 +414,7 @@
</span><span class="cx">     PlaybackTargetSelected(uint64_t contextId, WebCore::MediaPlaybackTargetContext target)
</span><span class="cx">     PlaybackTargetAvailabilityDidChange(uint64_t contextId, bool available)
</span><span class="cx">     SetShouldPlayToPlaybackTarget(uint64_t contextId, bool shouldPlay)
</span><ins>+    CustomPlaybackActionSelected(uint64_t contextId)
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     ClearWheelEventTestTrigger()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (197428 => 197429)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2016-03-02 01:08:53 UTC (rev 197428)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2016-03-02 01:15:09 UTC (rev 197429)
</span><span class="lines">@@ -1159,6 +1159,11 @@
</span><span class="cx"> {
</span><span class="cx">     m_page-&gt;setShouldPlayToPlaybackTarget(contextId, shouldPlay);
</span><span class="cx"> }
</span><ins>+
+void WebPage::customPlaybackActionSelected(uint64_t contextId)
+{
+    m_page-&gt;customPlaybackActionSelected(contextId);
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>