<!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>[203982] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/203982">203982</a></dd>
<dt>Author</dt> <dd>eric.carlson@apple.com</dd>
<dt>Date</dt> <dd>2016-08-01 12:49:02 -0700 (Mon, 01 Aug 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>[Mac][iOS] Adopt MediaRemote "seek to playback position"
https://bugs.webkit.org/show_bug.cgi?id=160405
<rdar://problem/27547583>
Reviewed by Dean Jackson.
Source/WebCore:
Test: media/remote-control-command-seek.html
* Modules/webaudio/AudioContext.h: Update for didReceiveRemoteControlCommand argument change.
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::didReceiveRemoteControlCommand): Support SeekToPlaybackPositionCommand.
Drive by fix, support Stop command.
(WebCore::HTMLMediaElement::supportsSeeking): New.
* html/HTMLMediaElement.h:
* platform/RemoteCommandListener.h:
(WebCore::RemoteCommandListenerClient::didReceiveRemoteControlCommand): Add command argument.
(WebCore::RemoteCommandListenerClient::supportsSeeking): New.
(WebCore::RemoteCommandListener::updateSupportedCommands): Ditto.
(WebCore::RemoteCommandListener::client): Ditto.
* platform/audio/PlatformMediaSession.cpp:
(WebCore::PlatformMediaSession::didReceiveRemoteControlCommand): Add command argument.
(WebCore::PlatformMediaSession::supportsSeeking): New, pass through to client.
* platform/audio/PlatformMediaSession.h:
* platform/audio/PlatformMediaSessionManager.cpp:
(WebCore::PlatformMediaSessionManager::setCurrentSession): Tell remote command listener to
update supported commands.
(WebCore::PlatformMediaSessionManager::currentSession): Make const.
(WebCore::PlatformMediaSessionManager::didReceiveRemoteControlCommand): Add command argument.
(WebCore::PlatformMediaSessionManager::supportsSeeking): New, pass through to session.
* platform/audio/PlatformMediaSessionManager.h:
* platform/ios/RemoteCommandListenerIOS.h:
(WebCore::RemoteCommandListenerIOS::createWeakPtr):
* platform/ios/RemoteCommandListenerIOS.mm:
(WebCore::RemoteCommandListenerIOS::RemoteCommandListenerIOS): Support changePlaybackPositionCommand.
(WebCore::RemoteCommandListenerIOS::~RemoteCommandListenerIOS): Remove seekToTime target.
(WebCore::RemoteCommandListenerIOS::updateSupportedCommands): Update changePlaybackPositionCommand.
* platform/mac/MediaRemoteSoftLink.cpp:
* platform/mac/MediaRemoteSoftLink.h:
* platform/mac/RemoteCommandListenerMac.h:
* platform/mac/RemoteCommandListenerMac.mm:
(WebCore::RemoteCommandListenerMac::updateSupportedCommands): New, split out of constructor.
(WebCore::RemoteCommandListenerMac::RemoteCommandListenerMac): Split setup logic out into
updateSupportedCommands. Support MRMediaRemoteCommandSeekToPlaybackPosition. Don't assert when
receiving an unsupported command, it happens. Return error when a command isn't supported or
fails.
* testing/Internals.cpp:
(WebCore::Internals::postRemoteControlCommand): Add command argument parameter. Support
seektoplaybackposition.
* testing/Internals.h:
* testing/Internals.idl:
LayoutTests:
* media/remote-control-command-seek-expected.txt: Added.
* media/remote-control-command-seek.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioContexth">trunk/Source/WebCore/Modules/webaudio/AudioContext.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="#trunkSourceWebCoreplatformRemoteCommandListenerh">trunk/Source/WebCore/platform/RemoteCommandListener.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioPlatformMediaSessioncpp">trunk/Source/WebCore/platform/audio/PlatformMediaSession.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioPlatformMediaSessionh">trunk/Source/WebCore/platform/audio/PlatformMediaSession.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioPlatformMediaSessionManagercpp">trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioPlatformMediaSessionManagerh">trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosRemoteCommandListenerIOSh">trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosRemoteCommandListenerIOSmm">trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmacMediaRemoteSoftLinkcpp">trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmacMediaRemoteSoftLinkh">trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmacRemoteCommandListenerMach">trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmacRemoteCommandListenerMacmm">trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.mm</a></li>
<li><a href="#trunkSourceWebCoretestingInternalscpp">trunk/Source/WebCore/testing/Internals.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsh">trunk/Source/WebCore/testing/Internals.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsidl">trunk/Source/WebCore/testing/Internals.idl</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmediaremotecontrolcommandseekexpectedtxt">trunk/LayoutTests/media/remote-control-command-seek-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediaremotecontrolcommandseekhtml">trunk/LayoutTests/media/remote-control-command-seek.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/LayoutTests/ChangeLog        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-08-01 Eric Carlson <eric.carlson@apple.com>
+
+ [Mac][iOS] Adopt MediaRemote "seek to playback position"
+ https://bugs.webkit.org/show_bug.cgi?id=160405
+ <rdar://problem/27547583>
+
+ Reviewed by Dean Jackson.
+
+ * media/remote-control-command-seek-expected.txt: Added.
+ * media/remote-control-command-seek.html: Added.
+
</ins><span class="cx"> 2016-08-01 Adrian Perez de Castro <aperez@igalia.com>
</span><span class="cx">
</span><span class="cx"> Update Apache configuration for Arch Linux
</span></span></pre></div>
<a id="trunkLayoutTestsmediaremotecontrolcommandseekexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/remote-control-command-seek-expected.txt (0 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/remote-control-command-seek-expected.txt         (rev 0)
+++ trunk/LayoutTests/media/remote-control-command-seek-expected.txt        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+Test that the "seekToPlaybackPosition" remote control command works.
+
+
+* set video.src
+EVENT(loadedmetadata)
+
+* Send a seek command.
+RUN(internals.postRemoteControlCommand('seekToPlaybackPosition', 1.6))
+
+EVENT(timeupdate)
+EXPECTED (video.currentTime.toFixed(1) == '1.6') OK
+
+END OF TEST
+
</ins></span></pre></div>
<a id="trunkLayoutTestsmediaremotecontrolcommandseekhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/remote-control-command-seek.html (0 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/remote-control-command-seek.html         (rev 0)
+++ trunk/LayoutTests/media/remote-control-command-seek.html        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+<html>
+ <head>
+ <script src="media-file.js"></script>
+ <script src="video-test.js"></script>
+ <script>
+
+ function start()
+ {
+ if (!window.internals) {
+ failTest('This test requires window.internals.');
+ return;
+ }
+
+ findMediaElement();
+
+ waitForEvent('loadedmetadata', loadedmetadata, false, true, document)
+ waitForEvent('timeupdate', seeked)
+
+ consoleWrite('* set video.src');
+ video.src = findMediaFile('video', 'content/test');
+ }
+
+ function loadedmetadata()
+ {
+ consoleWrite('<br>* Send a seek command.');
+ run("internals.postRemoteControlCommand('seekToPlaybackPosition', 1.6)");
+ consoleWrite('');
+ }
+
+ function seeked()
+ {
+ testExpected('video.currentTime.toFixed(1)', 1.6);
+ consoleWrite("");
+ endTest();
+ }
+
+ </script>
+ </head>
+
+ <body onload="start()">
+ <p>Test that the "seekToPlaybackPosition" remote control command works.</p>
+ <video controls></video>
+ </body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/ChangeLog        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -1,3 +1,64 @@
</span><ins>+2016-08-01 Eric Carlson <eric.carlson@apple.com>
+
+ [Mac][iOS] Adopt MediaRemote "seek to playback position"
+ https://bugs.webkit.org/show_bug.cgi?id=160405
+ <rdar://problem/27547583>
+
+ Reviewed by Dean Jackson.
+
+ Test: media/remote-control-command-seek.html
+
+ * Modules/webaudio/AudioContext.h: Update for didReceiveRemoteControlCommand argument change.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::didReceiveRemoteControlCommand): Support SeekToPlaybackPositionCommand.
+ Drive by fix, support Stop command.
+ (WebCore::HTMLMediaElement::supportsSeeking): New.
+ * html/HTMLMediaElement.h:
+
+ * platform/RemoteCommandListener.h:
+ (WebCore::RemoteCommandListenerClient::didReceiveRemoteControlCommand): Add command argument.
+ (WebCore::RemoteCommandListenerClient::supportsSeeking): New.
+ (WebCore::RemoteCommandListener::updateSupportedCommands): Ditto.
+ (WebCore::RemoteCommandListener::client): Ditto.
+
+ * platform/audio/PlatformMediaSession.cpp:
+ (WebCore::PlatformMediaSession::didReceiveRemoteControlCommand): Add command argument.
+ (WebCore::PlatformMediaSession::supportsSeeking): New, pass through to client.
+ * platform/audio/PlatformMediaSession.h:
+
+ * platform/audio/PlatformMediaSessionManager.cpp:
+ (WebCore::PlatformMediaSessionManager::setCurrentSession): Tell remote command listener to
+ update supported commands.
+ (WebCore::PlatformMediaSessionManager::currentSession): Make const.
+ (WebCore::PlatformMediaSessionManager::didReceiveRemoteControlCommand): Add command argument.
+ (WebCore::PlatformMediaSessionManager::supportsSeeking): New, pass through to session.
+ * platform/audio/PlatformMediaSessionManager.h:
+
+ * platform/ios/RemoteCommandListenerIOS.h:
+ (WebCore::RemoteCommandListenerIOS::createWeakPtr):
+ * platform/ios/RemoteCommandListenerIOS.mm:
+ (WebCore::RemoteCommandListenerIOS::RemoteCommandListenerIOS): Support changePlaybackPositionCommand.
+ (WebCore::RemoteCommandListenerIOS::~RemoteCommandListenerIOS): Remove seekToTime target.
+ (WebCore::RemoteCommandListenerIOS::updateSupportedCommands): Update changePlaybackPositionCommand.
+
+ * platform/mac/MediaRemoteSoftLink.cpp:
+ * platform/mac/MediaRemoteSoftLink.h:
+
+ * platform/mac/RemoteCommandListenerMac.h:
+ * platform/mac/RemoteCommandListenerMac.mm:
+ (WebCore::RemoteCommandListenerMac::updateSupportedCommands): New, split out of constructor.
+ (WebCore::RemoteCommandListenerMac::RemoteCommandListenerMac): Split setup logic out into
+ updateSupportedCommands. Support MRMediaRemoteCommandSeekToPlaybackPosition. Don't assert when
+ receiving an unsupported command, it happens. Return error when a command isn't supported or
+ fails.
+
+ * testing/Internals.cpp:
+ (WebCore::Internals::postRemoteControlCommand): Add command argument parameter. Support
+ seektoplaybackposition.
+ * testing/Internals.h:
+ * testing/Internals.idl:
+
</ins><span class="cx"> 2016-08-01 Anders Carlsson <andersca@apple.com>
</span><span class="cx">
</span><span class="cx"> Freeze DOMHTMLTitleElement and DOMHTMLUListElement bindings
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioContext.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -314,7 +314,8 @@
</span><span class="cx"> void mayResumePlayback(bool shouldResume) override;
</span><span class="cx"> void suspendPlayback() override;
</span><span class="cx"> bool canReceiveRemoteControlCommands() const override { return false; }
</span><del>- void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) override { }
</del><ins>+ void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*) override { }
+ bool supportsSeeking() const override { return false; }
</ins><span class="cx"> bool shouldOverrideBackgroundPlaybackRestriction(PlatformMediaSession::InterruptionType) const override { return false; }
</span><span class="cx">
</span><span class="cx"> // EventTarget
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -6837,7 +6837,7 @@
</span><span class="cx"> return m_currentSrc;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void HTMLMediaElement::didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType command)
</del><ins>+void HTMLMediaElement::didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType command, const PlatformMediaSession::RemoteCommandArgument* argument)
</ins><span class="cx"> {
</span><span class="cx"> LOG(Media, "HTMLMediaElement::didReceiveRemoteControlCommand(%p) - %i", this, static_cast<int>(command));
</span><span class="cx">
</span><span class="lines">@@ -6846,6 +6846,7 @@
</span><span class="cx"> case PlatformMediaSession::PlayCommand:
</span><span class="cx"> play();
</span><span class="cx"> break;
</span><ins>+ case PlatformMediaSession::StopCommand:
</ins><span class="cx"> case PlatformMediaSession::PauseCommand:
</span><span class="cx"> pause();
</span><span class="cx"> break;
</span><span class="lines">@@ -6862,11 +6863,21 @@
</span><span class="cx"> case PlatformMediaSession::EndSeekingForwardCommand:
</span><span class="cx"> endScanning();
</span><span class="cx"> break;
</span><ins>+ case PlatformMediaSession::SeekToPlaybackPositionCommand:
+ ASSERT(argument);
+ if (argument)
+ fastSeek(argument->asDouble);
+ break;
</ins><span class="cx"> default:
</span><span class="cx"> { } // Do nothing
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+bool HTMLMediaElement::supportsSeeking() const
+{
+ return !isLiveStream();
+}
+
</ins><span class="cx"> bool HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction(PlatformMediaSession::InterruptionType type) const
</span><span class="cx"> {
</span><span class="cx"> if (type == PlatformMediaSession::EnteringBackground) {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -616,7 +616,7 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> bool mediaPlayerShouldWaitForResponseToAuthenticationChallenge(const AuthenticationChallenge&) override;
</span><del>- void mediaPlayerHandlePlaybackCommand(PlatformMediaSession::RemoteControlCommandType command) override { didReceiveRemoteControlCommand(command); }
</del><ins>+ void mediaPlayerHandlePlaybackCommand(PlatformMediaSession::RemoteControlCommandType command) override { didReceiveRemoteControlCommand(command, nullptr); }
</ins><span class="cx"> String mediaPlayerSourceApplicationIdentifier() const override;
</span><span class="cx"> Vector<String> mediaPlayerPreferredAudioCharacteristics() const override;
</span><span class="cx">
</span><span class="lines">@@ -757,7 +757,8 @@
</span><span class="cx"> double mediaSessionDuration() const override { return duration(); }
</span><span class="cx"> double mediaSessionCurrentTime() const override { return currentTime(); }
</span><span class="cx"> bool canReceiveRemoteControlCommands() const override { return true; }
</span><del>- void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) override;
</del><ins>+ void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*) override;
+ bool supportsSeeking() const override;
</ins><span class="cx"> bool shouldOverrideBackgroundPlaybackRestriction(PlatformMediaSession::InterruptionType) const override;
</span><span class="cx"> bool shouldOverrideBackgroundLoadingRestriction() const override;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformRemoteCommandListenerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/RemoteCommandListener.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/RemoteCommandListener.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/RemoteCommandListener.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -34,7 +34,8 @@
</span><span class="cx"> WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx"> virtual ~RemoteCommandListenerClient() { }
</span><del>- virtual void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) = 0;
</del><ins>+ virtual void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*) = 0;
+ virtual bool supportsSeeking() const = 0;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> class RemoteCommandListener {
</span><span class="lines">@@ -43,6 +44,10 @@
</span><span class="cx"> RemoteCommandListener(RemoteCommandListenerClient& client) : m_client(client) { }
</span><span class="cx"> virtual ~RemoteCommandListener() { }
</span><span class="cx">
</span><ins>+ virtual void updateSupportedCommands() { }
+
+ RemoteCommandListenerClient& client() const { return m_client; }
+
</ins><span class="cx"> protected:
</span><span class="cx"> RemoteCommandListenerClient& m_client;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioPlatformMediaSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSession.cpp (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/PlatformMediaSession.cpp        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSession.cpp        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -242,11 +242,16 @@
</span><span class="cx"> return m_client.canReceiveRemoteControlCommands();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void PlatformMediaSession::didReceiveRemoteControlCommand(RemoteControlCommandType command)
</del><ins>+void PlatformMediaSession::didReceiveRemoteControlCommand(RemoteControlCommandType command, const PlatformMediaSession::RemoteCommandArgument* argument)
</ins><span class="cx"> {
</span><del>- m_client.didReceiveRemoteControlCommand(command);
</del><ins>+ m_client.didReceiveRemoteControlCommand(command, argument);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+bool PlatformMediaSession::supportsSeeking() const
+{
+ return m_client.supportsSeeking();
+}
+
</ins><span class="cx"> void PlatformMediaSession::visibilityChanged()
</span><span class="cx"> {
</span><span class="cx"> scheduleClientDataBufferingCheck();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioPlatformMediaSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSession.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/PlatformMediaSession.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSession.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -114,6 +114,10 @@
</span><span class="cx"> double currentTime() const;
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+ typedef union {
+ double asDouble;
+ } RemoteCommandArgument;
+
</ins><span class="cx"> enum RemoteControlCommandType {
</span><span class="cx"> NoCommand,
</span><span class="cx"> PlayCommand,
</span><span class="lines">@@ -124,9 +128,11 @@
</span><span class="cx"> EndSeekingBackwardCommand,
</span><span class="cx"> BeginSeekingForwardCommand,
</span><span class="cx"> EndSeekingForwardCommand,
</span><ins>+ SeekToPlaybackPositionCommand,
</ins><span class="cx"> };
</span><span class="cx"> bool canReceiveRemoteControlCommands() const;
</span><del>- void didReceiveRemoteControlCommand(RemoteControlCommandType);
</del><ins>+ void didReceiveRemoteControlCommand(RemoteControlCommandType, const RemoteCommandArgument* argument = nullptr);
+ bool supportsSeeking() const;
</ins><span class="cx">
</span><span class="cx"> enum DisplayType {
</span><span class="cx"> Normal,
</span><span class="lines">@@ -202,7 +208,8 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> virtual bool canReceiveRemoteControlCommands() const = 0;
</span><del>- virtual void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) = 0;
</del><ins>+ virtual void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*) = 0;
+ virtual bool supportsSeeking() const = 0;
</ins><span class="cx">
</span><span class="cx"> virtual void setShouldBufferData(bool) { }
</span><span class="cx"> virtual bool elementIsHidden() const { return false; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioPlatformMediaSessionManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -266,11 +266,13 @@
</span><span class="cx">
</span><span class="cx"> m_sessions.remove(index);
</span><span class="cx"> m_sessions.insert(0, &session);
</span><ins>+ if (m_remoteCommandListener)
+ m_remoteCommandListener->updateSupportedCommands();
</ins><span class="cx">
</span><span class="cx"> LOG(Media, "PlatformMediaSessionManager::setCurrentSession - session moved from index %zu to 0", index);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-PlatformMediaSession* PlatformMediaSessionManager::currentSession()
</del><ins>+PlatformMediaSession* PlatformMediaSessionManager::currentSession() const
</ins><span class="cx"> {
</span><span class="cx"> if (!m_sessions.size())
</span><span class="cx"> return nullptr;
</span><span class="lines">@@ -344,14 +346,22 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-void PlatformMediaSessionManager::didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType command)
</del><ins>+void PlatformMediaSessionManager::didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType command, const PlatformMediaSession::RemoteCommandArgument* argument)
</ins><span class="cx"> {
</span><span class="cx"> PlatformMediaSession* activeSession = currentSession();
</span><span class="cx"> if (!activeSession || !activeSession->canReceiveRemoteControlCommands())
</span><span class="cx"> return;
</span><del>- activeSession->didReceiveRemoteControlCommand(command);
</del><ins>+ activeSession->didReceiveRemoteControlCommand(command, argument);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+bool PlatformMediaSessionManager::supportsSeeking() const
+{
+ PlatformMediaSession* activeSession = currentSession();
+ if (!activeSession)
+ return false;
+ return activeSession->supportsSeeking();
+}
+
</ins><span class="cx"> void PlatformMediaSessionManager::systemWillSleep()
</span><span class="cx"> {
</span><span class="cx"> if (m_interrupted)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioPlatformMediaSessionManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> void setCurrentSession(PlatformMediaSession&);
</span><del>- PlatformMediaSession* currentSession();
</del><ins>+ PlatformMediaSession* currentSession() const;
</ins><span class="cx">
</span><span class="cx"> PlatformMediaSession* currentSessionMatching(std::function<bool(const PlatformMediaSession&)>);
</span><span class="cx">
</span><span class="lines">@@ -112,7 +112,8 @@
</span><span class="cx"> void updateSessionState();
</span><span class="cx">
</span><span class="cx"> // RemoteCommandListenerClient
</span><del>- WEBCORE_EXPORT void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType) override;
</del><ins>+ WEBCORE_EXPORT void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*) override;
+ WEBCORE_EXPORT bool supportsSeeking() const override;
</ins><span class="cx">
</span><span class="cx"> // AudioHardwareListenerClient
</span><span class="cx"> void audioHardwareDidBecomeActive() override { }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosRemoteCommandListenerIOSh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -46,7 +46,8 @@
</span><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> WeakPtr<RemoteCommandListenerIOS> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
</span><del>-
</del><ins>+ void updateSupportedCommands() override;
+
</ins><span class="cx"> WeakPtrFactory<RemoteCommandListenerIOS> m_weakPtrFactory;
</span><span class="cx"> RetainPtr<id> m_playTarget;
</span><span class="cx"> RetainPtr<id> m_pauseTarget;
</span><span class="lines">@@ -53,6 +54,7 @@
</span><span class="cx"> RetainPtr<id> m_togglePlayPauseTarget;
</span><span class="cx"> RetainPtr<id> m_seekForwardTarget;
</span><span class="cx"> RetainPtr<id> m_seekBackwardTarget;
</span><ins>+ RetainPtr<id> m_seekToTimeTarget;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosRemoteCommandListenerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.mm (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.mm        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/ios/RemoteCommandListenerIOS.mm        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -36,6 +36,9 @@
</span><span class="cx"> SOFT_LINK_FRAMEWORK(MediaPlayer)
</span><span class="cx"> SOFT_LINK_CLASS(MediaPlayer, MPRemoteCommandCenter)
</span><span class="cx"> SOFT_LINK_CLASS(MediaPlayer, MPSeekCommandEvent)
</span><ins>+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90100
+SOFT_LINK_CLASS(MediaPlayer, MPChangePlaybackPositionCommandEvent)
+#endif
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -55,7 +58,7 @@
</span><span class="cx"> callOnMainThread([weakThis] {
</span><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><del>- weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::PauseCommand);
</del><ins>+ weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::PauseCommand, nullptr);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return MPRemoteCommandHandlerStatusSuccess;
</span><span class="lines">@@ -65,7 +68,7 @@
</span><span class="cx"> callOnMainThread([weakThis] {
</span><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><del>- weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::PlayCommand);
</del><ins>+ weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::PlayCommand, nullptr);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return MPRemoteCommandHandlerStatusSuccess;
</span><span class="lines">@@ -75,7 +78,7 @@
</span><span class="cx"> callOnMainThread([weakThis] {
</span><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><del>- weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::TogglePlayPauseCommand);
</del><ins>+ weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::TogglePlayPauseCommand, nullptr);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return MPRemoteCommandHandlerStatusSuccess;
</span><span class="lines">@@ -90,7 +93,7 @@
</span><span class="cx"> callOnMainThread([weakThis, command] {
</span><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><del>- weakThis->m_client.didReceiveRemoteControlCommand(command);
</del><ins>+ weakThis->m_client.didReceiveRemoteControlCommand(command, nullptr);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return MPRemoteCommandHandlerStatusSuccess;
</span><span class="lines">@@ -105,11 +108,31 @@
</span><span class="cx"> callOnMainThread([weakThis, command] {
</span><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><del>- weakThis->m_client.didReceiveRemoteControlCommand(command);
</del><ins>+ weakThis->m_client.didReceiveRemoteControlCommand(command, nullptr);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return MPRemoteCommandHandlerStatusSuccess;
</span><span class="cx"> }];
</span><ins>+
+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90100
+ m_seekToTimeTarget = [[center changePlaybackPositionCommand] addTargetWithHandler:^(MPRemoteCommandEvent *event) {
+ ASSERT([event isKindOfClass:getMPChangePlaybackPositionCommandEventClass()]);
+
+ if (!client.supportsSeeking())
+ return MPRemoteCommandHandlerStatusCommandFailed;
+
+ MPChangePlaybackPositionCommandEvent* seekEvent = static_cast<MPChangePlaybackPositionCommandEvent *>(event);
+ PlatformMediaSession::RemoteCommandArgument argument { [seekEvent positionTime] };
+
+ callOnMainThread([weakThis, argument] {
+ if (!weakThis)
+ return;
+ weakThis->m_client.didReceiveRemoteControlCommand(PlatformMediaSession::TogglePlayPauseCommand, &argument);
+ });
+
+ return MPRemoteCommandHandlerStatusSuccess;
+ }];
+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RemoteCommandListenerIOS::~RemoteCommandListenerIOS()
</span><span class="lines">@@ -120,8 +143,18 @@
</span><span class="cx"> [[center togglePlayPauseCommand] removeTarget:m_togglePlayPauseTarget.get()];
</span><span class="cx"> [[center seekForwardCommand] removeTarget:m_seekForwardTarget.get()];
</span><span class="cx"> [[center seekBackwardCommand] removeTarget:m_seekBackwardTarget.get()];
</span><ins>+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90100
+ [[center changePlaybackPositionCommand] removeTarget:m_seekToTimeTarget.get()];
+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void RemoteCommandListenerIOS::updateSupportedCommands()
+{
+#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90100
+ [[[getMPRemoteCommandCenterClass() sharedCommandCenter] changePlaybackPositionCommand] setEnabled:!!client().supportsSeeking()];
+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+}
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacMediaRemoteSoftLinkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.cpp (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.cpp        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.cpp        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -46,5 +46,6 @@
</span><span class="cx"> SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, MediaRemote, kMRMediaRemoteNowPlayingInfoDuration, CFStringRef);
</span><span class="cx"> SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, MediaRemote, kMRMediaRemoteNowPlayingInfoElapsedTime, CFStringRef);
</span><span class="cx"> SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, MediaRemote, kMRMediaRemoteNowPlayingInfoPlaybackRate, CFStringRef);
</span><ins>+SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, MediaRemote, kMRMediaRemoteOptionPlaybackPosition, CFStringRef);
</ins><span class="cx">
</span><span class="cx"> #endif // USE(MEDIAREMOTE)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacMediaRemoteSoftLinkh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/mac/MediaRemoteSoftLink.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -61,5 +61,7 @@
</span><span class="cx"> #define kMRMediaRemoteNowPlayingInfoElapsedTime get_MediaRemote_kMRMediaRemoteNowPlayingInfoElapsedTime()
</span><span class="cx"> SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, MediaRemote, kMRMediaRemoteNowPlayingInfoPlaybackRate, CFStringRef);
</span><span class="cx"> #define kMRMediaRemoteNowPlayingInfoPlaybackRate get_MediaRemote_kMRMediaRemoteNowPlayingInfoPlaybackRate()
</span><ins>+SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, MediaRemote, kMRMediaRemoteOptionPlaybackPosition, CFStringRef);
+#define kMRMediaRemoteOptionPlaybackPosition get_MediaRemote_kMRMediaRemoteOptionPlaybackPosition()
</ins><span class="cx">
</span><span class="cx"> #endif // USE(MEDIAREMOTE)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacRemoteCommandListenerMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -42,6 +42,8 @@
</span><span class="cx"> protected:
</span><span class="cx"> WeakPtr<RemoteCommandListenerMac> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
</span><span class="cx">
</span><ins>+ void updateSupportedCommands() override;
+
</ins><span class="cx"> WeakPtrFactory<RemoteCommandListenerMac> m_weakPtrFactory { this };
</span><span class="cx"> void* m_commandHandler { nullptr };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacRemoteCommandListenerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.mm (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.mm        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/platform/mac/RemoteCommandListenerMac.mm        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -40,8 +40,7 @@
</span><span class="cx"> return std::make_unique<RemoteCommandListenerMac>(client);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RemoteCommandListenerMac::RemoteCommandListenerMac(RemoteCommandListenerClient& client)
- : RemoteCommandListener(client)
</del><ins>+void RemoteCommandListenerMac::updateSupportedCommands()
</ins><span class="cx"> {
</span><span class="cx"> #if USE(MEDIAREMOTE)
</span><span class="cx"> if (!isMediaRemoteFrameworkAvailable())
</span><span class="lines">@@ -66,13 +65,32 @@
</span><span class="cx"> CFArrayAppendValue(commandInfoArray.get(), commandInfo.get());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ auto seekCommandInfo = adoptCF(MRMediaRemoteCommandInfoCreate(kCFAllocatorDefault));
+ MRMediaRemoteCommandInfoSetCommand(seekCommandInfo.get(), MRMediaRemoteCommandSeekToPlaybackPosition);
+ MRMediaRemoteCommandInfoSetEnabled(seekCommandInfo.get(), client().supportsSeeking());
+ CFArrayAppendValue(commandInfoArray.get(), seekCommandInfo.get());
+
</ins><span class="cx"> MRMediaRemoteSetSupportedCommands(commandInfoArray.get(), MRMediaRemoteGetLocalOrigin(), nullptr, nullptr);
</span><ins>+#endif // USE(MEDIAREMOTE)
+}
</ins><span class="cx">
</span><ins>+RemoteCommandListenerMac::RemoteCommandListenerMac(RemoteCommandListenerClient& client)
+ : RemoteCommandListener(client)
+{
+#if USE(MEDIAREMOTE)
+ if (!isMediaRemoteFrameworkAvailable())
+ return;
+
+ updateSupportedCommands();
+
</ins><span class="cx"> auto weakThis = createWeakPtr();
</span><span class="cx"> m_commandHandler = MRMediaRemoteAddAsyncCommandHandlerBlock(^(MRMediaRemoteCommand command, CFDictionaryRef options, void(^completion)(CFArrayRef)) {
</span><del>- UNUSED_PARAM(options);
</del><span class="cx">
</span><ins>+ LOG(Media, "RemoteCommandListenerMac::RemoteCommandListenerMac - received command %u", command);
+
</ins><span class="cx"> PlatformMediaSession::RemoteControlCommandType platformCommand { PlatformMediaSession::NoCommand };
</span><ins>+ PlatformMediaSession::RemoteCommandArgument argument { 0 };
+ MRMediaRemoteCommandHandlerStatus status = MRMediaRemoteCommandHandlerStatusSuccess;
</ins><span class="cx">
</span><span class="cx"> switch (command) {
</span><span class="cx"> case MRMediaRemoteCommandPlay:
</span><span class="lines">@@ -81,6 +99,9 @@
</span><span class="cx"> case MRMediaRemoteCommandPause:
</span><span class="cx"> platformCommand = PlatformMediaSession::PauseCommand;
</span><span class="cx"> break;
</span><ins>+ case MRMediaRemoteCommandStop:
+ platformCommand = PlatformMediaSession::StopCommand;
+ break;
</ins><span class="cx"> case MRMediaRemoteCommandTogglePlayPause:
</span><span class="cx"> platformCommand = PlatformMediaSession::TogglePlayPauseCommand;
</span><span class="cx"> break;
</span><span class="lines">@@ -96,14 +117,32 @@
</span><span class="cx"> case MRMediaRemoteCommandEndRewind:
</span><span class="cx"> platformCommand = PlatformMediaSession::EndSeekingBackwardCommand;
</span><span class="cx"> break;
</span><ins>+ case MRMediaRemoteCommandSeekToPlaybackPosition: {
+ if (!client.supportsSeeking()) {
+ status = MRMediaRemoteCommandHandlerStatusCommandFailed;
+ break;
+ }
+
+ CFNumberRef positionRef = static_cast<CFNumberRef>(CFDictionaryGetValue(options, kMRMediaRemoteOptionPlaybackPosition));
+ if (!positionRef) {
+ status = MRMediaRemoteCommandHandlerStatusCommandFailed;
+ break;
+ }
+
+ CFNumberGetValue(positionRef, kCFNumberDoubleType, &argument.asDouble);
+ platformCommand = PlatformMediaSession::SeekToPlaybackPositionCommand;
+ break;
+ }
</ins><span class="cx"> default:
</span><del>- ASSERT_NOT_REACHED();
</del><ins>+ LOG(Media, "RemoteCommandListenerMac::RemoteCommandListenerMac - command %u not supported!", command);
+ status = MRMediaRemoteCommandHandlerStatusCommandFailed;
+ return;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><del>- weakThis->m_client.didReceiveRemoteControlCommand(platformCommand);
- completion(static_cast<CFArrayRef>(@[@0]));
</del><ins>+ weakThis->m_client.didReceiveRemoteControlCommand(platformCommand, &argument);
+ completion(static_cast<CFArrayRef>(@[@(status)]));
</ins><span class="cx"> });
</span><span class="cx"> #endif // USE(MEDIAREMOTE)
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.cpp (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.cpp        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/testing/Internals.cpp        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -2880,10 +2880,11 @@
</span><span class="cx"> element.mediaSession().addBehaviorRestriction(restrictions);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Internals::postRemoteControlCommand(const String& commandString, ExceptionCode& ec)
</del><ins>+void Internals::postRemoteControlCommand(const String& commandString, float argument, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> PlatformMediaSession::RemoteControlCommandType command;
</span><del>-
</del><ins>+ PlatformMediaSession::RemoteCommandArgument parameter { argument };
+
</ins><span class="cx"> if (equalLettersIgnoringASCIICase(commandString, "play"))
</span><span class="cx"> command = PlatformMediaSession::PlayCommand;
</span><span class="cx"> else if (equalLettersIgnoringASCIICase(commandString, "pause"))
</span><span class="lines">@@ -2900,12 +2901,14 @@
</span><span class="cx"> command = PlatformMediaSession::BeginSeekingForwardCommand;
</span><span class="cx"> else if (equalLettersIgnoringASCIICase(commandString, "endseekingforward"))
</span><span class="cx"> command = PlatformMediaSession::EndSeekingForwardCommand;
</span><ins>+ else if (equalLettersIgnoringASCIICase(commandString, "seektoplaybackposition"))
+ command = PlatformMediaSession::SeekToPlaybackPositionCommand;
</ins><span class="cx"> else {
</span><span class="cx"> ec = INVALID_ACCESS_ERR;
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- PlatformMediaSessionManager::sharedManager().didReceiveRemoteControlCommand(command);
</del><ins>+ PlatformMediaSessionManager::sharedManager().didReceiveRemoteControlCommand(command, &parameter);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool Internals::elementIsBlockingDisplaySleep(HTMLMediaElement& element) const
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.h (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.h        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/testing/Internals.h        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -411,7 +411,7 @@
</span><span class="cx"> void applicationWillEnterBackground() const;
</span><span class="cx"> void setMediaSessionRestrictions(const String& mediaType, const String& restrictions, ExceptionCode&);
</span><span class="cx"> void setMediaElementRestrictions(HTMLMediaElement&, const String& restrictions);
</span><del>- void postRemoteControlCommand(const String&, ExceptionCode&);
</del><ins>+ void postRemoteControlCommand(const String&, float argument, ExceptionCode&);
</ins><span class="cx"> bool elementIsBlockingDisplaySleep(HTMLMediaElement&) const;
</span><span class="cx"> #endif
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.idl (203981 => 203982)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.idl        2016-08-01 19:35:11 UTC (rev 203981)
+++ trunk/Source/WebCore/testing/Internals.idl        2016-08-01 19:49:02 UTC (rev 203982)
</span><span class="lines">@@ -406,7 +406,7 @@
</span><span class="cx"> [Conditional=VIDEO, RaisesException] void setMediaSessionRestrictions(DOMString mediaType, DOMString restrictions);
</span><span class="cx"> [Conditional=VIDEO] void setMediaElementRestrictions(HTMLMediaElement element, DOMString restrictions);
</span><span class="cx"> [Conditional=WEB_AUDIO] void setAudioContextRestrictions(AudioContext context, DOMString restrictions);
</span><del>- [Conditional=VIDEO, RaisesException] void postRemoteControlCommand(DOMString command);
</del><ins>+ [Conditional=VIDEO, RaisesException] void postRemoteControlCommand(DOMString command, optional unrestricted float argument = 0);
</ins><span class="cx"> [Conditional=WIRELESS_PLAYBACK_TARGET] void setMockMediaPlaybackTargetPickerEnabled(boolean enabled);
</span><span class="cx"> [Conditional=WIRELESS_PLAYBACK_TARGET, RaisesException] void setMockMediaPlaybackTargetPickerState(DOMString deviceName, DOMString deviceState);
</span><span class="cx"> [Conditional=MEDIA_STREAM] void setMockMediaCaptureDevicesEnabled(boolean enabled);
</span></span></pre>
</div>
</div>
</body>
</html>