<!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>[205709] branches/safari-602-branch/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/205709">205709</a></dd>
<dt>Author</dt> <dd>bshafiei@apple.com</dd>
<dt>Date</dt> <dd>2016-09-09 01:42:16 -0700 (Fri, 09 Sep 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/205365">r205365</a>. rdar://problem/28020157</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari602branchSourceWebCoreChangeLog">branches/safari-602-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionInterfaceh">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionInterface.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionModelh">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementh">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementmm">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenInterfaceh">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenInterface.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenModelh">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementh">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementmm">branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebAVPlayerControllerh">branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebAVPlayerControllermm">branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebPlaybackSessionInterfaceAVKith">branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebPlaybackSessionInterfaceAVKitmm">branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebVideoFullscreenControllerAVKitmm">branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKith">branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKitmm">branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformmacWebPlaybackSessionInterfaceMach">branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformmacWebPlaybackSessionInterfaceMacmm">branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformmacWebVideoFullscreenInterfaceMach">branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h</a></li>
<li><a href="#branchessafari602branchSourceWebCoreplatformmacWebVideoFullscreenInterfaceMacmm">branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKitmacChangeLog">branches/safari-602-branch/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#branchessafari602branchSourceWebKitmacWebViewWebViewmm">branches/safari-602-branch/Source/WebKit/mac/WebView/WebView.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2ChangeLog">branches/safari-602-branch/Source/WebKit2/ChangeLog</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessAPICocoaWKWebViewmm">branches/safari-602-branch/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxyh">branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxymm">branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxyh">branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxymessagesin">branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.messages.in</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxymm">branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2WebProcesscocoaWebPlaybackSessionManagerh">branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h</a></li>
<li><a href="#branchessafari602branchSourceWebKit2WebProcesscocoaWebPlaybackSessionManagermm">branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2WebProcesscocoaWebVideoFullscreenManagerh">branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.h</a></li>
<li><a href="#branchessafari602branchSourceWebKit2WebProcesscocoaWebVideoFullscreenManagermm">branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.mm</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari602branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/ChangeLog (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/ChangeLog        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/ChangeLog        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -1,5 +1,237 @@
</span><span class="cx"> 2016-09-09 Babak Shafiei <bshafiei@apple.com>
</span><span class="cx">
</span><ins>+ Merge r205365. rdar://problem/28020157
+
+ 2016-07-08 Jer Noble <jer.noble@apple.com>
+
+ Refactor WebPlaybackSessionModelMediaElement to be client based.
+ https://bugs.webkit.org/show_bug.cgi?id=159580
+
+ Reviewed by Eric Carlson.
+
+ Add client callback interfaces to both WebPlaybackSessionModel and WebVideoFullscreenModel, where each object
+ can have multiple clients, and so the object will both store current values and also notify those clients
+ when the values change. After this change, there is no need to have the models know about their associated
+ interfaces explicitly.
+
+ * platform/cocoa/WebPlaybackSessionInterface.h:
+ * platform/cocoa/WebPlaybackSessionModel.h:
+ (WebCore::WebPlaybackSessionModelClient::~WebPlaybackSessionModelClient):
+ (WebCore::WebPlaybackSessionModelClient::durationChanged):
+ (WebCore::WebPlaybackSessionModelClient::currentTimeChanged):
+ (WebCore::WebPlaybackSessionModelClient::bufferedTimeChanged):
+ (WebCore::WebPlaybackSessionModelClient::rateChanged):
+ (WebCore::WebPlaybackSessionModelClient::seekableRangesChanged):
+ (WebCore::WebPlaybackSessionModelClient::canPlayFastReverseChanged):
+ (WebCore::WebPlaybackSessionModelClient::audioMediaSelectionOptionsChanged):
+ (WebCore::WebPlaybackSessionModelClient::legibleMediaSelectionOptionsChanged):
+ (WebCore::WebPlaybackSessionModelClient::externalPlaybackChanged):
+ (WebCore::WebPlaybackSessionModelClient::wirelessVideoPlaybackDisabledChanged):
+ * platform/cocoa/WebPlaybackSessionModelMediaElement.h:
+ * platform/cocoa/WebPlaybackSessionModelMediaElement.mm:
+ (WebPlaybackSessionModelMediaElement::setMediaElement):
+ (WebPlaybackSessionModelMediaElement::updateForEventName):
+ (WebPlaybackSessionModelMediaElement::addClient):
+ (WebPlaybackSessionModelMediaElement::removeClient):
+ (WebPlaybackSessionModelMediaElement::updateLegibleOptions):
+ (WebPlaybackSessionModelMediaElement::observedEventNames):
+ (WebPlaybackSessionModelMediaElement::eventNameAll):
+ (WebPlaybackSessionModelMediaElement::audioMediaSelectionOptions):
+ (WebPlaybackSessionModelMediaElement::audioMediaSelectedIndex):
+ (WebPlaybackSessionModelMediaElement::legibleMediaSelectedIndex):
+ (WebPlaybackSessionModelMediaElement::externalPlaybackEnabled):
+ (WebPlaybackSessionModelMediaElement::externalPlaybackTargetType):
+ (WebPlaybackSessionModelMediaElement::externalPlaybackLocalizedDeviceName):
+ (WebPlaybackSessionModelMediaElement::wirelessVideoPlaybackDisabled):
+ (WebPlaybackSessionModelMediaElement::setWebPlaybackSessionInterface): Deleted.
+ * platform/cocoa/WebVideoFullscreenInterface.h:
+ * platform/cocoa/WebVideoFullscreenModel.h:
+ (WebCore::WebVideoFullscreenModelClient::~WebVideoFullscreenModelClient):
+ * platform/cocoa/WebVideoFullscreenModelVideoElement.h:
+ (WebCore::WebVideoFullscreenModelVideoElement::create):
+ (WebCore::WebVideoFullscreenModelVideoElement::playbackSessionModel): Deleted.
+ * platform/cocoa/WebVideoFullscreenModelVideoElement.mm:
+ (WebVideoFullscreenModelVideoElement::WebVideoFullscreenModelVideoElement):
+ (WebVideoFullscreenModelVideoElement::setVideoElement):
+ (WebVideoFullscreenModelVideoElement::updateForEventName):
+ (WebVideoFullscreenModelVideoElement::addClient):
+ (WebVideoFullscreenModelVideoElement::removeClient):
+ (WebVideoFullscreenModelVideoElement::setHasVideo):
+ (WebVideoFullscreenModelVideoElement::setVideoDimensions):
+ (WebVideoFullscreenModelVideoElement::setWebVideoFullscreenInterface): Deleted.
+ * platform/ios/WebAVPlayerController.h:
+ * platform/ios/WebAVPlayerController.mm:
+ (-[WebAVPlayerController resetState]): Deleted.
+ * platform/ios/WebPlaybackSessionInterfaceAVKit.h:
+ (WebCore::WebPlaybackSessionInterfaceAVKitClient::~WebPlaybackSessionInterfaceAVKitClient): Deleted.
+ * platform/ios/WebPlaybackSessionInterfaceAVKit.mm:
+ (WebCore::WebPlaybackSessionInterfaceAVKit::WebPlaybackSessionInterfaceAVKit):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::~WebPlaybackSessionInterfaceAVKit):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::resetMediaState):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::durationChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::currentTimeChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::bufferedTimeChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::rateChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::seekableRangesChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::canPlayFastReverseChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::audioMediaSelectionOptionsChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::legibleMediaSelectionOptionsChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::externalPlaybackChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::wirelessVideoPlaybackDisabledChanged):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::invalidate):
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setWebPlaybackSessionModel): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setDuration): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setCurrentTime): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setBufferedTime): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setRate): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setSeekableRanges): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setCanPlayFastReverse): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setAudioMediaSelectionOptions): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setLegibleMediaSelectionOptions): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setExternalPlayback): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::setWirelessVideoPlaybackDisabled): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceAVKit::wirelessVideoPlaybackDisabled): Deleted.
+ * platform/ios/WebVideoFullscreenControllerAVKit.mm:
+ (WebVideoFullscreenControllerContext::didSetupFullscreen):
+ (WebVideoFullscreenControllerContext::didExitFullscreen):
+ (WebVideoFullscreenControllerContext::didCleanupFullscreen):
+ (WebVideoFullscreenControllerContext::durationChanged):
+ (WebVideoFullscreenControllerContext::currentTimeChanged):
+ (WebVideoFullscreenControllerContext::bufferedTimeChanged):
+ (WebVideoFullscreenControllerContext::rateChanged):
+ (WebVideoFullscreenControllerContext::hasVideoChanged):
+ (WebVideoFullscreenControllerContext::videoDimensionsChanged):
+ (WebVideoFullscreenControllerContext::seekableRangesChanged):
+ (WebVideoFullscreenControllerContext::canPlayFastReverseChanged):
+ (WebVideoFullscreenControllerContext::audioMediaSelectionOptionsChanged):
+ (WebVideoFullscreenControllerContext::legibleMediaSelectionOptionsChanged):
+ (WebVideoFullscreenControllerContext::externalPlaybackChanged):
+ (WebVideoFullscreenControllerContext::wirelessVideoPlaybackDisabledChanged):
+ (WebVideoFullscreenControllerContext::addClient):
+ (WebVideoFullscreenControllerContext::removeClient):
+ (WebVideoFullscreenControllerContext::requestFullscreenMode):
+ (WebVideoFullscreenControllerContext::setVideoLayerFrame):
+ (WebVideoFullscreenControllerContext::setVideoLayerGravity):
+ (WebVideoFullscreenControllerContext::fullscreenModeChanged):
+ (WebVideoFullscreenControllerContext::isVisible):
+ (WebVideoFullscreenControllerContext::hasVideo):
+ (WebVideoFullscreenControllerContext::videoDimensions):
+ (WebVideoFullscreenControllerContext::play):
+ (WebVideoFullscreenControllerContext::pause):
+ (WebVideoFullscreenControllerContext::togglePlayState):
+ (WebVideoFullscreenControllerContext::beginScrubbing):
+ (WebVideoFullscreenControllerContext::endScrubbing):
+ (WebVideoFullscreenControllerContext::seekToTime):
+ (WebVideoFullscreenControllerContext::fastSeek):
+ (WebVideoFullscreenControllerContext::beginScanningForward):
+ (WebVideoFullscreenControllerContext::beginScanningBackward):
+ (WebVideoFullscreenControllerContext::endScanning):
+ (WebVideoFullscreenControllerContext::selectAudioMediaOption):
+ (WebVideoFullscreenControllerContext::selectLegibleMediaOption):
+ (WebVideoFullscreenControllerContext::duration):
+ (WebVideoFullscreenControllerContext::currentTime):
+ (WebVideoFullscreenControllerContext::bufferedTime):
+ (WebVideoFullscreenControllerContext::isPlaying):
+ (WebVideoFullscreenControllerContext::playbackRate):
+ (WebVideoFullscreenControllerContext::seekableRanges):
+ (WebVideoFullscreenControllerContext::canPlayFastReverse):
+ (WebVideoFullscreenControllerContext::audioMediaSelectionOptions):
+ (WebVideoFullscreenControllerContext::audioMediaSelectedIndex):
+ (WebVideoFullscreenControllerContext::legibleMediaSelectionOptions):
+ (WebVideoFullscreenControllerContext::legibleMediaSelectedIndex):
+ (WebVideoFullscreenControllerContext::externalPlaybackEnabled):
+ (WebVideoFullscreenControllerContext::externalPlaybackTargetType):
+ (WebVideoFullscreenControllerContext::externalPlaybackLocalizedDeviceName):
+ (WebVideoFullscreenControllerContext::wirelessVideoPlaybackDisabled):
+ (WebVideoFullscreenControllerContext::setUpFullscreen):
+ (WebVideoFullscreenControllerContext::exitFullscreen):
+ (WebVideoFullscreenControllerContext::requestHideAndExitFullscreen):
+ (WebVideoFullscreenControllerContext::resetMediaState): Deleted.
+ (WebVideoFullscreenControllerContext::setDuration): Deleted.
+ (WebVideoFullscreenControllerContext::setCurrentTime): Deleted.
+ (WebVideoFullscreenControllerContext::setBufferedTime): Deleted.
+ (WebVideoFullscreenControllerContext::setRate): Deleted.
+ (WebVideoFullscreenControllerContext::setVideoDimensions): Deleted.
+ (WebVideoFullscreenControllerContext::setSeekableRanges): Deleted.
+ (WebVideoFullscreenControllerContext::setCanPlayFastReverse): Deleted.
+ (WebVideoFullscreenControllerContext::setAudioMediaSelectionOptions): Deleted.
+ (WebVideoFullscreenControllerContext::setLegibleMediaSelectionOptions): Deleted.
+ (WebVideoFullscreenControllerContext::setExternalPlayback): Deleted.
+ (WebVideoFullscreenControllerContext::setWirelessVideoPlaybackDisabled): Deleted.
+ (WebVideoFullscreenSessionModel::play): Deleted.
+ (WebVideoFullscreenSessionModel::pause): Deleted.
+ (WebVideoFullscreenSessionModel::togglePlayState): Deleted.
+ (WebVideoFullscreenSessionModel::beginScrubbing): Deleted.
+ (WebVideoFullscreenSessionModel::endScrubbing): Deleted.
+ (WebVideoFullscreenSessionModel::seekToTime): Deleted.
+ (WebVideoFullscreenSessionModel::fastSeek): Deleted.
+ (WebVideoFullscreenSessionModel::beginScanningForward): Deleted.
+ (WebVideoFullscreenSessionModel::beginScanningBackward): Deleted.
+ (WebVideoFullscreenSessionModel::endScanning): Deleted.
+ (WebVideoFullscreenSessionModel::selectAudioMediaOption): Deleted.
+ (WebVideoFullscreenSessionModel::selectLegibleMediaOption): Deleted.
+ * platform/ios/WebVideoFullscreenInterfaceAVKit.h:
+ * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
+ (WebVideoFullscreenInterfaceAVKit::~WebVideoFullscreenInterfaceAVKit):
+ (WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenModel):
+ (WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenChangeObserver):
+ (WebVideoFullscreenInterfaceAVKit::hasVideoChanged):
+ (WebVideoFullscreenInterfaceAVKit::videoDimensionsChanged):
+ (WebVideoFullscreenInterfaceAVKit::externalPlaybackChanged):
+ (WebVideoFullscreenInterfaceAVKit::resetMediaState): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setDuration): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setCurrentTime): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setBufferedTime): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setRate): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setVideoDimensions): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setSeekableRanges): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setCanPlayFastReverse): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setAudioMediaSelectionOptions): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setLegibleMediaSelectionOptions): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setExternalPlayback): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::externalPlaybackEnabledChanged): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::setWirelessVideoPlaybackDisabled): Deleted.
+ (WebVideoFullscreenInterfaceAVKit::wirelessVideoPlaybackDisabled): Deleted.
+ * platform/mac/WebPlaybackSessionInterfaceMac.h:
+ (WebCore::WebPlaybackSessionInterfaceMacClient::~WebPlaybackSessionInterfaceMacClient): Deleted.
+ * platform/mac/WebPlaybackSessionInterfaceMac.mm:
+ (WebCore::WebPlaybackSessionInterfaceMac::create):
+ (WebCore::WebPlaybackSessionInterfaceMac::WebPlaybackSessionInterfaceMac):
+ (WebCore::WebPlaybackSessionInterfaceMac::~WebPlaybackSessionInterfaceMac):
+ (WebCore::WebPlaybackSessionInterfaceMac::durationChanged):
+ (WebCore::WebPlaybackSessionInterfaceMac::currentTimeChanged):
+ (WebCore::WebPlaybackSessionInterfaceMac::rateChanged):
+ (WebCore::WebPlaybackSessionInterfaceMac::seekableRangesChanged):
+ (WebCore::WebPlaybackSessionInterfaceMac::audioMediaSelectionOptionsChanged):
+ (WebCore::WebPlaybackSessionInterfaceMac::legibleMediaSelectionOptionsChanged):
+ (WebCore::WebPlaybackSessionInterfaceMac::invalidate):
+ (WebCore::WebPlaybackSessionInterfaceMac::setWebPlaybackSessionModel): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setClient): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setDuration): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setCurrentTime): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setRate): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setSeekableRanges): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setAudioMediaSelectionOptions): Deleted.
+ (WebCore::WebPlaybackSessionInterfaceMac::setLegibleMediaSelectionOptions): Deleted.
+ * platform/mac/WebVideoFullscreenInterfaceMac.h:
+ * platform/mac/WebVideoFullscreenInterfaceMac.mm:
+ (WebCore::WebVideoFullscreenInterfaceMac::WebVideoFullscreenInterfaceMac):
+ (WebCore::WebVideoFullscreenInterfaceMac::~WebVideoFullscreenInterfaceMac):
+ (WebCore::WebVideoFullscreenInterfaceMac::setWebVideoFullscreenModel):
+ (WebCore::WebVideoFullscreenInterfaceMac::externalPlaybackChanged):
+ (WebCore::WebVideoFullscreenInterfaceMac::hasVideoChanged):
+ (WebCore::WebVideoFullscreenInterfaceMac::videoDimensionsChanged):
+ (WebCore::WebVideoFullscreenInterfaceMac::setDuration): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setCurrentTime): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setRate): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setSeekableRanges): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setAudioMediaSelectionOptions): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setLegibleMediaSelectionOptions): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setExternalPlayback): Deleted.
+ (WebCore::WebVideoFullscreenInterfaceMac::setVideoDimensions): Deleted.
+
+2016-09-09 Babak Shafiei <bshafiei@apple.com>
+
</ins><span class="cx"> Merge r205246. rdar://problem/28162589
</span><span class="cx">
</span><span class="cx"> 2016-08-31 Antti Koivisto <antti@apple.com>
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionInterfaceh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionInterface.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionInterface.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionInterface.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -40,20 +40,8 @@
</span><span class="cx">
</span><span class="cx"> class WebPlaybackSessionInterface {
</span><span class="cx"> public:
</span><del>- enum ExternalPlaybackTargetType { TargetTypeNone, TargetTypeAirPlay, TargetTypeTVOut };
-
</del><span class="cx"> virtual ~WebPlaybackSessionInterface() { };
</span><span class="cx"> virtual void resetMediaState() = 0;
</span><del>- virtual void setDuration(double) = 0;
- virtual void setCurrentTime(double currentTime, double anchorTime) = 0;
- virtual void setBufferedTime(double) = 0;
- virtual void setRate(bool isPlaying, float playbackRate) = 0;
- virtual void setSeekableRanges(const TimeRanges&) = 0;
- virtual void setCanPlayFastReverse(bool) = 0;
- virtual void setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) = 0;
- virtual void setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) = 0;
- virtual void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) = 0;
- virtual void setWirelessVideoPlaybackDisabled(bool) = 0;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionModelh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModel.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -36,9 +36,14 @@
</span><span class="cx">
</span><span class="cx"> class TimeRanges;
</span><span class="cx">
</span><ins>+class WebPlaybackSessionModelClient;
+
</ins><span class="cx"> class WebPlaybackSessionModel {
</span><span class="cx"> public:
</span><span class="cx"> virtual ~WebPlaybackSessionModel() { };
</span><ins>+ virtual void addClient(WebPlaybackSessionModelClient&) = 0;
+ virtual void removeClient(WebPlaybackSessionModelClient&) = 0;
+
</ins><span class="cx"> virtual void play() = 0;
</span><span class="cx"> virtual void pause() = 0;
</span><span class="cx"> virtual void togglePlayState() = 0;
</span><span class="lines">@@ -52,6 +57,8 @@
</span><span class="cx"> virtual void selectAudioMediaOption(uint64_t index) = 0;
</span><span class="cx"> virtual void selectLegibleMediaOption(uint64_t index) = 0;
</span><span class="cx">
</span><ins>+ enum ExternalPlaybackTargetType { TargetTypeNone, TargetTypeAirPlay, TargetTypeTVOut };
+
</ins><span class="cx"> virtual double duration() const = 0;
</span><span class="cx"> virtual double currentTime() const = 0;
</span><span class="cx"> virtual double bufferedTime() const = 0;
</span><span class="lines">@@ -59,14 +66,31 @@
</span><span class="cx"> virtual float playbackRate() const = 0;
</span><span class="cx"> virtual Ref<TimeRanges> seekableRanges() const = 0;
</span><span class="cx"> virtual bool canPlayFastReverse() const = 0;
</span><del>- virtual Vector<WTF::String> audioMediaSelectionOptions() const = 0;
</del><ins>+ virtual Vector<String> audioMediaSelectionOptions() const = 0;
</ins><span class="cx"> virtual uint64_t audioMediaSelectedIndex() const = 0;
</span><del>- virtual Vector<WTF::String> legibleMediaSelectionOptions() const = 0;
</del><ins>+ virtual Vector<String> legibleMediaSelectionOptions() const = 0;
</ins><span class="cx"> virtual uint64_t legibleMediaSelectedIndex() const = 0;
</span><span class="cx"> virtual bool externalPlaybackEnabled() const = 0;
</span><ins>+ virtual ExternalPlaybackTargetType externalPlaybackTargetType() const = 0;
+ virtual String externalPlaybackLocalizedDeviceName() const = 0;
</ins><span class="cx"> virtual bool wirelessVideoPlaybackDisabled() const = 0;
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+class WebPlaybackSessionModelClient {
+public:
+ virtual ~WebPlaybackSessionModelClient() { };
+ virtual void durationChanged(double) { }
+ virtual void currentTimeChanged(double /* currentTime */, double /* anchorTime */) { }
+ virtual void bufferedTimeChanged(double) { }
+ virtual void rateChanged(bool /* isPlaying */, float /* playbackRate */) { }
+ virtual void seekableRangesChanged(const TimeRanges&) { }
+ virtual void canPlayFastReverseChanged(bool) { }
+ virtual void audioMediaSelectionOptionsChanged(const Vector<String>& /* options */, uint64_t /* selectedIndex */) { }
+ virtual void legibleMediaSelectionOptionsChanged(const Vector<String>& /* options */, uint64_t /* selectedIndex */) { }
+ virtual void externalPlaybackChanged(bool /* enabled */, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String& /* localizedDeviceName */) { }
+ virtual void wirelessVideoPlaybackDisabledChanged(bool) { }
+};
+
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #endif // PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include "EventListener.h"
</span><span class="cx"> #include "HTMLMediaElementEnums.h"
</span><span class="cx"> #include "WebPlaybackSessionModel.h"
</span><ins>+#include <wtf/HashSet.h>
</ins><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="lines">@@ -47,7 +48,6 @@
</span><span class="cx"> return adoptRef(*new WebPlaybackSessionModelMediaElement());
</span><span class="cx"> }
</span><span class="cx"> WEBCORE_EXPORT virtual ~WebPlaybackSessionModelMediaElement();
</span><del>- WEBCORE_EXPORT void setWebPlaybackSessionInterface(WebPlaybackSessionInterface*);
</del><span class="cx"> WEBCORE_EXPORT void setMediaElement(HTMLMediaElement*);
</span><span class="cx"> WEBCORE_EXPORT HTMLMediaElement* mediaElement() const { return m_mediaElement.get(); }
</span><span class="cx">
</span><span class="lines">@@ -55,6 +55,8 @@
</span><span class="cx"> void updateForEventName(const WTF::AtomicString&);
</span><span class="cx"> bool operator==(const EventListener& rhs) const final { return static_cast<const WebCore::EventListener*>(this) == &rhs; }
</span><span class="cx">
</span><ins>+ WEBCORE_EXPORT void addClient(WebPlaybackSessionModelClient&);
+ WEBCORE_EXPORT void removeClient(WebPlaybackSessionModelClient&);
</ins><span class="cx"> WEBCORE_EXPORT void play() final;
</span><span class="cx"> WEBCORE_EXPORT void pause() final;
</span><span class="cx"> WEBCORE_EXPORT void togglePlayState() final;
</span><span class="lines">@@ -80,6 +82,8 @@
</span><span class="cx"> Vector<WTF::String> legibleMediaSelectionOptions() const final;
</span><span class="cx"> uint64_t legibleMediaSelectedIndex() const final;
</span><span class="cx"> bool externalPlaybackEnabled() const final;
</span><ins>+ ExternalPlaybackTargetType externalPlaybackTargetType() const final;
+ String externalPlaybackLocalizedDeviceName() const final;
</ins><span class="cx"> bool wirelessVideoPlaybackDisabled() const final;
</span><span class="cx">
</span><span class="cx"> protected:
</span><span class="lines">@@ -91,7 +95,7 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<HTMLMediaElement> m_mediaElement;
</span><span class="cx"> bool m_isListening { false };
</span><del>- WebPlaybackSessionInterface* m_playbackSessionInterface { nullptr };
</del><ins>+ HashSet<WebPlaybackSessionModelClient*> m_clients;
</ins><span class="cx"> Vector<RefPtr<TextTrack>> m_legibleTracksForMenu;
</span><span class="cx"> Vector<RefPtr<AudioTrack>> m_audioTracksForMenu;
</span><span class="cx">
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebPlaybackSessionModelMediaElementmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebPlaybackSessionModelMediaElement.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -59,35 +59,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionModelMediaElement::setWebPlaybackSessionInterface(WebPlaybackSessionInterface* interface)
-{
- if (interface == m_playbackSessionInterface)
- return;
-
- m_playbackSessionInterface = interface;
-
- if (!m_playbackSessionInterface)
- return;
-
- m_playbackSessionInterface->resetMediaState();
- m_playbackSessionInterface->setDuration(duration());
- m_playbackSessionInterface->setCurrentTime(currentTime(), [[NSProcessInfo processInfo] systemUptime]);
- m_playbackSessionInterface->setBufferedTime(bufferedTime());
- m_playbackSessionInterface->setRate(isPlaying(), playbackRate());
- m_playbackSessionInterface->setSeekableRanges(seekableRanges());
- m_playbackSessionInterface->setCanPlayFastReverse(canPlayFastReverse());
- m_playbackSessionInterface->setWirelessVideoPlaybackDisabled(wirelessVideoPlaybackDisabled());
- updateLegibleOptions();
-}
-
</del><span class="cx"> void WebPlaybackSessionModelMediaElement::setMediaElement(HTMLMediaElement* mediaElement)
</span><span class="cx"> {
</span><span class="cx"> if (m_mediaElement == mediaElement)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- if (m_playbackSessionInterface)
- m_playbackSessionInterface->resetMediaState();
-
</del><span class="cx"> if (m_mediaElement && m_isListening) {
</span><span class="cx"> for (auto& eventName : observedEventNames())
</span><span class="cx"> m_mediaElement->removeEventListener(eventName, *this, false);
</span><span class="lines">@@ -99,17 +75,13 @@
</span><span class="cx">
</span><span class="cx"> m_mediaElement = mediaElement;
</span><span class="cx">
</span><del>- if (!m_mediaElement)
- return;
</del><ins>+ if (m_mediaElement) {
+ for (auto& eventName : observedEventNames())
+ m_mediaElement->addEventListener(eventName, *this, false);
+ m_isListening = true;
+ }
</ins><span class="cx">
</span><del>- for (auto& eventName : observedEventNames())
- m_mediaElement->addEventListener(eventName, *this, false);
- m_isListening = true;
-
</del><span class="cx"> updateForEventName(eventNameAll());
</span><del>-
- if (m_playbackSessionInterface)
- m_playbackSessionInterface->setWirelessVideoPlaybackDisabled(m_mediaElement->mediaSession().wirelessVideoPlaybackDisabled(*m_mediaElement));
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionModelMediaElement::handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event* event)
</span><span class="lines">@@ -119,7 +91,7 @@
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionModelMediaElement::updateForEventName(const WTF::AtomicString& eventName)
</span><span class="cx"> {
</span><del>- if (!m_mediaElement || !m_playbackSessionInterface)
</del><ins>+ if (m_clients.isEmpty())
</ins><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> bool all = eventName == eventNameAll();
</span><span class="lines">@@ -126,24 +98,39 @@
</span><span class="cx">
</span><span class="cx"> if (all
</span><span class="cx"> || eventName == eventNames().durationchangeEvent) {
</span><del>- m_playbackSessionInterface->setDuration(m_mediaElement->duration());
</del><ins>+ double duration = this->duration();
+ for (auto client : m_clients)
+ client->durationChanged(duration);
</ins><span class="cx"> // These is no standard event for minFastReverseRateChange; duration change is a reasonable proxy for it.
</span><span class="cx"> // It happens every time a new item becomes ready to play.
</span><del>- m_playbackSessionInterface->setCanPlayFastReverse(m_mediaElement->minFastReverseRate() < 0.0);
</del><ins>+ bool canPlayFastReverse = this->canPlayFastReverse();
+ for (auto client : m_clients)
+ client->canPlayFastReverseChanged(canPlayFastReverse);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (all
</span><span class="cx"> || eventName == eventNames().pauseEvent
</span><span class="cx"> || eventName == eventNames().playEvent
</span><del>- || eventName == eventNames().ratechangeEvent)
- m_playbackSessionInterface->setRate(!m_mediaElement->paused(), m_mediaElement->playbackRate());
</del><ins>+ || eventName == eventNames().ratechangeEvent) {
+ bool isPlaying = this->isPlaying();
+ float playbackRate = this->playbackRate();
+ for (auto client : m_clients)
+ client->rateChanged(isPlaying, playbackRate);
+ }
</ins><span class="cx">
</span><span class="cx"> if (all
</span><span class="cx"> || eventName == eventNames().timeupdateEvent) {
</span><del>- m_playbackSessionInterface->setCurrentTime(m_mediaElement->currentTime(), [[NSProcessInfo processInfo] systemUptime]);
- m_playbackSessionInterface->setBufferedTime(m_mediaElement->maxBufferedTime());
- // FIXME: 130788 - find a better event to update seekable ranges from.
- m_playbackSessionInterface->setSeekableRanges(m_mediaElement->seekable());
</del><ins>+ auto currentTime = this->currentTime();
+ auto anchorTime = [[NSProcessInfo processInfo] systemUptime];
+ auto bufferedTime = this->bufferedTime();
+ auto seekableRanges = this->seekableRanges();
+
+ for (auto client : m_clients) {
+ client->currentTimeChanged(currentTime, anchorTime);
+ client->bufferedTimeChanged(bufferedTime);
+ // FIXME: 130788 - find a better event from which to update seekable ranges.
+ client->seekableRangesChanged(seekableRanges);
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (all
</span><span class="lines">@@ -153,23 +140,30 @@
</span><span class="cx">
</span><span class="cx"> if (all
</span><span class="cx"> || eventName == eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent) {
</span><del>- bool enabled = m_mediaElement->webkitCurrentPlaybackTargetIsWireless();
- WebPlaybackSessionInterface::ExternalPlaybackTargetType targetType = WebPlaybackSessionInterface::TargetTypeNone;
- String localizedDeviceName;
</del><ins>+ bool enabled = externalPlaybackEnabled();
+ ExternalPlaybackTargetType targetType = externalPlaybackTargetType();
+ String localizedDeviceName = externalPlaybackLocalizedDeviceName();
</ins><span class="cx">
</span><del>- if (m_mediaElement->mediaControlsHost()) {
- auto type = m_mediaElement->mediaControlsHost()->externalDeviceType();
- if (type == MediaControlsHost::DeviceType::Airplay)
- targetType = WebPlaybackSessionInterface::TargetTypeAirPlay;
- else if (type == MediaControlsHost::DeviceType::Tvout)
- targetType = WebPlaybackSessionInterface::TargetTypeTVOut;
- localizedDeviceName = m_mediaElement->mediaControlsHost()->externalDeviceDisplayName();
</del><ins>+ bool wirelessVideoPlaybackDisabled = this->wirelessVideoPlaybackDisabled();
+
+ for (auto client : m_clients) {
+ client->externalPlaybackChanged(enabled, targetType, localizedDeviceName);
+ client->wirelessVideoPlaybackDisabledChanged(wirelessVideoPlaybackDisabled);
</ins><span class="cx"> }
</span><del>- m_playbackSessionInterface->setExternalPlayback(enabled, targetType, localizedDeviceName);
- m_playbackSessionInterface->setWirelessVideoPlaybackDisabled(m_mediaElement->mediaSession().wirelessVideoPlaybackDisabled(*m_mediaElement));
</del><span class="cx"> }
</span><span class="cx"> }
</span><ins>+void WebPlaybackSessionModelMediaElement::addClient(WebPlaybackSessionModelClient& client)
+{
+ ASSERT(!m_clients.contains(&client));
+ m_clients.add(&client);
+}
</ins><span class="cx">
</span><ins>+void WebPlaybackSessionModelMediaElement::removeClient(WebPlaybackSessionModelClient& client)
+{
+ ASSERT(m_clients.contains(&client));
+ m_clients.remove(&client);
+}
+
</ins><span class="cx"> void WebPlaybackSessionModelMediaElement::play()
</span><span class="cx"> {
</span><span class="cx"> if (m_mediaElement)
</span><span class="lines">@@ -285,31 +279,37 @@
</span><span class="cx"> else
</span><span class="cx"> m_audioTracksForMenu.clear();
</span><span class="cx">
</span><del>- m_playbackSessionInterface->setAudioMediaSelectionOptions(audioMediaSelectionOptions(), audioMediaSelectedIndex());
- m_playbackSessionInterface->setLegibleMediaSelectionOptions(legibleMediaSelectionOptions(), legibleMediaSelectedIndex());
</del><ins>+ auto audioOptions = audioMediaSelectionOptions();
+ auto audioIndex = audioMediaSelectedIndex();
+ auto legibleOptions = legibleMediaSelectionOptions();
+ auto legibleIndex = legibleMediaSelectedIndex();
+
+ for (auto client : m_clients) {
+ client->audioMediaSelectionOptionsChanged(audioOptions, audioIndex);
+ client->legibleMediaSelectionOptionsChanged(legibleOptions, legibleIndex);
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-const Vector<AtomicString>& WebPlaybackSessionModelMediaElement::observedEventNames()
</del><ins>+const Vector<AtomicString>& WebPlaybackSessionModelMediaElement::observedEventNames()
</ins><span class="cx"> {
</span><del>- static NeverDestroyed<Vector<AtomicString>> sEventNames;
-
- if (!sEventNames.get().size()) {
- sEventNames.get().append(eventNames().durationchangeEvent);
- sEventNames.get().append(eventNames().pauseEvent);
- sEventNames.get().append(eventNames().playEvent);
- sEventNames.get().append(eventNames().ratechangeEvent);
- sEventNames.get().append(eventNames().timeupdateEvent);
- sEventNames.get().append(eventNames().addtrackEvent);
- sEventNames.get().append(eventNames().removetrackEvent);
- sEventNames.get().append(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
- }
- return sEventNames.get();
</del><ins>+ // FIXME(157452): Remove the right-hand constructor notation once NeverDestroyed supports initializer_lists.
+ static NeverDestroyed<Vector<AtomicString>> names = Vector<AtomicString>({
+ eventNames().durationchangeEvent,
+ eventNames().pauseEvent,
+ eventNames().playEvent,
+ eventNames().ratechangeEvent,
+ eventNames().timeupdateEvent,
+ eventNames().addtrackEvent,
+ eventNames().removetrackEvent,
+ eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent,
+ });
+ return names.get();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const AtomicString& WebPlaybackSessionModelMediaElement::eventNameAll()
</span><span class="cx"> {
</span><del>- static NeverDestroyed<AtomicString> sEventNameAll = "allEvents";
- return sEventNameAll;
</del><ins>+ static NeverDestroyed<AtomicString> eventNameAll("allEvents", AtomicString::ConstructFromLiteral);
+ return eventNameAll;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> double WebPlaybackSessionModelMediaElement::duration() const
</span><span class="lines">@@ -347,7 +347,7 @@
</span><span class="cx"> return m_mediaElement ? m_mediaElement->minFastReverseRate() < 0.0 : false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Vector<WTF::String> WebPlaybackSessionModelMediaElement::audioMediaSelectionOptions() const
</del><ins>+Vector<String> WebPlaybackSessionModelMediaElement::audioMediaSelectionOptions() const
</ins><span class="cx"> {
</span><span class="cx"> Vector<String> audioTrackDisplayNames;
</span><span class="cx">
</span><span class="lines">@@ -356,8 +356,9 @@
</span><span class="cx">
</span><span class="cx"> auto& captionPreferences = m_mediaElement->document().page()->group().captionPreferences();
</span><span class="cx">
</span><ins>+ audioTrackDisplayNames.reserveInitialCapacity(m_audioTracksForMenu.size());
</ins><span class="cx"> for (auto& audioTrack : m_audioTracksForMenu)
</span><del>- audioTrackDisplayNames.append(captionPreferences.displayNameForTrack(audioTrack.get()));
</del><ins>+ audioTrackDisplayNames.uncheckedAppend(captionPreferences.displayNameForTrack(audioTrack.get()));
</ins><span class="cx">
</span><span class="cx"> return audioTrackDisplayNames;
</span><span class="cx"> }
</span><span class="lines">@@ -368,7 +369,7 @@
</span><span class="cx"> if (m_audioTracksForMenu[index]->enabled())
</span><span class="cx"> return index;
</span><span class="cx"> }
</span><del>- return 0;
</del><ins>+ return std::numeric_limits<uint64_t>::max();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Vector<WTF::String> WebPlaybackSessionModelMediaElement::legibleMediaSelectionOptions() const
</span><span class="lines">@@ -388,16 +389,18 @@
</span><span class="cx">
</span><span class="cx"> uint64_t WebPlaybackSessionModelMediaElement::legibleMediaSelectedIndex() const
</span><span class="cx"> {
</span><del>- uint64_t selectedIndex = 0;
</del><ins>+ uint64_t selectedIndex = std::numeric_limits<uint64_t>::max();
</ins><span class="cx"> uint64_t offIndex = 0;
</span><span class="cx"> bool trackMenuItemSelected = false;
</span><span class="cx">
</span><del>- if (!m_mediaElement || !m_mediaElement->mediaControlsHost())
</del><ins>+ auto host = m_mediaElement ? m_mediaElement->mediaControlsHost() : nullptr;
+
+ if (!host)
</ins><span class="cx"> return selectedIndex;
</span><span class="cx">
</span><del>- AtomicString displayMode = m_mediaElement->mediaControlsHost()->captionDisplayMode();
- TextTrack* offItem = m_mediaElement->mediaControlsHost()->captionMenuOffItem();
- TextTrack* automaticItem = m_mediaElement->mediaControlsHost()->captionMenuAutomaticItem();
</del><ins>+ AtomicString displayMode = host->captionDisplayMode();
+ TextTrack* offItem = host->captionMenuOffItem();
+ TextTrack* automaticItem = host->captionMenuAutomaticItem();
</ins><span class="cx">
</span><span class="cx"> for (size_t index = 0; index < m_legibleTracksForMenu.size(); index++) {
</span><span class="cx"> auto& track = m_legibleTracksForMenu[index];
</span><span class="lines">@@ -423,12 +426,37 @@
</span><span class="cx">
</span><span class="cx"> bool WebPlaybackSessionModelMediaElement::externalPlaybackEnabled() const
</span><span class="cx"> {
</span><del>- return m_mediaElement ? m_mediaElement->webkitCurrentPlaybackTargetIsWireless() : false;
</del><ins>+ return m_mediaElement && m_mediaElement->webkitCurrentPlaybackTargetIsWireless();
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+WebPlaybackSessionModel::ExternalPlaybackTargetType WebPlaybackSessionModelMediaElement::externalPlaybackTargetType() const
+{
+ if (!m_mediaElement || !m_mediaElement->mediaControlsHost())
+ return TargetTypeNone;
+
+ switch (m_mediaElement->mediaControlsHost()->externalDeviceType()) {
+ default:
+ ASSERT_NOT_REACHED();
+ return TargetTypeNone;
+ case MediaControlsHost::DeviceType::None:
+ return TargetTypeNone;
+ case MediaControlsHost::DeviceType::Airplay:
+ return TargetTypeAirPlay;
+ case MediaControlsHost::DeviceType::Tvout:
+ return TargetTypeTVOut;
+ }
+}
+
+String WebPlaybackSessionModelMediaElement::externalPlaybackLocalizedDeviceName() const
+{
+ if (m_mediaElement && m_mediaElement->mediaControlsHost())
+ return m_mediaElement->mediaControlsHost()->externalDeviceDisplayName();
+ return emptyString();
+}
+
</ins><span class="cx"> bool WebPlaybackSessionModelMediaElement::wirelessVideoPlaybackDisabled() const
</span><span class="cx"> {
</span><del>- return m_mediaElement ? m_mediaElement->mediaSession().wirelessVideoPlaybackDisabled(*m_mediaElement) : false;
</del><ins>+ return m_mediaElement && m_mediaElement->mediaSession().wirelessVideoPlaybackDisabled(*m_mediaElement);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenInterfaceh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenInterface.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenInterface.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenInterface.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -36,10 +36,9 @@
</span><span class="cx">
</span><span class="cx"> class TimeRanges;
</span><span class="cx">
</span><del>-class WebVideoFullscreenInterface : public WebPlaybackSessionInterface {
</del><ins>+class WebVideoFullscreenInterface {
</ins><span class="cx"> public:
</span><span class="cx"> virtual ~WebVideoFullscreenInterface() { };
</span><del>- virtual void setVideoDimensions(bool hasVideo, float width, float height) = 0;
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenModelh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModel.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -35,17 +35,32 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+class WebVideoFullscreenModelClient;
+
</ins><span class="cx"> class WebVideoFullscreenModel {
</span><span class="cx"> public:
</span><span class="cx"> virtual ~WebVideoFullscreenModel() { };
</span><ins>+ virtual void addClient(WebVideoFullscreenModelClient&) = 0;
+ virtual void removeClient(WebVideoFullscreenModelClient&)= 0;
+
</ins><span class="cx"> virtual void requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode) = 0;
</span><span class="cx"> virtual void setVideoLayerFrame(FloatRect) = 0;
</span><span class="cx"> enum VideoGravity { VideoGravityResize, VideoGravityResizeAspect, VideoGravityResizeAspectFill };
</span><span class="cx"> virtual void setVideoLayerGravity(VideoGravity) = 0;
</span><span class="cx"> virtual void fullscreenModeChanged(HTMLMediaElementEnums::VideoFullscreenMode) = 0;
</span><ins>+
</ins><span class="cx"> virtual bool isVisible() const = 0;
</span><ins>+ virtual FloatSize videoDimensions() const = 0;
+ virtual bool hasVideo() const = 0;
</ins><span class="cx"> };
</span><span class="cx">
</span><ins>+class WebVideoFullscreenModelClient {
+public:
+ virtual ~WebVideoFullscreenModelClient() { }
+ virtual void hasVideoChanged(bool) = 0;
+ virtual void videoDimensionsChanged(const FloatSize&) = 0;
+};
+
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include "PlatformLayer.h"
</span><span class="cx"> #include "WebVideoFullscreenModel.h"
</span><span class="cx"> #include <functional>
</span><ins>+#include <wtf/HashSet.h>
</ins><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="lines">@@ -44,44 +45,50 @@
</span><span class="cx"> class HTMLVideoElement;
</span><span class="cx"> class TextTrack;
</span><span class="cx"> class WebPlaybackSessionModelMediaElement;
</span><del>-class WebVideoFullscreenInterface;
</del><span class="cx">
</span><span class="cx"> class WebVideoFullscreenModelVideoElement : public WebVideoFullscreenModel, public EventListener {
</span><span class="cx"> public:
</span><del>- static RefPtr<WebVideoFullscreenModelVideoElement> create(WebPlaybackSessionModelMediaElement& playbackSessionModel)
</del><ins>+ static RefPtr<WebVideoFullscreenModelVideoElement> create()
</ins><span class="cx"> {
</span><del>- return adoptRef(*new WebVideoFullscreenModelVideoElement(playbackSessionModel));
</del><ins>+ return adoptRef(*new WebVideoFullscreenModelVideoElement());
</ins><span class="cx"> }
</span><span class="cx"> WEBCORE_EXPORT virtual ~WebVideoFullscreenModelVideoElement();
</span><del>- WEBCORE_EXPORT void setWebVideoFullscreenInterface(WebVideoFullscreenInterface*);
</del><span class="cx"> WEBCORE_EXPORT void setVideoElement(HTMLVideoElement*);
</span><span class="cx"> WEBCORE_EXPORT HTMLVideoElement* videoElement() const { return m_videoElement.get(); }
</span><span class="cx"> WEBCORE_EXPORT void setVideoFullscreenLayer(PlatformLayer*, std::function<void()> completionHandler = [] { });
</span><span class="cx"> WEBCORE_EXPORT void waitForPreparedForInlineThen(std::function<void()> completionHandler = [] { });
</span><del>- WebPlaybackSessionModelMediaElement& playbackSessionModel() { return m_playbackSessionModel; }
</del><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event*) override;
</span><span class="cx"> void updateForEventName(const WTF::AtomicString&);
</span><span class="cx"> bool operator==(const EventListener& rhs) const override { return static_cast<const WebCore::EventListener*>(this) == &rhs; }
</span><span class="cx">
</span><ins>+ WEBCORE_EXPORT void addClient(WebVideoFullscreenModelClient&) override;
+ WEBCORE_EXPORT void removeClient(WebVideoFullscreenModelClient&) override;
</ins><span class="cx"> WEBCORE_EXPORT void requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx"> WEBCORE_EXPORT void setVideoLayerFrame(FloatRect) override;
</span><span class="cx"> WEBCORE_EXPORT void setVideoLayerGravity(VideoGravity) override;
</span><span class="cx"> WEBCORE_EXPORT void fullscreenModeChanged(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx"> WEBCORE_EXPORT bool isVisible() const override;
</span><ins>+ WEBCORE_EXPORT FloatSize videoDimensions() const override { return m_videoDimensions; }
+ WEBCORE_EXPORT bool hasVideo() const override { return m_hasVideo; }
</ins><span class="cx">
</span><ins>+
</ins><span class="cx"> protected:
</span><del>- WEBCORE_EXPORT WebVideoFullscreenModelVideoElement(WebPlaybackSessionModelMediaElement&);
</del><ins>+ WEBCORE_EXPORT WebVideoFullscreenModelVideoElement();
</ins><span class="cx">
</span><span class="cx"> private:
</span><ins>+ void setHasVideo(bool);
+ void setVideoDimensions(const FloatSize&);
+
</ins><span class="cx"> static const Vector<WTF::AtomicString>& observedEventNames();
</span><span class="cx"> const WTF::AtomicString& eventNameAll();
</span><span class="cx">
</span><del>- Ref<WebPlaybackSessionModelMediaElement> m_playbackSessionModel;
</del><span class="cx"> RefPtr<HTMLVideoElement> m_videoElement;
</span><span class="cx"> RetainPtr<PlatformLayer> m_videoFullscreenLayer;
</span><span class="cx"> bool m_isListening { false };
</span><del>- WebVideoFullscreenInterface* m_videoFullscreenInterface { nullptr };
</del><ins>+ HashSet<WebVideoFullscreenModelClient*> m_clients;
+ bool m_hasVideo { false };
+ FloatSize m_videoDimensions;
</ins><span class="cx"> FloatRect m_videoFrame;
</span><span class="cx"> Vector<RefPtr<TextTrack>> m_legibleTracksForMenu;
</span><span class="cx"> Vector<RefPtr<AudioTrack>> m_audioTracksForMenu;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformcocoaWebVideoFullscreenModelVideoElementmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/cocoa/WebVideoFullscreenModelVideoElement.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -51,9 +51,8 @@
</span><span class="cx">
</span><span class="cx"> using namespace WebCore;
</span><span class="cx">
</span><del>-WebVideoFullscreenModelVideoElement::WebVideoFullscreenModelVideoElement(WebPlaybackSessionModelMediaElement& playbackSessionModel)
</del><ins>+WebVideoFullscreenModelVideoElement::WebVideoFullscreenModelVideoElement()
</ins><span class="cx"> : EventListener(EventListener::CPPEventListenerType)
</span><del>- , m_playbackSessionModel(playbackSessionModel)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -61,18 +60,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenModelVideoElement::setWebVideoFullscreenInterface(WebVideoFullscreenInterface* interface)
-{
- if (interface == m_videoFullscreenInterface)
- return;
-
- m_videoFullscreenInterface = interface;
- m_playbackSessionModel->setWebPlaybackSessionInterface(interface);
-
- if (m_videoFullscreenInterface && m_videoElement)
- m_videoFullscreenInterface->setVideoDimensions(true, m_videoElement->videoWidth(), m_videoElement->videoHeight());
-}
-
</del><span class="cx"> void WebVideoFullscreenModelVideoElement::setVideoElement(HTMLVideoElement* videoElement)
</span><span class="cx"> {
</span><span class="cx"> if (m_videoElement == videoElement)
</span><span class="lines">@@ -89,17 +76,13 @@
</span><span class="cx">
</span><span class="cx"> m_videoElement = videoElement;
</span><span class="cx">
</span><del>- if (!m_videoElement)
- return;
</del><ins>+ if (m_videoElement) {
+ for (auto& eventName : observedEventNames())
+ m_videoElement->addEventListener(eventName, *this, false);
+ m_isListening = true;
+ }
</ins><span class="cx">
</span><del>- for (auto& eventName : observedEventNames())
- m_videoElement->addEventListener(eventName, *this, false);
- m_isListening = true;
-
</del><span class="cx"> updateForEventName(eventNameAll());
</span><del>-
- if (m_videoFullscreenInterface)
- m_videoFullscreenInterface->setVideoDimensions(true, videoElement->videoWidth(), videoElement->videoHeight());
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenModelVideoElement::handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event* event)
</span><span class="lines">@@ -109,14 +92,16 @@
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenModelVideoElement::updateForEventName(const WTF::AtomicString& eventName)
</span><span class="cx"> {
</span><del>- if (!m_videoElement || !m_videoFullscreenInterface)
</del><ins>+ if (m_clients.isEmpty())
</ins><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> bool all = eventName == eventNameAll();
</span><span class="cx">
</span><span class="cx"> if (all
</span><del>- || eventName == eventNames().resizeEvent)
- m_videoFullscreenInterface->setVideoDimensions(true, m_videoElement->videoWidth(), m_videoElement->videoHeight());
</del><ins>+ || eventName == eventNames().resizeEvent) {
+ setHasVideo(m_videoElement);
+ setVideoDimensions(m_videoElement ? FloatSize(m_videoElement->videoWidth(), m_videoElement->videoHeight()) : FloatSize());
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenModelVideoElement::setVideoFullscreenLayer(PlatformLayer* videoLayer, std::function<void()> completionHandler)
</span><span class="lines">@@ -202,6 +187,18 @@
</span><span class="cx"> m_videoElement->fullscreenModeChanged(videoFullscreenMode);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebVideoFullscreenModelVideoElement::addClient(WebVideoFullscreenModelClient& client)
+{
+ ASSERT(!m_clients.contains(&client));
+ m_clients.add(&client);
+}
+
+void WebVideoFullscreenModelVideoElement::removeClient(WebVideoFullscreenModelClient& client)
+{
+ ASSERT(m_clients.contains(&client));
+ m_clients.remove(&client);
+}
+
</ins><span class="cx"> bool WebVideoFullscreenModelVideoElement::isVisible() const
</span><span class="cx"> {
</span><span class="cx"> if (!m_videoElement)
</span><span class="lines">@@ -213,4 +210,26 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebVideoFullscreenModelVideoElement::setHasVideo(bool hasVideo)
+{
+ if (hasVideo == m_hasVideo)
+ return;
+
+ m_hasVideo = hasVideo;
+
+ for (auto& client : m_clients)
+ client->hasVideoChanged(m_hasVideo);
+}
+
+void WebVideoFullscreenModelVideoElement::setVideoDimensions(const FloatSize& videoDimensions)
+{
+ if (m_videoDimensions == videoDimensions)
+ return;
+
+ m_videoDimensions = videoDimensions;
+
+ for (auto& client : m_clients)
+ client->videoDimensionsChanged(m_videoDimensions);
+}
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebAVPlayerControllerh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -42,8 +42,6 @@
</span><span class="cx"> BOOL _pictureInPictureInterrupted;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-- (void)resetState;
-
</del><span class="cx"> @property (retain) AVPlayerController* playerControllerProxy;
</span><span class="cx"> @property (assign) WebCore::WebPlaybackSessionModel* delegate;
</span><span class="cx"> @property (assign) WebCore::WebPlaybackSessionInterfaceAVKit* playbackSessionInterface;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebAVPlayerControllermm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebAVPlayerController.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -75,38 +75,6 @@
</span><span class="cx"> [super dealloc];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-- (void)resetState
-{
- self.contentDuration = 0;
- self.maxTime = 0;
- self.contentDurationWithinEndTimes = 0;
- self.loadedTimeRanges = @[];
-
- self.canPlay = NO;
- self.canPause = NO;
- self.canTogglePlayback = NO;
- self.hasEnabledAudio = NO;
- self.canSeek = NO;
- self.minTime = 0;
- self.status = AVPlayerControllerStatusUnknown;
-
- self.timing = nil;
- self.rate = 0;
-
- self.hasEnabledVideo = NO;
- self.contentDimensions = CGSizeMake(0, 0);
-
- self.seekableTimeRanges = [NSMutableArray array];
-
- self.canScanBackward = NO;
-
- self.audioMediaSelectionOptions = nil;
- self.currentAudioMediaSelectionOption = nil;
-
- self.legibleMediaSelectionOptions = nil;
- self.currentLegibleMediaSelectionOption = nil;
-}
-
</del><span class="cx"> - (AVPlayer *)player
</span><span class="cx"> {
</span><span class="cx"> return nil;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebPlaybackSessionInterfaceAVKith"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include "HTMLMediaElementEnums.h"
</span><span class="cx"> #include "Timer.h"
</span><span class="cx"> #include "WebPlaybackSessionInterface.h"
</span><ins>+#include "WebPlaybackSessionModel.h"
</ins><span class="cx"> #include <functional>
</span><span class="cx"> #include <objc/objc.h>
</span><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="lines">@@ -54,52 +55,43 @@
</span><span class="cx"> class WebPlaybackSessionModel;
</span><span class="cx"> class WebPlaybackSessionChangeObserver;
</span><span class="cx">
</span><del>-class WebPlaybackSessionInterfaceAVKitClient {
-public:
- virtual ~WebPlaybackSessionInterfaceAVKitClient() { }
-
- virtual void externalPlaybackEnabledChanged(bool) = 0;
-};
-
</del><span class="cx"> class WEBCORE_EXPORT WebPlaybackSessionInterfaceAVKit
</span><span class="cx"> : public WebPlaybackSessionInterface
</span><ins>+ , public WebPlaybackSessionModelClient
</ins><span class="cx"> , public RefCounted<WebPlaybackSessionInterfaceAVKit> {
</span><span class="cx">
</span><span class="cx"> public:
</span><del>- static Ref<WebPlaybackSessionInterfaceAVKit> create()
</del><ins>+ static Ref<WebPlaybackSessionInterfaceAVKit> create(WebPlaybackSessionModel& model)
</ins><span class="cx"> {
</span><del>- return adoptRef(*new WebPlaybackSessionInterfaceAVKit());
</del><ins>+ return adoptRef(*new WebPlaybackSessionInterfaceAVKit(model));
</ins><span class="cx"> }
</span><span class="cx"> virtual ~WebPlaybackSessionInterfaceAVKit();
</span><del>- WEBCORE_EXPORT void setWebPlaybackSessionModel(WebPlaybackSessionModel*);
</del><span class="cx"> WebPlaybackSessionModel* webPlaybackSessionModel() const { return m_playbackSessionModel; }
</span><del>- void setClient(WebPlaybackSessionInterfaceAVKitClient* client) { m_client = client; }
</del><span class="cx">
</span><ins>+ // WebPlaybackSessionInterface
</ins><span class="cx"> WEBCORE_EXPORT void resetMediaState() override;
</span><del>- WEBCORE_EXPORT void setDuration(double) override;
- WEBCORE_EXPORT void setCurrentTime(double currentTime, double anchorTime) override;
- WEBCORE_EXPORT void setBufferedTime(double) override;
- WEBCORE_EXPORT void setRate(bool isPlaying, float playbackRate) override;
- WEBCORE_EXPORT void setSeekableRanges(const TimeRanges&) override;
- WEBCORE_EXPORT void setCanPlayFastReverse(bool) override;
- WEBCORE_EXPORT void setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) override;
- WEBCORE_EXPORT void setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) override;
- WEBCORE_EXPORT void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) override;
- WEBCORE_EXPORT void setWirelessVideoPlaybackDisabled(bool) override;
- bool wirelessVideoPlaybackDisabled() const;
</del><span class="cx">
</span><ins>+ // WebPlaybackSessionModelClient
+ WEBCORE_EXPORT void durationChanged(double) override;
+ WEBCORE_EXPORT void currentTimeChanged(double currentTime, double anchorTime) override;
+ WEBCORE_EXPORT void bufferedTimeChanged(double) override;
+ WEBCORE_EXPORT void rateChanged(bool isPlaying, float playbackRate) override;
+ WEBCORE_EXPORT void seekableRangesChanged(const TimeRanges&) override;
+ WEBCORE_EXPORT void canPlayFastReverseChanged(bool) override;
+ WEBCORE_EXPORT void audioMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex) override;
+ WEBCORE_EXPORT void legibleMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex) override;
+ WEBCORE_EXPORT void externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String& localizedDeviceName) override;
+ WEBCORE_EXPORT void wirelessVideoPlaybackDisabledChanged(bool) override;
+
</ins><span class="cx"> WEBCORE_EXPORT virtual void invalidate();
</span><span class="cx">
</span><span class="cx"> WebAVPlayerController *playerController() const { return m_playerController.get(); }
</span><span class="cx">
</span><span class="cx"> protected:
</span><del>- WEBCORE_EXPORT WebPlaybackSessionInterfaceAVKit();
</del><ins>+ WEBCORE_EXPORT WebPlaybackSessionInterfaceAVKit(WebPlaybackSessionModel&);
</ins><span class="cx">
</span><span class="cx"> RetainPtr<WebAVPlayerController> m_playerController;
</span><span class="cx"> WebPlaybackSessionModel* m_playbackSessionModel { nullptr };
</span><del>- WebPlaybackSessionInterfaceAVKitClient* m_client { nullptr};
-
- bool m_wirelessVideoPlaybackDisabled { true };
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebPlaybackSessionInterfaceAVKitmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebPlaybackSessionInterfaceAVKit.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -47,31 +47,55 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-WebPlaybackSessionInterfaceAVKit::WebPlaybackSessionInterfaceAVKit()
</del><ins>+WebPlaybackSessionInterfaceAVKit::WebPlaybackSessionInterfaceAVKit(WebPlaybackSessionModel& model)
</ins><span class="cx"> : m_playerController(adoptNS([[WebAVPlayerController alloc] init]))
</span><ins>+ , m_playbackSessionModel(&model)
</ins><span class="cx"> {
</span><ins>+ model.addClient(*this);
</ins><span class="cx"> [m_playerController setPlaybackSessionInterface:this];
</span><ins>+ [m_playerController setDelegate:&model];
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> WebPlaybackSessionInterfaceAVKit::~WebPlaybackSessionInterfaceAVKit()
</span><span class="cx"> {
</span><del>- WebAVPlayerController* playerController = m_playerController.get();
- if (playerController && playerController.externalPlaybackActive)
- setExternalPlayback(false, TargetTypeNone, "");
</del><ins>+ [m_playerController setPlaybackSessionInterface:nullptr];
+ [m_playerController setExternalPlaybackActive:false];
+
+ invalidate();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionInterfaceAVKit::resetMediaState()
</span><span class="cx"> {
</span><del>- [m_playerController resetState];
-}
</del><ins>+ WebAVPlayerController* playerController = m_playerController.get();
</ins><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setWebPlaybackSessionModel(WebPlaybackSessionModel* model)
-{
- m_playbackSessionModel = model;
- [m_playerController setDelegate:m_playbackSessionModel];
</del><ins>+ playerController.contentDuration = 0;
+ playerController.maxTime = 0;
+ playerController.contentDurationWithinEndTimes = 0;
+ playerController.loadedTimeRanges = @[];
+
+ playerController.canPlay = NO;
+ playerController.canPause = NO;
+ playerController.canTogglePlayback = NO;
+ playerController.hasEnabledAudio = NO;
+ playerController.canSeek = NO;
+ playerController.minTime = 0;
+ playerController.status = AVPlayerControllerStatusUnknown;
+
+ playerController.timing = nil;
+ playerController.rate = 0;
+
+ playerController.seekableTimeRanges = [NSMutableArray array];
+
+ playerController.canScanBackward = NO;
+
+ playerController.audioMediaSelectionOptions = nil;
+ playerController.currentAudioMediaSelectionOption = nil;
+
+ playerController.legibleMediaSelectionOptions = nil;
+ playerController.currentLegibleMediaSelectionOption = nil;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setDuration(double duration)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::durationChanged(double duration)
</ins><span class="cx"> {
</span><span class="cx"> WebAVPlayerController* playerController = m_playerController.get();
</span><span class="cx">
</span><span class="lines">@@ -90,7 +114,7 @@
</span><span class="cx"> playerController.status = AVPlayerControllerStatusReadyToPlay;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setCurrentTime(double currentTime, double anchorTime)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::currentTimeChanged(double currentTime, double anchorTime)
</ins><span class="cx"> {
</span><span class="cx"> NSTimeInterval anchorTimeStamp = ![m_playerController rate] ? NAN : anchorTime;
</span><span class="cx"> AVValueTiming *timing = [getAVValueTimingClass() valueTimingWithAnchorValue:currentTime
</span><span class="lines">@@ -99,7 +123,7 @@
</span><span class="cx"> [m_playerController setTiming:timing];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setBufferedTime(double bufferedTime)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::bufferedTimeChanged(double bufferedTime)
</ins><span class="cx"> {
</span><span class="cx"> WebAVPlayerController* playerController = m_playerController.get();
</span><span class="cx"> double duration = playerController.contentDuration;
</span><span class="lines">@@ -111,12 +135,12 @@
</span><span class="cx"> playerController.loadedTimeRanges = @[@0, @(normalizedBufferedTime)];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setRate(bool isPlaying, float playbackRate)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::rateChanged(bool isPlaying, float playbackRate)
</ins><span class="cx"> {
</span><span class="cx"> [m_playerController setRate:isPlaying ? playbackRate : 0.];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setSeekableRanges(const TimeRanges& timeRanges)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::seekableRangesChanged(const TimeRanges& timeRanges)
</ins><span class="cx"> {
</span><span class="cx"> RetainPtr<NSMutableArray> seekableRanges = adoptNS([[NSMutableArray alloc] init]);
</span><span class="cx"> ExceptionCode exceptionCode;
</span><span class="lines">@@ -132,7 +156,7 @@
</span><span class="cx"> [m_playerController setSeekableTimeRanges:seekableRanges.get()];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setCanPlayFastReverse(bool canPlayFastReverse)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::canPlayFastReverseChanged(bool canPlayFastReverse)
</ins><span class="cx"> {
</span><span class="cx"> [m_playerController setCanScanBackward:canPlayFastReverse];
</span><span class="cx"> }
</span><span class="lines">@@ -148,7 +172,7 @@
</span><span class="cx"> return webOptions;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setAudioMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::audioMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><span class="cx"> RetainPtr<NSMutableArray> webOptions = mediaSelectionOptions(options);
</span><span class="cx"> [m_playerController setAudioMediaSelectionOptions:webOptions.get()];
</span><span class="lines">@@ -156,7 +180,7 @@
</span><span class="cx"> [m_playerController setCurrentAudioMediaSelectionOption:[webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)]];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setLegibleMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::legibleMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><span class="cx"> RetainPtr<NSMutableArray> webOptions = mediaSelectionOptions(options);
</span><span class="cx"> [m_playerController setLegibleMediaSelectionOptions:webOptions.get()];
</span><span class="lines">@@ -164,12 +188,12 @@
</span><span class="cx"> [m_playerController setCurrentLegibleMediaSelectionOption:[webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)]];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setExternalPlayback(bool enabled, ExternalPlaybackTargetType targetType, String localizedDeviceName)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType targetType, const String& localizedDeviceName)
</ins><span class="cx"> {
</span><span class="cx"> AVPlayerControllerExternalPlaybackType externalPlaybackType = AVPlayerControllerExternalPlaybackTypeNone;
</span><del>- if (targetType == TargetTypeAirPlay)
</del><ins>+ if (targetType == WebPlaybackSessionModel::TargetTypeAirPlay)
</ins><span class="cx"> externalPlaybackType = AVPlayerControllerExternalPlaybackTypeAirPlay;
</span><del>- else if (targetType == TargetTypeTVOut)
</del><ins>+ else if (targetType == WebPlaybackSessionModel::TargetTypeTVOut)
</ins><span class="cx"> externalPlaybackType = AVPlayerControllerExternalPlaybackTypeTVOut;
</span><span class="cx">
</span><span class="cx"> WebAVPlayerController* playerController = m_playerController.get();
</span><span class="lines">@@ -176,24 +200,21 @@
</span><span class="cx"> playerController.externalPlaybackAirPlayDeviceLocalizedName = localizedDeviceName;
</span><span class="cx"> playerController.externalPlaybackType = externalPlaybackType;
</span><span class="cx"> playerController.externalPlaybackActive = enabled;
</span><del>-
- if (m_client)
- m_client->externalPlaybackEnabledChanged(enabled);
</del><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::setWirelessVideoPlaybackDisabled(bool disabled)
</del><ins>+void WebPlaybackSessionInterfaceAVKit::wirelessVideoPlaybackDisabledChanged(bool disabled)
</ins><span class="cx"> {
</span><span class="cx"> [m_playerController setAllowsExternalPlayback:!disabled];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool WebPlaybackSessionInterfaceAVKit::wirelessVideoPlaybackDisabled() const
</del><ins>+void WebPlaybackSessionInterfaceAVKit::invalidate()
</ins><span class="cx"> {
</span><del>- return [m_playerController allowsExternalPlayback];
-}
</del><ins>+ if (!m_playbackSessionModel)
+ return;
</ins><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceAVKit::invalidate()
-{
- m_playbackSessionModel = nil;
</del><ins>+ [m_playerController setDelegate:nullptr];
+ m_playbackSessionModel->removeClient(*this);
+ m_playbackSessionModel = nullptr;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebVideoFullscreenControllerAVKitmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -91,7 +91,6 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> class WebVideoFullscreenControllerContext;
</span><del>-class WebVideoFullscreenSessionModel;
</del><span class="cx">
</span><span class="cx"> @interface WebVideoFullscreenController (delegate)
</span><span class="cx"> -(void)didFinishFullscreen:(WebVideoFullscreenControllerContext*)context;
</span><span class="lines">@@ -100,7 +99,10 @@
</span><span class="cx"> class WebVideoFullscreenControllerContext final
</span><span class="cx"> : private WebVideoFullscreenInterface
</span><span class="cx"> , private WebVideoFullscreenModel
</span><ins>+ , private WebVideoFullscreenModelClient
</ins><span class="cx"> , private WebVideoFullscreenChangeObserver
</span><ins>+ , private WebPlaybackSessionModel
+ , private WebPlaybackSessionModelClient
</ins><span class="cx"> , public ThreadSafeRefCounted<WebVideoFullscreenControllerContext> {
</span><span class="cx">
</span><span class="cx"> public:
</span><span class="lines">@@ -115,19 +117,6 @@
</span><span class="cx"> void requestHideAndExitFullscreen();
</span><span class="cx"> void invalidate();
</span><span class="cx">
</span><del>- void play();
- void pause();
- void togglePlayState();
- void beginScrubbing();
- void endScrubbing();
- void seekToTime(double);
- void fastSeek(double time);
- void beginScanningForward();
- void beginScanningBackward();
- void endScanning();
- void selectAudioMediaOption(uint64_t);
- void selectLegibleMediaOption(uint64_t);
-
</del><span class="cx"> private:
</span><span class="cx"> WebVideoFullscreenControllerContext() { }
</span><span class="cx">
</span><span class="lines">@@ -138,119 +127,84 @@
</span><span class="cx"> void didCleanupFullscreen() override;
</span><span class="cx"> void fullscreenMayReturnToInline() override;
</span><span class="cx">
</span><del>- // WebVideoFullscreenInterface
- void resetMediaState() override;
- void setDuration(double) override;
- void setCurrentTime(double currentTime, double anchorTime) override;
- void setBufferedTime(double) override;
- void setRate(bool isPlaying, float playbackRate) override;
- void setVideoDimensions(bool hasVideo, float width, float height) override;
- void setSeekableRanges(const TimeRanges&) override;
- void setCanPlayFastReverse(bool) override;
- void setAudioMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex) override;
- void setLegibleMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex) override;
- void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, String localizedDeviceName) override;
- void setWirelessVideoPlaybackDisabled(bool) override;
</del><ins>+ // WebVideoFullscreenModelClient
+ void hasVideoChanged(bool) override;
+ void videoDimensionsChanged(const FloatSize&) override;
</ins><span class="cx">
</span><ins>+ // WebPlaybackSessionModel
+ void addClient(WebPlaybackSessionModelClient&) override;
+ void removeClient(WebPlaybackSessionModelClient&) override;
+ void play() override;
+ void pause() override;
+ void togglePlayState() override;
+ void beginScrubbing() override;
+ void endScrubbing() override;
+ void seekToTime(double) override;
+ void fastSeek(double time) override;
+ void beginScanningForward() override;
+ void beginScanningBackward() override;
+ void endScanning() override;
+ void selectAudioMediaOption(uint64_t) override;
+ void selectLegibleMediaOption(uint64_t) override;
+ double duration() const override;
+ double currentTime() const override;
+ double bufferedTime() const override;
+ bool isPlaying() const override;
+ float playbackRate() const override;
+ Ref<TimeRanges> seekableRanges() const override;
+ bool canPlayFastReverse() const override;
+ Vector<String> audioMediaSelectionOptions() const override;
+ uint64_t audioMediaSelectedIndex() const override;
+ Vector<String> legibleMediaSelectionOptions() const override;
+ uint64_t legibleMediaSelectedIndex() const override;
+ bool externalPlaybackEnabled() const override;
+ ExternalPlaybackTargetType externalPlaybackTargetType() const override;
+ String externalPlaybackLocalizedDeviceName() const override;
+ bool wirelessVideoPlaybackDisabled() const override;
+
+ // WebPlaybackSessionModelClient
+ void durationChanged(double) override;
+ void currentTimeChanged(double currentTime, double anchorTime) override;
+ void bufferedTimeChanged(double) override;
+ void rateChanged(bool isPlaying, float playbackRate) override;
+ void seekableRangesChanged(const TimeRanges&) override;
+ void canPlayFastReverseChanged(bool) override;
+ void audioMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex) override;
+ void legibleMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex) override;
+ void externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String& localizedDeviceName) override;
+ void wirelessVideoPlaybackDisabledChanged(bool) override;
+
</ins><span class="cx"> // WebVideoFullscreenModel
</span><ins>+ void addClient(WebVideoFullscreenModelClient&) override;
+ void removeClient(WebVideoFullscreenModelClient&) override;
</ins><span class="cx"> void requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx"> void setVideoLayerFrame(FloatRect) override;
</span><span class="cx"> void setVideoLayerGravity(WebVideoFullscreenModel::VideoGravity) override;
</span><span class="cx"> void fullscreenModeChanged(HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx"> bool isVisible() const override;
</span><ins>+ bool hasVideo() const override;
+ FloatSize videoDimensions() const override;
</ins><span class="cx">
</span><ins>+ HashSet<WebPlaybackSessionModelClient*> m_playbackClients;
+ HashSet<WebVideoFullscreenModelClient*> m_fullscreenClients;
</ins><span class="cx"> RefPtr<WebVideoFullscreenInterfaceAVKit> m_interface;
</span><del>- RefPtr<WebVideoFullscreenModelVideoElement> m_model;
</del><ins>+ RefPtr<WebVideoFullscreenModelVideoElement> m_fullscreenModel;
+ RefPtr<WebPlaybackSessionModelMediaElement> m_playbackModel;
</ins><span class="cx"> RefPtr<HTMLVideoElement> m_videoElement;
</span><span class="cx"> RetainPtr<UIView> m_videoFullscreenView;
</span><span class="cx"> RetainPtr<WebVideoFullscreenController> m_controller;
</span><del>- RefPtr<WebVideoFullscreenSessionModel> m_sessionModel;
</del><span class="cx"> };
</span><span class="cx">
</span><del>-
-class WebVideoFullscreenSessionModel final: public RefCounted<WebVideoFullscreenSessionModel>, public WebCore::WebPlaybackSessionModel {
-public:
- static Ref<WebVideoFullscreenSessionModel> create(WebVideoFullscreenControllerContext& controller)
- {
- return adoptRef(*new WebVideoFullscreenSessionModel(controller));
- }
- virtual ~WebVideoFullscreenSessionModel() { }
-
- void invalidate() { m_controller = nullptr; }
-
- void setDuration(double duration) { m_duration = duration; }
- void setCurrentTime(double currentTime) { m_currentTime = currentTime; }
- void setBufferedTime(double bufferedTime) { m_bufferedTime = bufferedTime; }
- void setIsPlaying(bool isPlaying) { m_isPlaying = isPlaying; }
- void setPlaybackRate(float playbackRate) { m_playbackRate = playbackRate; }
- void setSeekableRanges(WebCore::TimeRanges& seekableRanges) { m_seekableRanges = seekableRanges; }
- void setCanPlayFastReverse(bool canPlayFastReverse) { m_canPlayFastReverse = canPlayFastReverse; }
- void setAudioMediaSelectionOptions(const Vector<WTF::String>& audioMediaSelectionOptions) { m_audioMediaSelectionOptions = audioMediaSelectionOptions; }
- void setAudioMediaSelectedIndex(uint64_t audioMediaSelectedIndex) { m_audioMediaSelectedIndex = audioMediaSelectedIndex; }
- void setLegibleMediaSelectionOptions(const Vector<WTF::String>& legibleMediaSelectionOptions) { m_legibleMediaSelectionOptions = legibleMediaSelectionOptions; }
- void setLegibleMediaSelectedIndex(uint64_t legibleMediaSelectedIndex) { m_legibleMediaSelectedIndex = legibleMediaSelectedIndex; }
- void setExternalPlaybackEnabled(bool externalPlaybackEnabled) { m_externalPlaybackEnabled = externalPlaybackEnabled; }
- void setWirelessVideoPlaybackDisabled(bool wirelessVideoPlaybackDisabled) { m_wirelessVideoPlaybackDisabled = wirelessVideoPlaybackDisabled; }
-
-private:
- WebVideoFullscreenSessionModel(WebVideoFullscreenControllerContext& controller)
- : m_controller(&controller)
- {
- }
-
- void play() final;
- void pause() final;
- void togglePlayState() final;
- void beginScrubbing() final;
- void endScrubbing() final;
- void seekToTime(double) final;
- void fastSeek(double time) final;
- void beginScanningForward() final;
- void beginScanningBackward() final;
- void endScanning() final;
- void selectAudioMediaOption(uint64_t) final;
- void selectLegibleMediaOption(uint64_t) final;
-
- double duration() const final { return m_duration; }
- double currentTime() const final { return m_currentTime; }
- double bufferedTime() const final { return m_bufferedTime; }
- bool isPlaying() const final { return m_isPlaying; }
- float playbackRate() const final { return m_playbackRate; }
- Ref<WebCore::TimeRanges> seekableRanges() const final { return m_seekableRanges.copyRef(); }
- bool canPlayFastReverse() const final { return m_canPlayFastReverse; }
- Vector<WTF::String> audioMediaSelectionOptions() const final { return m_audioMediaSelectionOptions; }
- uint64_t audioMediaSelectedIndex() const final { return m_audioMediaSelectedIndex; }
- Vector<WTF::String> legibleMediaSelectionOptions() const final { return m_legibleMediaSelectionOptions; }
- uint64_t legibleMediaSelectedIndex() const final { return m_legibleMediaSelectedIndex; }
- bool externalPlaybackEnabled() const final { return m_externalPlaybackEnabled; }
- bool wirelessVideoPlaybackDisabled() const final { return m_wirelessVideoPlaybackDisabled; }
-
- WebVideoFullscreenControllerContext* m_controller;
- double m_duration { 0 };
- double m_currentTime { 0 };
- double m_bufferedTime { 0 };
- bool m_isPlaying { false };
- float m_playbackRate { 0 };
- Ref<WebCore::TimeRanges> m_seekableRanges { WebCore::TimeRanges::create() };
- bool m_canPlayFastReverse { false };
- Vector<WTF::String> m_audioMediaSelectionOptions;
- uint64_t m_audioMediaSelectedIndex { 0 };
- Vector<WTF::String> m_legibleMediaSelectionOptions;
- uint64_t m_legibleMediaSelectedIndex { 0 };
- bool m_externalPlaybackEnabled { false };
- bool m_wirelessVideoPlaybackDisabled { false };
-};
-
</del><span class="cx"> #pragma mark WebVideoFullscreenChangeObserver
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenControllerContext::didSetupFullscreen()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isUIThread());
</span><ins>+ RetainPtr<CALayer> videoFullscreenLayer = [m_videoFullscreenView layer];
</ins><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><del>- RetainPtr<CALayer> videoFullscreenLayer = [m_videoFullscreenView layer];
</del><span class="cx"> WebThreadRun([protectedThis, this, videoFullscreenLayer] {
</span><span class="cx"> [videoFullscreenLayer setBackgroundColor:cachedCGColor(WebCore::Color::transparent)];
</span><del>- m_model->setVideoFullscreenLayer(videoFullscreenLayer.get(), [protectedThis, this] {
</del><ins>+ m_fullscreenModel->setVideoFullscreenLayer(videoFullscreenLayer.get(), [protectedThis, this] {
</ins><span class="cx"> dispatch_async(dispatch_get_main_queue(), [protectedThis, this] {
</span><span class="cx"> m_interface->enterFullscreen();
</span><span class="cx"> });
</span><span class="lines">@@ -263,7 +217,7 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- m_model->setVideoFullscreenLayer(nil, [protectedThis, this] {
</del><ins>+ m_fullscreenModel->setVideoFullscreenLayer(nil, [protectedThis, this] {
</ins><span class="cx"> dispatch_async(dispatch_get_main_queue(), [protectedThis, this] {
</span><span class="cx"> m_interface->cleanupFullscreen();
</span><span class="cx"> });
</span><span class="lines">@@ -278,16 +232,14 @@
</span><span class="cx"> m_interface->setWebVideoFullscreenChangeObserver(nullptr);
</span><span class="cx"> m_interface = nullptr;
</span><span class="cx"> m_videoFullscreenView = nil;
</span><del>- m_sessionModel->invalidate();
- m_sessionModel = nullptr;
</del><span class="cx">
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- m_model->setVideoFullscreenLayer(nil);
- m_model->setWebVideoFullscreenInterface(nullptr);
- m_model->setVideoElement(nullptr);
- m_model->playbackSessionModel().setMediaElement(nullptr);
- m_model = nullptr;
</del><ins>+ m_fullscreenModel->setVideoFullscreenLayer(nil);
+ m_fullscreenModel->setVideoElement(nullptr);
+ m_playbackModel->setMediaElement(nullptr);
+ m_fullscreenModel->removeClient(*this);
+ m_fullscreenModel = nullptr;
</ins><span class="cx"> m_videoElement = nullptr;
</span><span class="cx">
</span><span class="cx"> [m_controller didFinishFullscreen:this];
</span><span class="lines">@@ -306,160 +258,197 @@
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#pragma mark WebVideoFullscreenInterface
</del><ins>+#pragma mark WebPlaybackSessionModelClient
</ins><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::resetMediaState()
</del><ins>+void WebVideoFullscreenControllerContext::durationChanged(double duration)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent() || isMainThread());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this] {
- if (m_interface)
- m_interface->resetMediaState();
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, duration] {
+ protectedThis->durationChanged(duration);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->durationChanged(duration);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setDuration(double duration)
</del><ins>+void WebVideoFullscreenControllerContext::currentTimeChanged(double currentTime, double anchorTime)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, duration] {
- if (m_interface)
- m_interface->setDuration(duration);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, currentTime, anchorTime] {
+ protectedThis->currentTimeChanged(currentTime, anchorTime);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->currentTimeChanged(currentTime, anchorTime);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setCurrentTime(double currentTime, double anchorTime)
</del><ins>+void WebVideoFullscreenControllerContext::bufferedTimeChanged(double bufferedTime)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, currentTime, anchorTime] {
- if (m_interface)
- m_interface->setCurrentTime(currentTime, anchorTime);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, bufferedTime] {
+ protectedThis->bufferedTimeChanged(bufferedTime);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->bufferedTimeChanged(bufferedTime);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setBufferedTime(double bufferedTime)
</del><ins>+void WebVideoFullscreenControllerContext::rateChanged(bool isPlaying, float playbackRate)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, bufferedTime] {
- if (m_interface)
- m_interface->setBufferedTime(bufferedTime);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, isPlaying, playbackRate] {
+ protectedThis->rateChanged(isPlaying, playbackRate);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->rateChanged(isPlaying, playbackRate);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setRate(bool isPlaying, float playbackRate)
</del><ins>+void WebVideoFullscreenControllerContext::hasVideoChanged(bool hasVideo)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, isPlaying, playbackRate] {
- if (m_interface)
- m_interface->setRate(isPlaying, playbackRate);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, hasVideo] {
+ protectedThis->hasVideoChanged(hasVideo);
+ });
+ return;
+ }
+
+ for (auto& client : m_fullscreenClients)
+ client->hasVideoChanged(hasVideo);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setVideoDimensions(bool hasVideo, float width, float height)
</del><ins>+void WebVideoFullscreenControllerContext::videoDimensionsChanged(const FloatSize& videoDimensions)
</ins><span class="cx"> {
</span><span class="cx"> if (WebThreadIsCurrent()) {
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><del>- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, hasVideo, width, height] {
- if (m_interface)
- m_interface->setVideoDimensions(hasVideo, width, height);
</del><ins>+ dispatch_async(dispatch_get_main_queue(), [protectedThis, videoDimensions = videoDimensions] {
+ protectedThis->videoDimensionsChanged(videoDimensions);
</ins><span class="cx"> });
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (m_interface)
- m_interface->setVideoDimensions(hasVideo, width, height);
</del><ins>+ for (auto& client : m_fullscreenClients)
+ client->videoDimensionsChanged(videoDimensions);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setSeekableRanges(const TimeRanges& timeRanges)
</del><ins>+void WebVideoFullscreenControllerContext::seekableRangesChanged(const TimeRanges& timeRanges)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- const PlatformTimeRanges& platformTimeRanges = timeRanges.ranges();
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, platformTimeRanges] {
- if (m_interface)
- m_interface->setSeekableRanges(TimeRanges::create(platformTimeRanges));
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, platformTimeRanges = timeRanges.ranges()] {
+ protectedThis->seekableRangesChanged(TimeRanges::create(platformTimeRanges));
+ });
+ return;
+ }
+
+ for (auto &client : m_playbackClients)
+ client->seekableRangesChanged(timeRanges);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setCanPlayFastReverse(bool canPlayFastReverse)
</del><ins>+void WebVideoFullscreenControllerContext::canPlayFastReverseChanged(bool canPlayFastReverse)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, canPlayFastReverse] {
- if (m_interface)
- m_interface->setCanPlayFastReverse(canPlayFastReverse);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, canPlayFastReverse] {
+ protectedThis->canPlayFastReverseChanged(canPlayFastReverse);
+ });
+ return;
+ }
+
+ for (auto &client : m_playbackClients)
+ client->canPlayFastReverseChanged(canPlayFastReverse);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setAudioMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex)
</del><ins>+void WebVideoFullscreenControllerContext::audioMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, options = options, selectedIndex] {
+ protectedThis->audioMediaSelectionOptionsChanged(options, selectedIndex);
+ });
+ return;
+ }
</ins><span class="cx">
</span><del>- RetainPtr<NSMutableArray> optionsArray = adoptNS([[NSMutableArray alloc] initWithCapacity:options.size()]);
- for (auto& name : options)
- [optionsArray addObject:name];
-
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, optionsArray, selectedIndex] {
- Vector<String> options;
- for (NSString *name : optionsArray.get())
- options.append(name);
-
- if (m_interface)
- m_interface->setAudioMediaSelectionOptions(options, selectedIndex);
- });
</del><ins>+ for (auto& client : m_playbackClients)
+ client->audioMediaSelectionOptionsChanged(options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setLegibleMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex)
</del><ins>+void WebVideoFullscreenControllerContext::legibleMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
-
- RetainPtr<NSMutableArray> optionsArray = adoptNS([[NSMutableArray alloc] initWithCapacity:options.size()]);
- for (auto& name : options)
- [optionsArray addObject:name];
-
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, optionsArray, selectedIndex] {
- Vector<String> options;
- for (NSString *name : optionsArray.get())
- options.append(name);
-
- if (m_interface)
- m_interface->setLegibleMediaSelectionOptions(options, selectedIndex);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, options = options, selectedIndex] {
+ protectedThis->legibleMediaSelectionOptionsChanged(options, selectedIndex);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->legibleMediaSelectionOptionsChanged(options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setExternalPlayback(bool enabled, ExternalPlaybackTargetType type, String localizedDeviceName)
</del><ins>+void WebVideoFullscreenControllerContext::externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType type, const String& localizedDeviceName)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- callOnMainThread([protectedThis = makeRef(*this), this, enabled, type, localizedDeviceName = localizedDeviceName.isolatedCopy()] {
- if (m_interface)
- m_interface->setExternalPlayback(enabled, type, localizedDeviceName);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ callOnMainThread([protectedThis = makeRef(*this), this, enabled, type, localizedDeviceName = localizedDeviceName.isolatedCopy()] {
+ for (auto& client : m_playbackClients)
+ client->externalPlaybackChanged(enabled, type, localizedDeviceName);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->externalPlaybackChanged(enabled, type, localizedDeviceName);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setWirelessVideoPlaybackDisabled(bool disabled)
</del><ins>+void WebVideoFullscreenControllerContext::wirelessVideoPlaybackDisabledChanged(bool disabled)
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, disabled] {
- if (m_interface)
- m_interface->setWirelessVideoPlaybackDisabled(disabled);
- });
</del><ins>+ if (WebThreadIsCurrent()) {
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, disabled] {
+ protectedThis->wirelessVideoPlaybackDisabledChanged(disabled);
+ });
+ return;
+ }
+
+ for (auto& client : m_playbackClients)
+ client->wirelessVideoPlaybackDisabledChanged(disabled);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #pragma mark WebVideoFullscreenModel
</span><span class="cx">
</span><ins>+void WebVideoFullscreenControllerContext::addClient(WebVideoFullscreenModelClient& client)
+{
+ ASSERT(!m_fullscreenClients.contains(&client));
+ m_fullscreenClients.add(&client);
+}
+
+void WebVideoFullscreenControllerContext::removeClient(WebVideoFullscreenModelClient& client)
+{
+ ASSERT(m_fullscreenClients.contains(&client));
+ m_fullscreenClients.remove(&client);
+}
+
</ins><span class="cx"> void WebVideoFullscreenControllerContext::requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, mode] {
</span><del>- if (m_model)
- m_model->requestFullscreenMode(mode);
</del><ins>+ if (m_fullscreenModel)
+ m_fullscreenModel->requestFullscreenMode(mode);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -479,8 +468,8 @@
</span><span class="cx">
</span><span class="cx"> [videoFullscreenLayer setSublayerTransform:CATransform3DIdentity];
</span><span class="cx">
</span><del>- if (m_model)
- m_model->setVideoLayerFrame(frame);
</del><ins>+ if (m_fullscreenModel)
+ m_fullscreenModel->setVideoLayerFrame(frame);
</ins><span class="cx"> [CATransaction commit];
</span><span class="cx"> });
</span><span class="cx"> });
</span><span class="lines">@@ -491,8 +480,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, videoGravity] {
</span><del>- if (m_model)
- m_model->setVideoLayerGravity(videoGravity);
</del><ins>+ if (m_fullscreenModel)
+ m_fullscreenModel->setVideoLayerGravity(videoGravity);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -501,8 +490,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, mode] {
</span><del>- if (m_model)
- m_model->fullscreenModeChanged(mode);
</del><ins>+ if (m_fullscreenModel)
+ m_fullscreenModel->fullscreenModeChanged(mode);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -509,18 +498,42 @@
</span><span class="cx"> bool WebVideoFullscreenControllerContext::isVisible() const
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isUIThread());
</span><del>- return m_model ? m_model->isVisible() : false;
</del><ins>+ return m_fullscreenModel ? m_fullscreenModel->isVisible() : false;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-#pragma mark - WebPlaybackSessionModelContext
</del><ins>+bool WebVideoFullscreenControllerContext::hasVideo() const
+{
+ ASSERT(isUIThread());
+ return m_fullscreenModel ? m_fullscreenModel->hasVideo() : false;
+}
</ins><span class="cx">
</span><ins>+FloatSize WebVideoFullscreenControllerContext::videoDimensions() const
+{
+ ASSERT(isUIThread());
+ return m_fullscreenModel ? m_fullscreenModel->videoDimensions() : FloatSize();
+}
+
+#pragma mark - WebPlaybackSessionModel
+
+void WebVideoFullscreenControllerContext::addClient(WebPlaybackSessionModelClient& client)
+{
+ ASSERT(!m_playbackClients.contains(&client));
+ m_playbackClients.add(&client);
+}
+
+void WebVideoFullscreenControllerContext::removeClient(WebPlaybackSessionModelClient& client)
+{
+ ASSERT(m_playbackClients.contains(&client));
+ m_playbackClients.remove(&client);
+}
+
</ins><span class="cx"> void WebVideoFullscreenControllerContext::play()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().play();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->play();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -529,8 +542,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().pause();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->pause();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -539,8 +552,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().togglePlayState();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->togglePlayState();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -549,8 +562,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().beginScrubbing();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->beginScrubbing();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -559,8 +572,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().endScrubbing();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->endScrubbing();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -569,8 +582,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, time] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().seekToTime(time);
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->seekToTime(time);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -579,8 +592,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, time] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().fastSeek(time);
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->fastSeek(time);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -589,8 +602,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().beginScanningForward();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->beginScanningForward();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -599,8 +612,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().beginScanningBackward();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->beginScanningBackward();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -609,8 +622,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().endScanning();
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->endScanning();
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -619,8 +632,8 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, index] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().selectAudioMediaOption(index);
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->selectAudioMediaOption(index);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -629,145 +642,155 @@
</span><span class="cx"> ASSERT(isUIThread());
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
</span><span class="cx"> WebThreadRun([protectedThis, this, index] {
</span><del>- if (m_model)
- m_model->playbackSessionModel().selectLegibleMediaOption(index);
</del><ins>+ if (m_playbackModel)
+ m_playbackModel->selectLegibleMediaOption(index);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#pragma mark Other
</del><ins>+double WebVideoFullscreenControllerContext::duration() const
+{
+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->duration() : 0;
+}
</ins><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::setUpFullscreen(HTMLVideoElement& videoElement, UIView *view, HTMLMediaElementEnums::VideoFullscreenMode mode)
</del><ins>+double WebVideoFullscreenControllerContext::currentTime() const
</ins><span class="cx"> {
</span><del>- ASSERT(isMainThread());
- RetainPtr<UIView> viewRef = view;
- m_videoElement = &videoElement;
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->currentTime() : 0;
+}
</ins><span class="cx">
</span><del>- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, viewRef, mode] {
- ASSERT(isUIThread());
</del><ins>+double WebVideoFullscreenControllerContext::bufferedTime() const
+{
+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->bufferedTime() : 0;
+}
</ins><span class="cx">
</span><del>- Ref<WebPlaybackSessionInterfaceAVKit> sessionInterface = WebPlaybackSessionInterfaceAVKit::create();
- m_interface = WebVideoFullscreenInterfaceAVKit::create(sessionInterface.get());
-
- m_sessionModel = WebVideoFullscreenSessionModel::create(*this);
- sessionInterface->setWebPlaybackSessionModel(m_sessionModel.get());
-
- m_interface->setWebVideoFullscreenModel(this);
- m_interface->setWebVideoFullscreenChangeObserver(this);
-
- m_videoFullscreenView = adoptNS([[getUIViewClass() alloc] init]);
-
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- WebThreadRun([protectedThis, this, viewRef, mode] {
- m_model = WebVideoFullscreenModelVideoElement::create(WebPlaybackSessionModelMediaElement::create().get());
- m_model->setWebVideoFullscreenInterface(this);
- m_model->playbackSessionModel().setMediaElement(m_videoElement.get());
- m_model->setVideoElement(m_videoElement.get());
-
- IntRect videoElementClientRect = elementRectInWindow(m_videoElement.get());
- FloatRect videoLayerFrame = FloatRect(FloatPoint(), videoElementClientRect.size());
- m_model->setVideoLayerFrame(videoLayerFrame);
-
- bool allowsPictureInPicture = m_videoElement->mediaSession().allowsPictureInPicture(*m_videoElement.get());
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, videoElementClientRect, viewRef, mode, allowsPictureInPicture] {
- m_interface->setupFullscreen(*m_videoFullscreenView.get(), videoElementClientRect, viewRef.get(), mode, allowsPictureInPicture);
- });
- });
- });
</del><ins>+bool WebVideoFullscreenControllerContext::isPlaying() const
+{
+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->isPlaying() : false;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::exitFullscreen()
</del><ins>+float WebVideoFullscreenControllerContext::playbackRate() const
</ins><span class="cx"> {
</span><del>- ASSERT(WebThreadIsCurrent() || isMainThread());
- IntRect clientRect = elementRectInWindow(m_videoElement.get());
- RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
- dispatch_async(dispatch_get_main_queue(), [protectedThis, this, clientRect] {
- ASSERT(isUIThread());
- m_interface->exitFullscreen(clientRect);
- });
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->playbackRate() : 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenControllerContext::requestHideAndExitFullscreen()
</del><ins>+Ref<TimeRanges> WebVideoFullscreenControllerContext::seekableRanges() const
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(isUIThread());
</span><del>- m_interface->requestHideAndExitFullscreen();
</del><ins>+ return m_playbackModel ? m_playbackModel->seekableRanges() : TimeRanges::create();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-#pragma mark WebPlaybackSessionModel
-
-void WebVideoFullscreenSessionModel::play()
</del><ins>+bool WebVideoFullscreenControllerContext::canPlayFastReverse() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->play();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->canPlayFastReverse() : false;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::pause()
</del><ins>+Vector<String> WebVideoFullscreenControllerContext::audioMediaSelectionOptions() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->pause();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->audioMediaSelectionOptions() : Vector<String>();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::togglePlayState()
</del><ins>+uint64_t WebVideoFullscreenControllerContext::audioMediaSelectedIndex() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->togglePlayState();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->audioMediaSelectedIndex() : -1;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::beginScrubbing()
</del><ins>+Vector<String> WebVideoFullscreenControllerContext::legibleMediaSelectionOptions() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->beginScrubbing();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->legibleMediaSelectionOptions() : Vector<String>();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::endScrubbing()
</del><ins>+uint64_t WebVideoFullscreenControllerContext::legibleMediaSelectedIndex() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->endScrubbing();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->legibleMediaSelectedIndex() : -1;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::seekToTime(double time)
</del><ins>+bool WebVideoFullscreenControllerContext::externalPlaybackEnabled() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->seekToTime(time);
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->externalPlaybackEnabled() : false;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::fastSeek(double time)
</del><ins>+WebPlaybackSessionModel::ExternalPlaybackTargetType WebVideoFullscreenControllerContext::externalPlaybackTargetType() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->fastSeek(time);
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->externalPlaybackTargetType() : TargetTypeNone;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::beginScanningForward()
</del><ins>+String WebVideoFullscreenControllerContext::externalPlaybackLocalizedDeviceName() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->beginScanningForward();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->externalPlaybackLocalizedDeviceName() : String();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::beginScanningBackward()
</del><ins>+bool WebVideoFullscreenControllerContext::wirelessVideoPlaybackDisabled() const
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->beginScanningBackward();
</del><ins>+ ASSERT(isUIThread());
+ return m_playbackModel ? m_playbackModel->wirelessVideoPlaybackDisabled() : true;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::endScanning()
</del><ins>+#pragma mark Other
+
+void WebVideoFullscreenControllerContext::setUpFullscreen(HTMLVideoElement& videoElement, UIView *view, HTMLMediaElementEnums::VideoFullscreenMode mode)
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->endScanning();
</del><ins>+ ASSERT(isMainThread());
+ RetainPtr<UIView> viewRef = view;
+ m_videoElement = &videoElement;
+ m_playbackModel = WebPlaybackSessionModelMediaElement::create();
+ m_playbackModel->addClient(*this);
+ m_playbackModel->setMediaElement(m_videoElement.get());
+
+ m_fullscreenModel = WebVideoFullscreenModelVideoElement::create();
+ m_fullscreenModel->addClient(*this);
+ m_fullscreenModel->setVideoElement(m_videoElement.get());
+
+ bool allowsPictureInPicture = m_videoElement->mediaSession().allowsPictureInPicture(*m_videoElement.get());
+
+ IntRect videoElementClientRect = elementRectInWindow(m_videoElement.get());
+ FloatRect videoLayerFrame = FloatRect(FloatPoint(), videoElementClientRect.size());
+ m_fullscreenModel->setVideoLayerFrame(videoLayerFrame);
+
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, this, videoElementClientRect, viewRef, mode, allowsPictureInPicture] {
+ ASSERT(isUIThread());
+
+ Ref<WebPlaybackSessionInterfaceAVKit> sessionInterface = WebPlaybackSessionInterfaceAVKit::create(*this);
+ m_interface = WebVideoFullscreenInterfaceAVKit::create(sessionInterface.get());
+ m_interface->setWebVideoFullscreenChangeObserver(this);
+ m_interface->setWebVideoFullscreenModel(this);
+ m_interface->setWebVideoFullscreenChangeObserver(this);
+
+ m_videoFullscreenView = adoptNS([[getUIViewClass() alloc] init]);
+
+ m_interface->setupFullscreen(*m_videoFullscreenView.get(), videoElementClientRect, viewRef.get(), mode, allowsPictureInPicture);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::selectAudioMediaOption(uint64_t optionId)
</del><ins>+void WebVideoFullscreenControllerContext::exitFullscreen()
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->selectAudioMediaOption(optionId);
</del><ins>+ ASSERT(WebThreadIsCurrent() || isMainThread());
+ IntRect clientRect = elementRectInWindow(m_videoElement.get());
+ RefPtr<WebVideoFullscreenControllerContext> protectedThis(this);
+ dispatch_async(dispatch_get_main_queue(), [protectedThis, this, clientRect] {
+ ASSERT(isUIThread());
+ m_interface->exitFullscreen(clientRect);
+ });
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenSessionModel::selectLegibleMediaOption(uint64_t optionId)
</del><ins>+void WebVideoFullscreenControllerContext::requestHideAndExitFullscreen()
</ins><span class="cx"> {
</span><del>- if (m_controller)
- m_controller->selectLegibleMediaOption(optionId);
</del><ins>+ ASSERT(isUIThread());
+ m_interface->requestHideAndExitFullscreen();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-
</del><span class="cx"> @implementation WebVideoFullscreenController {
</span><span class="cx"> RefPtr<WebVideoFullscreenControllerContext> _context;
</span><span class="cx"> RefPtr<HTMLVideoElement> _videoElement;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKith"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include "Timer.h"
</span><span class="cx"> #include "WebPlaybackSessionInterfaceAVKit.h"
</span><span class="cx"> #include "WebVideoFullscreenInterface.h"
</span><ins>+#include "WebVideoFullscreenModel.h"
</ins><span class="cx"> #include <functional>
</span><span class="cx"> #include <objc/objc.h>
</span><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="lines">@@ -57,12 +58,14 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> class IntRect;
</span><ins>+class FloatSize;
</ins><span class="cx"> class WebVideoFullscreenModel;
</span><span class="cx"> class WebVideoFullscreenChangeObserver;
</span><span class="cx">
</span><span class="cx"> class WEBCORE_EXPORT WebVideoFullscreenInterfaceAVKit final
</span><span class="cx"> : public WebVideoFullscreenInterface
</span><del>- , public WebPlaybackSessionInterfaceAVKitClient
</del><ins>+ , public WebVideoFullscreenModelClient
+ , public WebPlaybackSessionModelClient
</ins><span class="cx"> , public RefCounted<WebVideoFullscreenInterfaceAVKit> {
</span><span class="cx">
</span><span class="cx"> public:
</span><span class="lines">@@ -72,18 +75,13 @@
</span><span class="cx"> WEBCORE_EXPORT void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*);
</span><span class="cx"> WebPlaybackSessionModel* webPlaybackSessionModel() const { return m_playbackSessionInterface->webPlaybackSessionModel(); }
</span><span class="cx">
</span><del>- WEBCORE_EXPORT void resetMediaState() final;
- WEBCORE_EXPORT void setDuration(double) final;
- WEBCORE_EXPORT void setCurrentTime(double currentTime, double anchorTime) final;
- WEBCORE_EXPORT void setBufferedTime(double) final;
- WEBCORE_EXPORT void setRate(bool isPlaying, float playbackRate) final;
- WEBCORE_EXPORT void setVideoDimensions(bool hasVideo, float width, float height) final;
- WEBCORE_EXPORT void setSeekableRanges(const TimeRanges&) final;
- WEBCORE_EXPORT void setCanPlayFastReverse(bool) final;
- WEBCORE_EXPORT void setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) final;
- WEBCORE_EXPORT void setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) final;
- WEBCORE_EXPORT void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) final;
- WEBCORE_EXPORT void setWirelessVideoPlaybackDisabled(bool) final;
</del><ins>+ // WebVideoFullscreenModelClient
+ WEBCORE_EXPORT void hasVideoChanged(bool) final;
+ WEBCORE_EXPORT void videoDimensionsChanged(const FloatSize&) final;
+
+ // WebPlaybackSessionModelClient
+ WEBCORE_EXPORT void externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String& localizedDeviceName) final;
+
</ins><span class="cx"> WEBCORE_EXPORT virtual void setupFullscreen(UIView&, const IntRect& initialRect, UIView *, HTMLMediaElementEnums::VideoFullscreenMode, bool allowsPictureInPicturePlayback);
</span><span class="cx"> WEBCORE_EXPORT virtual void enterFullscreen();
</span><span class="cx"> WEBCORE_EXPORT virtual void exitFullscreen(const IntRect& finalRect);
</span><span class="lines">@@ -127,7 +125,6 @@
</span><span class="cx"> void enterPictureInPicture();
</span><span class="cx"> void enterFullscreenStandard();
</span><span class="cx"> void watchdogTimerFired();
</span><del>- void externalPlaybackEnabledChanged(bool) final;
</del><span class="cx"> WebAVPlayerController *playerController() const;
</span><span class="cx">
</span><span class="cx"> Ref<WebPlaybackSessionInterfaceAVKit> m_playbackSessionInterface;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKitmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -498,7 +498,9 @@
</span><span class="cx"> {
</span><span class="cx"> WebAVPlayerController* playerController = this->playerController();
</span><span class="cx"> if (playerController && playerController.externalPlaybackActive)
</span><del>- setExternalPlayback(false, TargetTypeNone, "");
</del><ins>+ externalPlaybackChanged(false, WebPlaybackSessionModel::TargetTypeNone, "");
+ if (m_videoFullscreenModel)
+ m_videoFullscreenModel->removeClient(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> WebAVPlayerController *WebVideoFullscreenInterfaceAVKit::playerController() const
</span><span class="lines">@@ -506,14 +508,18 @@
</span><span class="cx"> return m_playbackSessionInterface->playerController();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceAVKit::resetMediaState()
</del><ins>+void WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenModel(WebVideoFullscreenModel* model)
</ins><span class="cx"> {
</span><del>- m_playbackSessionInterface->resetMediaState();
-}
</del><ins>+ if (m_videoFullscreenModel)
+ m_videoFullscreenModel->removeClient(*this);
</ins><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenModel(WebVideoFullscreenModel* model)
-{
</del><span class="cx"> m_videoFullscreenModel = model;
</span><ins>+
+ if (m_videoFullscreenModel)
+ m_videoFullscreenModel->addClient(*this);
+
+ hasVideoChanged(m_videoFullscreenModel ? m_videoFullscreenModel->hasVideo() : false);
+ videoDimensionsChanged(m_videoFullscreenModel ? m_videoFullscreenModel->videoDimensions() : FloatSize());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver* observer)
</span><span class="lines">@@ -521,33 +527,17 @@
</span><span class="cx"> m_fullscreenChangeObserver = observer;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceAVKit::setDuration(double duration)
</del><ins>+void WebVideoFullscreenInterfaceAVKit::hasVideoChanged(bool hasVideo)
</ins><span class="cx"> {
</span><del>- m_playbackSessionInterface->setDuration(duration);
</del><ins>+ [playerController() setHasEnabledVideo:hasVideo];
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceAVKit::setCurrentTime(double currentTime, double anchorTime)
</del><ins>+void WebVideoFullscreenInterfaceAVKit::videoDimensionsChanged(const FloatSize& videoDimensions)
</ins><span class="cx"> {
</span><del>- m_playbackSessionInterface->setCurrentTime(currentTime, anchorTime);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setBufferedTime(double bufferedTime)
-{
- m_playbackSessionInterface->setBufferedTime(bufferedTime);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setRate(bool isPlaying, float playbackRate)
-{
- m_playbackSessionInterface->setRate(isPlaying, playbackRate);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setVideoDimensions(bool hasVideo, float width, float height)
-{
</del><span class="cx"> WebAVPlayerLayer *playerLayer = (WebAVPlayerLayer *)[m_playerLayerView playerLayer];
</span><span class="cx">
</span><del>- [playerLayer setVideoDimensions:CGSizeMake(width, height)];
- [playerController() setHasEnabledVideo:hasVideo];
- [playerController() setContentDimensions:CGSizeMake(width, height)];
</del><ins>+ [playerLayer setVideoDimensions:videoDimensions];
+ [playerController() setContentDimensions:videoDimensions];
</ins><span class="cx"> [m_playerLayerView setNeedsLayout];
</span><span class="cx">
</span><span class="cx"> WebAVPictureInPicturePlayerLayerView *pipView = (WebAVPictureInPicturePlayerLayerView *)[m_playerLayerView pictureInPicturePlayerLayerView];
</span><span class="lines">@@ -556,46 +546,11 @@
</span><span class="cx"> [pipView setNeedsLayout];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceAVKit::setSeekableRanges(const TimeRanges& timeRanges)
</del><ins>+void WebVideoFullscreenInterfaceAVKit::externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String&)
</ins><span class="cx"> {
</span><del>- m_playbackSessionInterface->setSeekableRanges(timeRanges);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setCanPlayFastReverse(bool canPlayFastReverse)
-{
- m_playbackSessionInterface->setCanPlayFastReverse(canPlayFastReverse);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setAudioMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex)
-{
- m_playbackSessionInterface->setAudioMediaSelectionOptions(options, selectedIndex);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setLegibleMediaSelectionOptions(const Vector<String>& options, uint64_t selectedIndex)
-{
- m_playbackSessionInterface->setLegibleMediaSelectionOptions(options, selectedIndex);
-}
-
-void WebVideoFullscreenInterfaceAVKit::setExternalPlayback(bool enabled, ExternalPlaybackTargetType targetType, String localizedDeviceName)
-{
- m_playbackSessionInterface->setExternalPlayback(enabled, targetType, localizedDeviceName);
-}
-
-void WebVideoFullscreenInterfaceAVKit::externalPlaybackEnabledChanged(bool enabled)
-{
</del><span class="cx"> [m_playerLayerView setHidden:enabled];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceAVKit::setWirelessVideoPlaybackDisabled(bool disabled)
-{
- m_playbackSessionInterface->setWirelessVideoPlaybackDisabled(disabled);
-}
-
-bool WebVideoFullscreenInterfaceAVKit::wirelessVideoPlaybackDisabled() const
-{
- return m_playbackSessionInterface->wirelessVideoPlaybackDisabled();
-}
-
</del><span class="cx"> void WebVideoFullscreenInterfaceAVKit::applicationDidBecomeActive()
</span><span class="cx"> {
</span><span class="cx"> LOG(Fullscreen, "WebVideoFullscreenInterfaceAVKit::applicationDidBecomeActive(%p)", this);
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformmacWebPlaybackSessionInterfaceMach"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx">
</span><span class="cx"> #include "HTMLMediaElementEnums.h"
</span><span class="cx"> #include "WebPlaybackSessionInterface.h"
</span><ins>+#include "WebPlaybackSessionModel.h"
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="lines">@@ -40,38 +41,25 @@
</span><span class="cx"> class IntRect;
</span><span class="cx"> class WebPlaybackSessionModel;
</span><span class="cx">
</span><del>-class WebPlaybackSessionInterfaceMacClient {
-public:
- virtual ~WebPlaybackSessionInterfaceMacClient() { }
-
- virtual void rateChanged(bool isPlaying, float playbackRate) = 0;
-};
-
</del><span class="cx"> class WEBCORE_EXPORT WebPlaybackSessionInterfaceMac final
</span><span class="cx"> : public WebPlaybackSessionInterface
</span><ins>+ , public WebPlaybackSessionModelClient
</ins><span class="cx"> , public RefCounted<WebPlaybackSessionInterfaceMac> {
</span><span class="cx"> public:
</span><del>- static Ref<WebPlaybackSessionInterfaceMac> create()
- {
- return adoptRef(*new WebPlaybackSessionInterfaceMac());
- }
</del><ins>+ static Ref<WebPlaybackSessionInterfaceMac> create(WebPlaybackSessionModel&);
</ins><span class="cx"> virtual ~WebPlaybackSessionInterfaceMac();
</span><span class="cx"> WebPlaybackSessionModel* webPlaybackSessionModel() const { return m_playbackSessionModel; }
</span><del>- WEBCORE_EXPORT void setWebPlaybackSessionModel(WebPlaybackSessionModel*);
- WebPlaybackSessionInterfaceMacClient* client() const { return m_client; }
- void setClient(WebPlaybackSessionInterfaceMacClient*);
</del><span class="cx">
</span><ins>+ // WebPlaybackSessionInterface
</ins><span class="cx"> WEBCORE_EXPORT void resetMediaState() final { }
</span><del>- WEBCORE_EXPORT void setDuration(double) final;
- WEBCORE_EXPORT void setCurrentTime(double /*currentTime*/, double /*anchorTime*/) final;
- WEBCORE_EXPORT void setBufferedTime(double) final { }
- WEBCORE_EXPORT void setRate(bool /*isPlaying*/, float /*playbackRate*/) final;
- WEBCORE_EXPORT void setSeekableRanges(const TimeRanges&) final;
- WEBCORE_EXPORT void setCanPlayFastReverse(bool) final { }
- WEBCORE_EXPORT void setAudioMediaSelectionOptions(const Vector<String>& /*options*/, uint64_t /*selectedIndex*/) final;
- WEBCORE_EXPORT void setLegibleMediaSelectionOptions(const Vector<String>& /*options*/, uint64_t /*selectedIndex*/) final;
- WEBCORE_EXPORT void setExternalPlayback(bool, ExternalPlaybackTargetType, String) final { }
- WEBCORE_EXPORT void setWirelessVideoPlaybackDisabled(bool) final { }
</del><ins>+
+ // WebPlaybackSessionModelClient
+ WEBCORE_EXPORT void durationChanged(double) final;
+ WEBCORE_EXPORT void currentTimeChanged(double /*currentTime*/, double /*anchorTime*/) final;
+ WEBCORE_EXPORT void rateChanged(bool /*isPlaying*/, float /*playbackRate*/) final;
+ WEBCORE_EXPORT void seekableRangesChanged(const TimeRanges&) final;
+ WEBCORE_EXPORT void audioMediaSelectionOptionsChanged(const Vector<String>& /*options*/, uint64_t /*selectedIndex*/) final;
+ WEBCORE_EXPORT void legibleMediaSelectionOptionsChanged(const Vector<String>& /*options*/, uint64_t /*selectedIndex*/) final;
</ins><span class="cx"> WEBCORE_EXPORT void invalidate();
</span><span class="cx"> WEBCORE_EXPORT void ensureControlsManager();
</span><span class="cx"> WEBCORE_EXPORT void setPlayBackControlsManager(WebPlaybackControlsManager *);
</span><span class="lines">@@ -78,9 +66,9 @@
</span><span class="cx"> WEBCORE_EXPORT WebPlaybackControlsManager *playBackControlsManager();
</span><span class="cx">
</span><span class="cx"> private:
</span><ins>+ WebPlaybackSessionInterfaceMac(WebPlaybackSessionModel&);
</ins><span class="cx"> WebPlaybackSessionModel* m_playbackSessionModel { nullptr };
</span><del>- WebPlaybackControlsManager *m_playbackControlsManager;
- WebPlaybackSessionInterfaceMacClient* m_client { nullptr };
</del><ins>+ WebPlaybackControlsManager *m_playbackControlsManager { nullptr };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformmacWebPlaybackSessionInterfaceMacmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/mac/WebPlaybackSessionInterfaceMac.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -45,24 +45,24 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-WebPlaybackSessionInterfaceMac::~WebPlaybackSessionInterfaceMac()
</del><ins>+Ref<WebPlaybackSessionInterfaceMac> WebPlaybackSessionInterfaceMac::create(WebPlaybackSessionModel& model)
</ins><span class="cx"> {
</span><ins>+ auto interface = adoptRef(*new WebPlaybackSessionInterfaceMac(model));
+ model.addClient(interface);
+ return interface;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setWebPlaybackSessionModel(WebPlaybackSessionModel* model)
</del><ins>+WebPlaybackSessionInterfaceMac::WebPlaybackSessionInterfaceMac(WebPlaybackSessionModel& model)
+ : m_playbackSessionModel(&model)
</ins><span class="cx"> {
</span><del>- m_playbackSessionModel = model;
</del><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setClient(WebPlaybackSessionInterfaceMacClient* client)
</del><ins>+WebPlaybackSessionInterfaceMac::~WebPlaybackSessionInterfaceMac()
</ins><span class="cx"> {
</span><del>- m_client = client;
-
- if (m_client && m_playbackSessionModel)
- m_client->rateChanged(m_playbackSessionModel->isPlaying(), m_playbackSessionModel->playbackRate());
</del><ins>+ invalidate();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setDuration(double duration)
</del><ins>+void WebPlaybackSessionInterfaceMac::durationChanged(double duration)
</ins><span class="cx"> {
</span><span class="cx"> WebPlaybackControlsManager* controlsManager = playBackControlsManager();
</span><span class="cx">
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx"> controlsManager.hasEnabledVideo = YES;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setCurrentTime(double currentTime, double anchorTime)
</del><ins>+void WebPlaybackSessionInterfaceMac::currentTimeChanged(double currentTime, double anchorTime)
</ins><span class="cx"> {
</span><span class="cx"> WebPlaybackControlsManager* controlsManager = playBackControlsManager();
</span><span class="cx">
</span><span class="lines">@@ -84,14 +84,11 @@
</span><span class="cx"> [controlsManager setTiming:timing];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setRate(bool isPlaying, float playbackRate)
</del><ins>+void WebPlaybackSessionInterfaceMac::rateChanged(bool isPlaying, float playbackRate)
</ins><span class="cx"> {
</span><span class="cx"> WebPlaybackControlsManager* controlsManager = playBackControlsManager();
</span><span class="cx"> [controlsManager setRate:isPlaying ? playbackRate : 0.];
</span><span class="cx"> [controlsManager setPlaying:isPlaying];
</span><del>-
- if (m_client)
- m_client->rateChanged(isPlaying, playbackRate);
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static RetainPtr<NSMutableArray> timeRangesToArray(const TimeRanges& timeRanges)
</span><span class="lines">@@ -107,26 +104,28 @@
</span><span class="cx"> return rangeArray;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setSeekableRanges(const TimeRanges& timeRanges)
</del><ins>+void WebPlaybackSessionInterfaceMac::seekableRangesChanged(const TimeRanges& timeRanges)
</ins><span class="cx"> {
</span><del>- WebPlaybackControlsManager* controlsManager = playBackControlsManager();
- [controlsManager setSeekableTimeRanges:timeRangesToArray(timeRanges).get()];
</del><ins>+ [playBackControlsManager() setSeekableTimeRanges:timeRangesToArray(timeRanges).get()];
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionInterfaceMac::audioMediaSelectionOptionsChanged(const Vector<WTF::String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><del>- WebPlaybackControlsManager* controlsManager = playBackControlsManager();
- [controlsManager setAudioMediaSelectionOptions:options withSelectedIndex:static_cast<NSUInteger>(selectedIndex)];
</del><ins>+ [playBackControlsManager() setAudioMediaSelectionOptions:options withSelectedIndex:static_cast<NSUInteger>(selectedIndex)];
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceMac::setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionInterfaceMac::legibleMediaSelectionOptionsChanged(const Vector<WTF::String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><del>- WebPlaybackControlsManager* controlsManager = playBackControlsManager();
- [controlsManager setLegibleMediaSelectionOptions:options withSelectedIndex:static_cast<NSUInteger>(selectedIndex)];
</del><ins>+ [playBackControlsManager() setLegibleMediaSelectionOptions:options withSelectedIndex:static_cast<NSUInteger>(selectedIndex)];
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionInterfaceMac::invalidate()
</span><span class="cx"> {
</span><ins>+ if (!m_playbackSessionModel)
+ return;
+
+ m_playbackSessionModel->removeClient(*this);
+ m_playbackSessionModel = nullptr;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionInterfaceMac::ensureControlsManager()
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformmacWebVideoFullscreenInterfaceMach"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -30,7 +30,9 @@
</span><span class="cx">
</span><span class="cx"> #include "HTMLMediaElementEnums.h"
</span><span class="cx"> #include "WebPlaybackSessionInterfaceMac.h"
</span><ins>+#include "WebPlaybackSessionModel.h"
</ins><span class="cx"> #include "WebVideoFullscreenInterface.h"
</span><ins>+#include "WebVideoFullscreenModel.h"
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="lines">@@ -40,13 +42,14 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> class IntRect;
</span><ins>+class FloatSize;
</ins><span class="cx"> class WebPlaybackSessionInterfaceMac;
</span><span class="cx"> class WebVideoFullscreenChangeObserver;
</span><del>-class WebVideoFullscreenModel;
</del><span class="cx">
</span><span class="cx"> class WEBCORE_EXPORT WebVideoFullscreenInterfaceMac
</span><span class="cx"> : public WebVideoFullscreenInterface
</span><del>- , private WebPlaybackSessionInterfaceMacClient
</del><ins>+ , public WebVideoFullscreenModelClient
+ , private WebPlaybackSessionModelClient
</ins><span class="cx"> , public RefCounted<WebVideoFullscreenInterfaceMac> {
</span><span class="cx">
</span><span class="cx"> public:
</span><span class="lines">@@ -61,19 +64,14 @@
</span><span class="cx"> WebVideoFullscreenChangeObserver* webVideoFullscreenChangeObserver() const { return m_fullscreenChangeObserver; }
</span><span class="cx"> WEBCORE_EXPORT void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*);
</span><span class="cx">
</span><del>- WEBCORE_EXPORT void resetMediaState() override { }
- WEBCORE_EXPORT void setDuration(double) override;
- WEBCORE_EXPORT void setCurrentTime(double /*currentTime*/, double /*anchorTime*/) override;
- WEBCORE_EXPORT void setBufferedTime(double) override { }
- WEBCORE_EXPORT void setRate(bool /*isPlaying*/, float /*playbackRate*/) override;
- WEBCORE_EXPORT void setVideoDimensions(bool hasVideo, float width, float height) final;
- WEBCORE_EXPORT void setSeekableRanges(const TimeRanges&) override;
- WEBCORE_EXPORT void setCanPlayFastReverse(bool) override { }
- WEBCORE_EXPORT void setAudioMediaSelectionOptions(const Vector<String>& /*options*/, uint64_t /*selectedIndex*/) override;
- WEBCORE_EXPORT void setLegibleMediaSelectionOptions(const Vector<String>& /*options*/, uint64_t /*selectedIndex*/) override;
- WEBCORE_EXPORT void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, String localizedDeviceName) override;
- WEBCORE_EXPORT void setWirelessVideoPlaybackDisabled(bool) override { }
</del><ins>+ // WebPlaybackSessionModelClient
+ WEBCORE_EXPORT void rateChanged(bool isPlaying, float playbackRate) override;
+ WEBCORE_EXPORT void externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String& localizedDeviceName) override;
</ins><span class="cx">
</span><ins>+ // WebVideoFullscreenModelClient
+ WEBCORE_EXPORT void hasVideoChanged(bool) final;
+ WEBCORE_EXPORT void videoDimensionsChanged(const FloatSize&) final;
+
</ins><span class="cx"> WEBCORE_EXPORT void setupFullscreen(NSView& layerHostedView, const IntRect& initialRect, NSWindow *parentWindow, HTMLMediaElementEnums::VideoFullscreenMode, bool allowsPictureInPicturePlayback);
</span><span class="cx"> WEBCORE_EXPORT void enterFullscreen();
</span><span class="cx"> WEBCORE_EXPORT void exitFullscreen(const IntRect& finalRect, NSWindow *parentWindow);
</span><span class="lines">@@ -95,8 +93,6 @@
</span><span class="cx"> WEBCORE_EXPORT bool mayAutomaticallyShowVideoPictureInPicture() const { return false; }
</span><span class="cx"> void applicationDidBecomeActive() { }
</span><span class="cx">
</span><del>- void rateChanged(bool isPlaying, float playbackRate) override;
-
</del><span class="cx"> WEBCORE_EXPORT WebVideoFullscreenInterfaceMacObjC *videoFullscreenInterfaceObjC();
</span><span class="cx">
</span><span class="cx"> private:
</span></span></pre></div>
<a id="branchessafari602branchSourceWebCoreplatformmacWebVideoFullscreenInterfaceMacmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebCore/platform/mac/WebVideoFullscreenInterfaceMac.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -351,18 +351,25 @@
</span><span class="cx"> WebVideoFullscreenInterfaceMac::WebVideoFullscreenInterfaceMac(WebPlaybackSessionInterfaceMac& playbackSessionInterface)
</span><span class="cx"> : m_playbackSessionInterface(playbackSessionInterface)
</span><span class="cx"> {
</span><del>- m_playbackSessionInterface->setClient(this);
</del><ins>+ ASSERT(m_playbackSessionInterface->webPlaybackSessionModel());
+ m_playbackSessionInterface->webPlaybackSessionModel()->addClient(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> WebVideoFullscreenInterfaceMac::~WebVideoFullscreenInterfaceMac()
</span><span class="cx"> {
</span><del>- if (m_playbackSessionInterface->client() == this)
- m_playbackSessionInterface->setClient(nullptr);
</del><ins>+ if (m_playbackSessionInterface->webPlaybackSessionModel())
+ m_playbackSessionInterface->webPlaybackSessionModel()->removeClient(*this);
+ if (m_videoFullscreenModel)
+ m_videoFullscreenModel->removeClient(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenInterfaceMac::setWebVideoFullscreenModel(WebVideoFullscreenModel* model)
</span><span class="cx"> {
</span><ins>+ if (m_videoFullscreenModel)
+ m_videoFullscreenModel->removeClient(*this);
</ins><span class="cx"> m_videoFullscreenModel = model;
</span><ins>+ if (m_videoFullscreenModel)
+ m_videoFullscreenModel->addClient(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenInterfaceMac::setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver* observer)
</span><span class="lines">@@ -392,41 +399,11 @@
</span><span class="cx"> m_videoFullscreenModel->fullscreenModeChanged(m_mode);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceMac::setDuration(double duration)
-{
- m_playbackSessionInterface->setDuration(duration);
-}
-
-void WebVideoFullscreenInterfaceMac::setCurrentTime(double currentTime, double anchorTime)
-{
- m_playbackSessionInterface->setCurrentTime(currentTime, anchorTime);
-}
-
-void WebVideoFullscreenInterfaceMac::setRate(bool isPlaying, float playbackRate)
-{
- m_playbackSessionInterface->setRate(isPlaying, playbackRate);
-}
-
</del><span class="cx"> void WebVideoFullscreenInterfaceMac::rateChanged(bool isPlaying, float playbackRate)
</span><span class="cx"> {
</span><span class="cx"> [videoFullscreenInterfaceObjC() updateIsPlaying:isPlaying newPlaybackRate:playbackRate];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceMac::setSeekableRanges(const TimeRanges& timeRanges)
-{
- m_playbackSessionInterface->setSeekableRanges(timeRanges);
-}
-
-void WebVideoFullscreenInterfaceMac::setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
-{
- m_playbackSessionInterface->setAudioMediaSelectionOptions(options, selectedIndex);
-}
-
-void WebVideoFullscreenInterfaceMac::setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
-{
- m_playbackSessionInterface->setLegibleMediaSelectionOptions(options, selectedIndex);
-}
-
</del><span class="cx"> void WebVideoFullscreenInterfaceMac::ensureControlsManager()
</span><span class="cx"> {
</span><span class="cx"> m_playbackSessionInterface->ensureControlsManager();
</span><span class="lines">@@ -539,26 +516,29 @@
</span><span class="cx"> [m_webVideoFullscreenInterfaceObjC exitPIPAnimatingToRect:(NSRect)inlineRect inWindow:parentWindow];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceMac::setExternalPlayback(bool enabled, ExternalPlaybackTargetType, String)
</del><ins>+void WebVideoFullscreenInterfaceMac::externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String&)
</ins><span class="cx"> {
</span><del>- LOG(Fullscreen, "WebVideoFullscreenInterfaceMac::setExternalPlayback(%p), enabled:%s", this, boolString(enabled));
</del><ins>+ LOG(Fullscreen, "WebVideoFullscreenInterfaceMac::externalPlaybackChanged(%p), enabled:%s", this, boolString(enabled));
</ins><span class="cx">
</span><span class="cx"> if (enabled && m_mode == HTMLMediaElementEnums::VideoFullscreenModePictureInPicture)
</span><span class="cx"> exitFullscreen(IntRect(), nil);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceMac::setVideoDimensions(bool hasVideo, float width, float height)
</del><ins>+void WebVideoFullscreenInterfaceMac::hasVideoChanged(bool hasVideo)
</ins><span class="cx"> {
</span><del>- LOG(Fullscreen, "WebVideoFullscreenInterfaceMac::setVideoDimensions(%p), hasVideo:%s, width:%.0f, height:%.0f", this, boolString(hasVideo), width, height);
</del><ins>+ LOG(Fullscreen, "WebVideoFullscreenInterfaceMac::hasVideoChanged(%p):%s", this, boolString(hasVideo));
</ins><span class="cx">
</span><del>- if (!hasVideo) {
</del><ins>+ if (!hasVideo)
</ins><span class="cx"> exitFullscreenWithoutAnimationToMode(HTMLMediaElementEnums::VideoFullscreenModeNone);
</span><del>- return;
- }
</del><ins>+}
</ins><span class="cx">
</span><ins>+void WebVideoFullscreenInterfaceMac::videoDimensionsChanged(const FloatSize& videoDimensions)
+{
+ LOG(Fullscreen, "WebVideoFullscreenInterfaceMac::videoDimensionsChanged(%p), width:%.0f, height:%.0f", this, videoDimensions.width(), videoDimensions.height());
+
</ins><span class="cx"> // Width and height can be zero when we are transitioning from one video to another. Ignore zero values.
</span><del>- if (width && height)
- [m_webVideoFullscreenInterfaceObjC setVideoDimensions:NSMakeSize(width, height)];
</del><ins>+ if (!videoDimensions.isZero())
+ [m_webVideoFullscreenInterfaceObjC setVideoDimensions:videoDimensions];
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool WebVideoFullscreenInterfaceMac::isPlayingVideoInEnhancedFullscreen() const
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit/mac/ChangeLog (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit/mac/ChangeLog        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit/mac/ChangeLog        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-09-09 Babak Shafiei <bshafiei@apple.com>
+
+ Merge r205365. rdar://problem/28020157
+
+ 2016-07-08 Jer Noble <jer.noble@apple.com>
+
+ Refactor WebPlaybackSessionModelMediaElement to be client based.
+ https://bugs.webkit.org/show_bug.cgi?id=159580
+
+ Reviewed by Eric Carlson.
+
+ No longer necessary to tell the models and interfaces about each other.
+
+ * WebView/WebView.mm:
+ (-[WebView _setUpPlaybackControlsManagerForMediaElement:]):
+ (-[WebView _clearPlaybackControlsManager]):
+
</ins><span class="cx"> 2016-07-28 Babak Shafiei <bshafiei@apple.com>
</span><span class="cx">
</span><span class="cx"> Merge r203855. rdar://problem/27557968
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKitmacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit/mac/WebView/WebView.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit/mac/WebView/WebView.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit/mac/WebView/WebView.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -8607,10 +8607,8 @@
</span><span class="cx"> _private->playbackSessionModel->setMediaElement(&mediaElement);
</span><span class="cx">
</span><span class="cx"> if (!_private->playbackSessionInterface)
</span><del>- _private->playbackSessionInterface = WebPlaybackSessionInterfaceMac::create();
</del><ins>+ _private->playbackSessionInterface = WebPlaybackSessionInterfaceMac::create(*_private->playbackSessionModel);
</ins><span class="cx">
</span><del>- _private->playbackSessionInterface->setWebPlaybackSessionModel(_private->playbackSessionModel.get());
- _private->playbackSessionModel->setWebPlaybackSessionInterface(_private->playbackSessionInterface.get());
</del><span class="cx"> [self updateWebViewAdditions];
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -8620,8 +8618,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> _private->playbackSessionModel->setMediaElement(nullptr);
</span><del>- _private->playbackSessionModel->setWebPlaybackSessionInterface(nullptr);
- _private->playbackSessionInterface->setWebPlaybackSessionModel(nullptr);
</del><ins>+ _private->playbackSessionInterface->invalidate();
</ins><span class="cx">
</span><span class="cx"> _private->playbackSessionModel = nullptr;
</span><span class="cx"> _private->playbackSessionInterface = nullptr;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/ChangeLog (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/ChangeLog        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/ChangeLog        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -1,5 +1,124 @@
</span><span class="cx"> 2016-09-09 Babak Shafiei <bshafiei@apple.com>
</span><span class="cx">
</span><ins>+ Merge r205365. rdar://problem/28020157
+
+ 2016-07-08 Jer Noble <jer.noble@apple.com>
+
+ Refactor WebPlaybackSessionModelMediaElement to be client based.
+ https://bugs.webkit.org/show_bug.cgi?id=159580
+
+ Reviewed by Eric Carlson.
+
+ Adopt the changes made in the WebPlaybackSessionModel,Interface and WebVideoFullscreenModel,Interface
+ in the WebPlaybackSessionManager,Proxy classes.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _initializeWithConfiguration:]): Deleted.
+ * UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h:
+ * UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm:
+ (WebKit::WebPlaybackSessionModelContext::addClient):
+ (WebKit::WebPlaybackSessionModelContext::removeClient):
+ (WebKit::WebPlaybackSessionModelContext::setDuration):
+ (WebKit::WebPlaybackSessionModelContext::setCurrentTime):
+ (WebKit::WebPlaybackSessionModelContext::setBufferedTime):
+ (WebKit::WebPlaybackSessionModelContext::setRate):
+ (WebKit::WebPlaybackSessionModelContext::setSeekableRanges):
+ (WebKit::WebPlaybackSessionModelContext::setCanPlayFastReverse):
+ (WebKit::WebPlaybackSessionModelContext::setAudioMediaSelectionOptions):
+ (WebKit::WebPlaybackSessionModelContext::setLegibleMediaSelectionOptions):
+ (WebKit::WebPlaybackSessionModelContext::setExternalPlayback):
+ (WebKit::WebPlaybackSessionModelContext::setWirelessVideoPlaybackDisabled):
+ (WebKit::WebPlaybackSessionManagerProxy::createModelAndInterface):
+ (WebKit::WebPlaybackSessionManagerProxy::removeClientForContext):
+ (WebKit::WebPlaybackSessionManagerProxy::setCurrentTime):
+ (WebKit::WebPlaybackSessionManagerProxy::setBufferedTime):
+ (WebKit::WebPlaybackSessionManagerProxy::setSeekableRangesVector):
+ (WebKit::WebPlaybackSessionManagerProxy::setCanPlayFastReverse):
+ (WebKit::WebPlaybackSessionManagerProxy::setAudioMediaSelectionOptions):
+ (WebKit::WebPlaybackSessionManagerProxy::setLegibleMediaSelectionOptions):
+ (WebKit::WebPlaybackSessionManagerProxy::setExternalPlaybackProperties):
+ (WebKit::WebPlaybackSessionManagerProxy::setWirelessVideoPlaybackDisabled):
+ (WebKit::WebPlaybackSessionManagerProxy::setDuration):
+ (WebKit::WebPlaybackSessionManagerProxy::setRate):
+ * UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h:
+ * UIProcess/Cocoa/WebVideoFullscreenManagerProxy.messages.in:
+ * UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm:
+ (WebKit::WebVideoFullscreenModelContext::addClient):
+ (WebKit::WebVideoFullscreenModelContext::removeClient):
+ (WebKit::WebVideoFullscreenManagerProxy::setHasVideo):
+ (WebKit::WebVideoFullscreenManagerProxy::setVideoDimensions):
+ * WebProcess/cocoa/WebPlaybackSessionManager.h:
+ * WebProcess/cocoa/WebPlaybackSessionManager.mm:
+ (WebKit::WebPlaybackSessionInterfaceContext::durationChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::currentTimeChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::bufferedTimeChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::rateChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::seekableRangesChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::canPlayFastReverseChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::audioMediaSelectionOptionsChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::legibleMediaSelectionOptionsChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::externalPlaybackChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::wirelessVideoPlaybackDisabledChanged):
+ (WebKit::WebPlaybackSessionManager::~WebPlaybackSessionManager):
+ (WebKit::WebPlaybackSessionManager::createModelAndInterface):
+ (WebKit::WebPlaybackSessionManager::removeContext):
+ (WebKit::WebPlaybackSessionManager::durationChanged):
+ (WebKit::WebPlaybackSessionManager::currentTimeChanged):
+ (WebKit::WebPlaybackSessionManager::bufferedTimeChanged):
+ (WebKit::WebPlaybackSessionManager::rateChanged):
+ (WebKit::WebPlaybackSessionManager::seekableRangesChanged):
+ (WebKit::WebPlaybackSessionManager::canPlayFastReverseChanged):
+ (WebKit::WebPlaybackSessionManager::audioMediaSelectionOptionsChanged):
+ (WebKit::WebPlaybackSessionManager::legibleMediaSelectionOptionsChanged):
+ (WebKit::WebPlaybackSessionManager::externalPlaybackChanged):
+ (WebKit::WebPlaybackSessionManager::wirelessVideoPlaybackDisabledChanged):
+ (WebKit::WebPlaybackSessionInterfaceContext::setDuration): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setCurrentTime): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setBufferedTime): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setRate): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setSeekableRanges): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setCanPlayFastReverse): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setAudioMediaSelectionOptions): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setLegibleMediaSelectionOptions): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setExternalPlayback): Deleted.
+ (WebKit::WebPlaybackSessionInterfaceContext::setWirelessVideoPlaybackDisabled): Deleted.
+ (WebKit::WebPlaybackSessionManager::setDuration): Deleted.
+ (WebKit::WebPlaybackSessionManager::setCurrentTime): Deleted.
+ (WebKit::WebPlaybackSessionManager::setBufferedTime): Deleted.
+ (WebKit::WebPlaybackSessionManager::setRate): Deleted.
+ (WebKit::WebPlaybackSessionManager::setSeekableRanges): Deleted.
+ (WebKit::WebPlaybackSessionManager::setCanPlayFastReverse): Deleted.
+ (WebKit::WebPlaybackSessionManager::setAudioMediaSelectionOptions): Deleted.
+ (WebKit::WebPlaybackSessionManager::setLegibleMediaSelectionOptions): Deleted.
+ (WebKit::WebPlaybackSessionManager::setExternalPlayback): Deleted.
+ (WebKit::WebPlaybackSessionManager::setWirelessVideoPlaybackDisabled): Deleted.
+ * WebProcess/cocoa/WebVideoFullscreenManager.h:
+ (WebKit::WebVideoFullscreenInterfaceContext::create):
+ * WebProcess/cocoa/WebVideoFullscreenManager.mm:
+ (WebKit::WebVideoFullscreenInterfaceContext::WebVideoFullscreenInterfaceContext):
+ (WebKit::WebVideoFullscreenInterfaceContext::hasVideoChanged):
+ (WebKit::WebVideoFullscreenInterfaceContext::videoDimensionsChanged):
+ (WebKit::WebVideoFullscreenManager::~WebVideoFullscreenManager):
+ (WebKit::WebVideoFullscreenManager::createModelAndInterface):
+ (WebKit::WebVideoFullscreenManager::removeContext):
+ (WebKit::WebVideoFullscreenManager::hasVideoChanged):
+ (WebKit::WebVideoFullscreenManager::videoDimensionsChanged):
+ (WebKit::WebVideoFullscreenInterfaceContext::resetMediaState): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setDuration): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setCurrentTime): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setBufferedTime): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setRate): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setVideoDimensions): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setSeekableRanges): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setCanPlayFastReverse): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setAudioMediaSelectionOptions): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setLegibleMediaSelectionOptions): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setExternalPlayback): Deleted.
+ (WebKit::WebVideoFullscreenInterfaceContext::setWirelessVideoPlaybackDisabled): Deleted.
+ (WebKit::WebVideoFullscreenManager::setVideoDimensions): Deleted.
+
+2016-09-09 Babak Shafiei <bshafiei@apple.com>
+
</ins><span class="cx"> Merge r205412. rdar://problem/28014919
</span><span class="cx">
</span><span class="cx"> 2016-09-03 Wenson Hsieh <wenson_hsieh@apple.com>
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -543,8 +543,6 @@
</span><span class="cx"> _page->setApplicationNameForUserAgent(applicationNameForUserAgent);
</span><span class="cx">
</span><span class="cx"> _navigationState = std::make_unique<WebKit::NavigationState>(self);
</span><del>- _page->setNavigationClient(_navigationState->createNavigationClient());
-
</del><span class="cx"> _uiDelegate = std::make_unique<WebKit::UIDelegate>(self);
</span><span class="cx"> _page->setFindClient(std::make_unique<WebKit::FindClient>(self));
</span><span class="cx"> _page->setDiagnosticLoggingClient(std::make_unique<WebKit::DiagnosticLoggingClient>(self));
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxyh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include <WebCore/WebPlaybackSessionModel.h>
</span><span class="cx"> #include <wtf/HashMap.h>
</span><span class="cx"> #include <wtf/PassRefPtr.h>
</span><ins>+#include <wtf/HashSet.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="lines">@@ -64,20 +65,21 @@
</span><span class="cx">
</span><span class="cx"> void invalidate() { m_manager = nullptr; }
</span><span class="cx">
</span><del>- void setDuration(double duration) { m_duration = duration; }
- void setCurrentTime(double currentTime) { m_currentTime = currentTime; }
- void setBufferedTime(double bufferedTime) { m_bufferedTime = bufferedTime; }
- void setIsPlaying(bool isPlaying) { m_isPlaying = isPlaying; }
- void setPlaybackRate(float playbackRate) { m_playbackRate = playbackRate; }
- void setSeekableRanges(WebCore::TimeRanges& seekableRanges) { m_seekableRanges = seekableRanges; }
- void setCanPlayFastReverse(bool canPlayFastReverse) { m_canPlayFastReverse = canPlayFastReverse; }
- void setAudioMediaSelectionOptions(const Vector<WTF::String>& audioMediaSelectionOptions) { m_audioMediaSelectionOptions = audioMediaSelectionOptions; }
- void setAudioMediaSelectedIndex(uint64_t audioMediaSelectedIndex) { m_audioMediaSelectedIndex = audioMediaSelectedIndex; }
- void setLegibleMediaSelectionOptions(const Vector<WTF::String>& legibleMediaSelectionOptions) { m_legibleMediaSelectionOptions = legibleMediaSelectionOptions; }
- void setLegibleMediaSelectedIndex(uint64_t legibleMediaSelectedIndex) { m_legibleMediaSelectedIndex = legibleMediaSelectedIndex; }
- void setExternalPlaybackEnabled(bool externalPlaybackEnabled) { m_externalPlaybackEnabled = externalPlaybackEnabled; }
- void setWirelessVideoPlaybackDisabled(bool wirelessVideoPlaybackDisabled) { m_wirelessVideoPlaybackDisabled = wirelessVideoPlaybackDisabled; }
</del><ins>+ // WebPlaybackSessionModel
+ void addClient(WebCore::WebPlaybackSessionModelClient&) final;
+ void removeClient(WebCore::WebPlaybackSessionModelClient&)final;
</ins><span class="cx">
</span><ins>+ void setDuration(double);
+ void setCurrentTime(double);
+ void setBufferedTime(double);
+ void setRate(bool isPlaying, float playbackRate);
+ void setSeekableRanges(WebCore::TimeRanges&);
+ void setCanPlayFastReverse(bool);
+ void setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t index);
+ void setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t index);
+ void setExternalPlayback(bool, WebPlaybackSessionModel::ExternalPlaybackTargetType, const String&);
+ void setWirelessVideoPlaybackDisabled(bool);
+
</ins><span class="cx"> private:
</span><span class="cx"> friend class WebVideoFullscreenModelContext;
</span><span class="cx">
</span><span class="lines">@@ -113,10 +115,13 @@
</span><span class="cx"> Vector<WTF::String> legibleMediaSelectionOptions() const final { return m_legibleMediaSelectionOptions; }
</span><span class="cx"> uint64_t legibleMediaSelectedIndex() const final { return m_legibleMediaSelectedIndex; }
</span><span class="cx"> bool externalPlaybackEnabled() const final { return m_externalPlaybackEnabled; }
</span><ins>+ WebPlaybackSessionModel::ExternalPlaybackTargetType externalPlaybackTargetType() const final { return m_externalPlaybackTargetType; }
+ String externalPlaybackLocalizedDeviceName() const final { return m_externalPlaybackLocalizedDeviceName; }
</ins><span class="cx"> bool wirelessVideoPlaybackDisabled() const final { return m_wirelessVideoPlaybackDisabled; }
</span><span class="cx">
</span><span class="cx"> WebPlaybackSessionManagerProxy* m_manager;
</span><span class="cx"> uint64_t m_contextId;
</span><ins>+ HashSet<WebCore::WebPlaybackSessionModelClient*> m_clients;
</ins><span class="cx"> double m_duration { 0 };
</span><span class="cx"> double m_currentTime { 0 };
</span><span class="cx"> double m_bufferedTime { 0 };
</span><span class="lines">@@ -129,6 +134,8 @@
</span><span class="cx"> Vector<WTF::String> m_legibleMediaSelectionOptions;
</span><span class="cx"> uint64_t m_legibleMediaSelectedIndex { 0 };
</span><span class="cx"> bool m_externalPlaybackEnabled { false };
</span><ins>+ WebPlaybackSessionModel::ExternalPlaybackTargetType m_externalPlaybackTargetType { WebPlaybackSessionModel::TargetTypeNone };
+ String m_externalPlaybackLocalizedDeviceName;
</ins><span class="cx"> bool m_wirelessVideoPlaybackDisabled { false };
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessCocoaWebPlaybackSessionManagerProxymm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebPlaybackSessionManagerProxy.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -40,6 +40,18 @@
</span><span class="cx">
</span><span class="cx"> #pragma mark - WebPlaybackSessionModelContext
</span><span class="cx">
</span><ins>+void WebPlaybackSessionModelContext::addClient(WebPlaybackSessionModelClient& client)
+{
+ ASSERT(!m_clients.contains(&client));
+ m_clients.add(&client);
+}
+
+void WebPlaybackSessionModelContext::removeClient(WebPlaybackSessionModelClient& client)
+{
+ ASSERT(m_clients.contains(&client));
+ m_clients.remove(&client);
+}
+
</ins><span class="cx"> void WebPlaybackSessionModelContext::play()
</span><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><span class="lines">@@ -112,6 +124,85 @@
</span><span class="cx"> m_manager->selectLegibleMediaOption(m_contextId, optionId);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebPlaybackSessionModelContext::setDuration(double duration)
+{
+ m_duration = duration;
+ for (auto* client : m_clients)
+ client->durationChanged(duration);
+}
+
+void WebPlaybackSessionModelContext::setCurrentTime(double currentTime)
+{
+ m_currentTime = currentTime;
+ auto anchorTime = [[NSProcessInfo processInfo] systemUptime];
+
+ for (auto* client : m_clients)
+ client->currentTimeChanged(currentTime, anchorTime);
+}
+
+void WebPlaybackSessionModelContext::setBufferedTime(double bufferedTime)
+{
+ m_bufferedTime = bufferedTime;
+ for (auto* client : m_clients)
+ client->bufferedTimeChanged(bufferedTime);
+}
+
+void WebPlaybackSessionModelContext::setRate(bool isPlaying, float playbackRate)
+{
+ m_isPlaying = isPlaying;
+ m_playbackRate = playbackRate;
+ for (auto* client : m_clients)
+ client->rateChanged(isPlaying, playbackRate);
+}
+
+void WebPlaybackSessionModelContext::setSeekableRanges(WebCore::TimeRanges& seekableRanges)
+{
+ m_seekableRanges = seekableRanges;
+ for (auto* client : m_clients)
+ client->seekableRangesChanged(seekableRanges);
+}
+
+void WebPlaybackSessionModelContext::setCanPlayFastReverse(bool canPlayFastReverse)
+{
+ m_canPlayFastReverse = canPlayFastReverse;
+ for (auto* client : m_clients)
+ client->canPlayFastReverseChanged(canPlayFastReverse);
+}
+
+void WebPlaybackSessionModelContext::setAudioMediaSelectionOptions(const Vector<WTF::String>& audioMediaSelectionOptions, uint64_t audioMediaSelectedIndex)
+{
+ m_audioMediaSelectionOptions = audioMediaSelectionOptions;
+ m_audioMediaSelectedIndex = audioMediaSelectedIndex;
+ for (auto* client : m_clients)
+ client->audioMediaSelectionOptionsChanged(audioMediaSelectionOptions, audioMediaSelectedIndex);
+}
+
+void WebPlaybackSessionModelContext::setLegibleMediaSelectionOptions(const Vector<WTF::String>& legibleMediaSelectionOptions, uint64_t legibleMediaSelectedIndex)
+{
+ m_legibleMediaSelectionOptions = legibleMediaSelectionOptions;
+ m_legibleMediaSelectedIndex = legibleMediaSelectedIndex;
+
+ for (auto* client : m_clients)
+ client->legibleMediaSelectionOptionsChanged(legibleMediaSelectionOptions, legibleMediaSelectedIndex);
+}
+
+void WebPlaybackSessionModelContext::setExternalPlayback(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType type, const String& localizedName)
+{
+ m_externalPlaybackEnabled = enabled;
+ m_externalPlaybackTargetType = type;
+ m_externalPlaybackLocalizedDeviceName = localizedName;
+
+ for (auto* client : m_clients)
+ client->externalPlaybackChanged(enabled, type, localizedName);
+}
+
+void WebPlaybackSessionModelContext::setWirelessVideoPlaybackDisabled(bool wirelessVideoPlaybackDisabled)
+{
+ m_wirelessVideoPlaybackDisabled = wirelessVideoPlaybackDisabled;
+ for (auto* client : m_clients)
+ client->wirelessVideoPlaybackDisabledChanged(wirelessVideoPlaybackDisabled);
+}
+
</ins><span class="cx"> #pragma mark - WebPlaybackSessionManagerProxy
</span><span class="cx">
</span><span class="cx"> RefPtr<WebPlaybackSessionManagerProxy> WebPlaybackSessionManagerProxy::create(WebPageProxy& page)
</span><span class="lines">@@ -152,10 +243,8 @@
</span><span class="cx"> WebPlaybackSessionManagerProxy::ModelInterfaceTuple WebPlaybackSessionManagerProxy::createModelAndInterface(uint64_t contextId)
</span><span class="cx"> {
</span><span class="cx"> Ref<WebPlaybackSessionModelContext> model = WebPlaybackSessionModelContext::create(*this, contextId);
</span><del>- Ref<PlatformWebPlaybackSessionInterface> interface = PlatformWebPlaybackSessionInterface::create();
</del><ins>+ Ref<PlatformWebPlaybackSessionInterface> interface = PlatformWebPlaybackSessionInterface::create(model);
</ins><span class="cx">
</span><del>- interface->setWebPlaybackSessionModel(&model.get());
-
</del><span class="cx"> return std::make_tuple(WTFMove(model), WTFMove(interface));
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -194,6 +283,11 @@
</span><span class="cx">
</span><span class="cx"> if (clientCount <= 0) {
</span><span class="cx"> m_clientCounts.remove(contextId);
</span><ins>+
+ RefPtr<WebPlaybackSessionModelContext> model;
+ RefPtr<PlatformWebPlaybackSessionInterface> interface;
+ std::tie(model, interface) = ensureModelAndInterface(contextId);
+ interface->invalidate();
</ins><span class="cx"> m_contextMap.remove(contextId);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="lines">@@ -241,20 +335,12 @@
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setCurrentTime(uint64_t contextId, double currentTime, double hostTime)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setCurrentTime(currentTime);
- interface->setCurrentTime(currentTime, hostTime);
</del><ins>+ ensureModel(contextId).setCurrentTime(currentTime);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setBufferedTime(uint64_t contextId, double bufferedTime)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setBufferedTime(bufferedTime);
- interface->setBufferedTime(bufferedTime);
</del><ins>+ ensureModel(contextId).setBufferedTime(bufferedTime);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setSeekableRangesVector(uint64_t contextId, Vector<std::pair<double, double>> ranges)
</span><span class="lines">@@ -267,80 +353,45 @@
</span><span class="cx"> timeRanges->add(range.first, range.second);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setSeekableRanges(timeRanges);
- interface->setSeekableRanges(timeRanges);
</del><ins>+ ensureModel(contextId).setSeekableRanges(timeRanges);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setCanPlayFastReverse(uint64_t contextId, bool value)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setCanPlayFastReverse(value);
- interface->setCanPlayFastReverse(value);
</del><ins>+ ensureModel(contextId).setCanPlayFastReverse(value);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setAudioMediaSelectionOptions(uint64_t contextId, Vector<String> options, uint64_t selectedIndex)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setAudioMediaSelectionOptions(options);
- model->setAudioMediaSelectedIndex(selectedIndex);
- interface->setAudioMediaSelectionOptions(options, selectedIndex);
</del><ins>+ ensureModel(contextId).setAudioMediaSelectionOptions(options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setLegibleMediaSelectionOptions(uint64_t contextId, Vector<String> options, uint64_t selectedIndex)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setLegibleMediaSelectionOptions(options);
- model->setLegibleMediaSelectedIndex(selectedIndex);
- interface->setLegibleMediaSelectionOptions(options, selectedIndex);
</del><ins>+ ensureModel(contextId).setLegibleMediaSelectionOptions(options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setExternalPlaybackProperties(uint64_t contextId, bool enabled, uint32_t targetType, String localizedDeviceName)
</span><span class="cx"> {
</span><del>- WebPlaybackSessionInterface::ExternalPlaybackTargetType type = static_cast<WebPlaybackSessionInterface::ExternalPlaybackTargetType>(targetType);
- ASSERT(type == WebPlaybackSessionInterface::TargetTypeAirPlay || type == WebPlaybackSessionInterface::TargetTypeTVOut || type == WebPlaybackSessionInterface::TargetTypeNone);
</del><ins>+ WebPlaybackSessionModel::ExternalPlaybackTargetType type = static_cast<WebPlaybackSessionModel::ExternalPlaybackTargetType>(targetType);
+ ASSERT(type == WebPlaybackSessionModel::TargetTypeAirPlay || type == WebPlaybackSessionModel::TargetTypeTVOut || type == WebPlaybackSessionModel::TargetTypeNone);
</ins><span class="cx">
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setExternalPlaybackEnabled(enabled);
- interface->setExternalPlayback(enabled, type, localizedDeviceName);
</del><ins>+ ensureModel(contextId).setExternalPlayback(enabled, type, localizedDeviceName);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setWirelessVideoPlaybackDisabled(uint64_t contextId, bool disabled)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setWirelessVideoPlaybackDisabled(disabled);
- interface->setWirelessVideoPlaybackDisabled(disabled);
</del><ins>+ ensureModel(contextId).setWirelessVideoPlaybackDisabled(disabled);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setDuration(uint64_t contextId, double duration)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setDuration(duration);
- interface->setDuration(duration);
</del><ins>+ ensureModel(contextId).setDuration(duration);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebPlaybackSessionManagerProxy::setRate(uint64_t contextId, bool isPlaying, double rate)
</span><span class="cx"> {
</span><del>- RefPtr<WebPlaybackSessionModelContext> model;
- RefPtr<PlatformWebPlaybackSessionInterface> interface;
- std::tie(model, interface) = ensureModelAndInterface(contextId);
- model->setIsPlaying(isPlaying);
- model->setPlaybackRate(rate);
- interface->setRate(isPlaying, rate);
</del><ins>+ ensureModel(contextId).setRate(isPlaying, rate);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx">
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxyh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include <WebCore/WebVideoFullscreenModel.h>
</span><span class="cx"> #include <wtf/HashMap.h>
</span><span class="cx"> #include <wtf/PassRefPtr.h>
</span><ins>+#include <wtf/HashSet.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="lines">@@ -57,7 +58,10 @@
</span><span class="cx"> class WebPlaybackSessionModelContext;
</span><span class="cx"> class WebVideoFullscreenManagerProxy;
</span><span class="cx">
</span><del>-class WebVideoFullscreenModelContext final: public RefCounted<WebVideoFullscreenModelContext>, public WebCore::WebVideoFullscreenModel, public WebCore::WebVideoFullscreenChangeObserver {
</del><ins>+class WebVideoFullscreenModelContext final
+ : public RefCounted<WebVideoFullscreenModelContext>
+ , public WebCore::WebVideoFullscreenModel
+ , public WebCore::WebVideoFullscreenChangeObserver {
</ins><span class="cx"> public:
</span><span class="cx"> static Ref<WebVideoFullscreenModelContext> create(WebVideoFullscreenManagerProxy& manager, WebPlaybackSessionModelContext& playbackSessionModel, uint64_t contextId)
</span><span class="cx"> {
</span><span class="lines">@@ -74,11 +78,15 @@
</span><span class="cx"> WebVideoFullscreenModelContext(WebVideoFullscreenManagerProxy&, WebPlaybackSessionModelContext&, uint64_t);
</span><span class="cx">
</span><span class="cx"> // WebVideoFullscreenModel
</span><ins>+ void addClient(WebCore::WebVideoFullscreenModelClient&) override;
+ void removeClient(WebCore::WebVideoFullscreenModelClient&) override;
</ins><span class="cx"> void requestFullscreenMode(WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx"> void setVideoLayerFrame(WebCore::FloatRect) override;
</span><span class="cx"> void setVideoLayerGravity(VideoGravity) override;
</span><span class="cx"> void fullscreenModeChanged(WebCore::HTMLMediaElementEnums::VideoFullscreenMode) override;
</span><span class="cx"> bool isVisible() const override;
</span><ins>+ bool hasVideo() const override { return m_hasVideo; }
+ WebCore::FloatSize videoDimensions() const override { return m_videoDimensions; }
</ins><span class="cx">
</span><span class="cx"> // WebVideoFullscreenChangeObserver
</span><span class="cx"> void didSetupFullscreen() override;
</span><span class="lines">@@ -91,6 +99,9 @@
</span><span class="cx"> Ref<WebPlaybackSessionModelContext> m_playbackSessionModel;
</span><span class="cx"> uint64_t m_contextId;
</span><span class="cx"> RetainPtr<PlatformView *> m_layerHostView;
</span><ins>+ HashSet<WebCore::WebVideoFullscreenModelClient*> m_clients;
+ WebCore::FloatSize m_videoDimensions;
+ bool m_hasVideo { false };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> class WebVideoFullscreenManagerProxy : public RefCounted<WebVideoFullscreenManagerProxy>, private IPC::MessageReceiver {
</span><span class="lines">@@ -126,7 +137,8 @@
</span><span class="cx">
</span><span class="cx"> // Messages from WebVideoFullscreenManager
</span><span class="cx"> void setupFullscreenWithID(uint64_t contextId, uint32_t videoLayerID, const WebCore::IntRect& initialRect, float hostingScaleFactor, WebCore::HTMLMediaElementEnums::VideoFullscreenMode, bool allowsPictureInPicture);
</span><del>- void setVideoDimensions(uint64_t contextId, bool hasVideo, unsigned width, unsigned height);
</del><ins>+ void setHasVideo(uint64_t contextId, bool);
+ void setVideoDimensions(uint64_t contextId, const WebCore::FloatSize&);
</ins><span class="cx"> void enterFullscreen(uint64_t contextId);
</span><span class="cx"> void exitFullscreen(uint64_t contextId, WebCore::IntRect finalRect);
</span><span class="cx"> void cleanupFullscreen(uint64_t contextId);
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxymessagesin"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.messages.in (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.messages.in        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.messages.in        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -22,7 +22,8 @@
</span><span class="cx">
</span><span class="cx"> #if (PLATFORM(IOS) && HAVE(AVKIT)) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
</span><span class="cx"> messages -> WebVideoFullscreenManagerProxy {
</span><del>- SetVideoDimensions(uint64_t contextId, bool hasVideo, unsigned width, unsigned height)
</del><ins>+ SetHasVideo(uint64_t contextId, bool hasVideo)
+ SetVideoDimensions(uint64_t contextId, WebCore::FloatSize videoDimensions)
</ins><span class="cx"> SetupFullscreenWithID(uint64_t contextId, uint32_t videoLayerID, WebCore::IntRect initialRect, float hostingScaleFactor, WebCore::HTMLMediaElementEnums::VideoFullscreenMode videoFullscreenMode, bool allowsPictureInPicture)
</span><span class="cx"> EnterFullscreen(uint64_t contextId)
</span><span class="cx"> ExitFullscreen(uint64_t contextId, WebCore::IntRect finalRect)
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessCocoaWebVideoFullscreenManagerProxymm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -124,6 +124,18 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebVideoFullscreenModelContext::addClient(WebVideoFullscreenModelClient& client)
+{
+ ASSERT(!m_clients.contains(&client));
+ m_clients.add(&client);
+}
+
+void WebVideoFullscreenModelContext::removeClient(WebVideoFullscreenModelClient& client)
+{
+ ASSERT(m_clients.contains(&client));
+ m_clients.remove(&client);
+}
+
</ins><span class="cx"> void WebVideoFullscreenModelContext::requestFullscreenMode(HTMLMediaElementEnums::VideoFullscreenMode mode)
</span><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><span class="lines">@@ -358,11 +370,16 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenManagerProxy::setVideoDimensions(uint64_t contextId, bool hasVideo, unsigned width, unsigned height)
</del><ins>+void WebVideoFullscreenManagerProxy::setHasVideo(uint64_t contextId, bool hasVideo)
</ins><span class="cx"> {
</span><del>- ensureInterface(contextId).setVideoDimensions(hasVideo, width, height);
</del><ins>+ ensureInterface(contextId).hasVideoChanged(hasVideo);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebVideoFullscreenManagerProxy::setVideoDimensions(uint64_t contextId, const FloatSize& videoDimensions)
+{
+ ensureInterface(contextId).videoDimensionsChanged(videoDimensions);
+}
+
</ins><span class="cx"> void WebVideoFullscreenManagerProxy::enterFullscreen(uint64_t contextId)
</span><span class="cx"> {
</span><span class="cx"> auto& interface = ensureInterface(contextId);
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2WebProcesscocoaWebPlaybackSessionManagerh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -54,7 +54,10 @@
</span><span class="cx"> class WebPage;
</span><span class="cx"> class WebPlaybackSessionManager;
</span><span class="cx">
</span><del>-class WebPlaybackSessionInterfaceContext final : public RefCounted<WebPlaybackSessionInterfaceContext>, public WebCore::WebPlaybackSessionInterface {
</del><ins>+class WebPlaybackSessionInterfaceContext final
+ : public RefCounted<WebPlaybackSessionInterfaceContext>
+ , public WebCore::WebPlaybackSessionInterface
+ , public WebCore::WebPlaybackSessionModelClient {
</ins><span class="cx"> public:
</span><span class="cx"> static Ref<WebPlaybackSessionInterfaceContext> create(WebPlaybackSessionManager& manager, uint64_t contextId)
</span><span class="cx"> {
</span><span class="lines">@@ -69,17 +72,19 @@
</span><span class="cx">
</span><span class="cx"> // WebPlaybackSessionInterface
</span><span class="cx"> void resetMediaState() final;
</span><del>- void setDuration(double) final;
- void setCurrentTime(double currentTime, double anchorTime) final;
- void setBufferedTime(double) final;
- void setRate(bool isPlaying, float playbackRate) final;
- void setSeekableRanges(const WebCore::TimeRanges&) final;
- void setCanPlayFastReverse(bool value) final;
- void setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) final;
- void setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) final;
- void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) final;
- void setWirelessVideoPlaybackDisabled(bool) final;
</del><span class="cx">
</span><ins>+ // WebPlaybackModelClient
+ void durationChanged(double) final;
+ void currentTimeChanged(double currentTime, double anchorTime) final;
+ void bufferedTimeChanged(double) final;
+ void rateChanged(bool isPlaying, float playbackRate) final;
+ void seekableRangesChanged(const WebCore::TimeRanges&) final;
+ void canPlayFastReverseChanged(bool value) final;
+ void audioMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex) final;
+ void legibleMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex) final;
+ void externalPlaybackChanged(bool enabled, WebCore::WebPlaybackSessionModel::ExternalPlaybackTargetType, const String& localizedDeviceName) final;
+ void wirelessVideoPlaybackDisabledChanged(bool) final;
+
</ins><span class="cx"> WebPlaybackSessionInterfaceContext(WebPlaybackSessionManager&, uint64_t contextId);
</span><span class="cx">
</span><span class="cx"> WebPlaybackSessionManager* m_manager;
</span><span class="lines">@@ -114,16 +119,16 @@
</span><span class="cx">
</span><span class="cx"> // Interface to WebPlaybackSessionInterfaceContext
</span><span class="cx"> void resetMediaState(uint64_t contextId);
</span><del>- void setDuration(uint64_t contextId, double);
- void setCurrentTime(uint64_t contextId, double currentTime, double anchorTime);
- void setBufferedTime(uint64_t contextId, double bufferedTime);
- void setRate(uint64_t contextId, bool isPlaying, float playbackRate);
- void setSeekableRanges(uint64_t contextId, const WebCore::TimeRanges&);
- void setCanPlayFastReverse(uint64_t contextId, bool value);
- void setAudioMediaSelectionOptions(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex);
- void setLegibleMediaSelectionOptions(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex);
- void setExternalPlayback(uint64_t contextId, bool enabled, WebCore::WebPlaybackSessionInterface::ExternalPlaybackTargetType, String localizedDeviceName);
- void setWirelessVideoPlaybackDisabled(uint64_t contextId, bool);
</del><ins>+ void durationChanged(uint64_t contextId, double);
+ void currentTimeChanged(uint64_t contextId, double currentTime, double anchorTime);
+ void bufferedTimeChanged(uint64_t contextId, double bufferedTime);
+ void rateChanged(uint64_t contextId, bool isPlaying, float playbackRate);
+ void seekableRangesChanged(uint64_t contextId, const WebCore::TimeRanges&);
+ void canPlayFastReverseChanged(uint64_t contextId, bool value);
+ void audioMediaSelectionOptionsChanged(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex);
+ void legibleMediaSelectionOptionsChanged(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex);
+ void externalPlaybackChanged(uint64_t contextId, bool enabled, WebCore::WebPlaybackSessionModel::ExternalPlaybackTargetType, String localizedDeviceName);
+ void wirelessVideoPlaybackDisabledChanged(uint64_t contextId, bool);
</ins><span class="cx">
</span><span class="cx"> // Messages from WebPlaybackSessionManagerProxy
</span><span class="cx"> void play(uint64_t contextId);
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2WebProcesscocoaWebPlaybackSessionManagermm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebPlaybackSessionManager.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -72,64 +72,64 @@
</span><span class="cx"> m_manager->resetMediaState(m_contextId);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setDuration(double duration)
</del><ins>+void WebPlaybackSessionInterfaceContext::durationChanged(double duration)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setDuration(m_contextId, duration);
</del><ins>+ m_manager->durationChanged(m_contextId, duration);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setCurrentTime(double currentTime, double anchorTime)
</del><ins>+void WebPlaybackSessionInterfaceContext::currentTimeChanged(double currentTime, double anchorTime)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setCurrentTime(m_contextId, currentTime, anchorTime);
</del><ins>+ m_manager->currentTimeChanged(m_contextId, currentTime, anchorTime);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setBufferedTime(double bufferedTime)
</del><ins>+void WebPlaybackSessionInterfaceContext::bufferedTimeChanged(double bufferedTime)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setBufferedTime(m_contextId, bufferedTime);
</del><ins>+ m_manager->bufferedTimeChanged(m_contextId, bufferedTime);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setRate(bool isPlaying, float playbackRate)
</del><ins>+void WebPlaybackSessionInterfaceContext::rateChanged(bool isPlaying, float playbackRate)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setRate(m_contextId, isPlaying, playbackRate);
</del><ins>+ m_manager->rateChanged(m_contextId, isPlaying, playbackRate);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setSeekableRanges(const WebCore::TimeRanges& ranges)
</del><ins>+void WebPlaybackSessionInterfaceContext::seekableRangesChanged(const WebCore::TimeRanges& ranges)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setSeekableRanges(m_contextId, ranges);
</del><ins>+ m_manager->seekableRangesChanged(m_contextId, ranges);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setCanPlayFastReverse(bool value)
</del><ins>+void WebPlaybackSessionInterfaceContext::canPlayFastReverseChanged(bool value)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setCanPlayFastReverse(m_contextId, value);
</del><ins>+ m_manager->canPlayFastReverseChanged(m_contextId, value);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionInterfaceContext::audioMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setAudioMediaSelectionOptions(m_contextId, options, selectedIndex);
</del><ins>+ m_manager->audioMediaSelectionOptionsChanged(m_contextId, options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionInterfaceContext::legibleMediaSelectionOptionsChanged(const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setLegibleMediaSelectionOptions(m_contextId, options, selectedIndex);
</del><ins>+ m_manager->legibleMediaSelectionOptionsChanged(m_contextId, options, selectedIndex);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setExternalPlayback(bool enabled, ExternalPlaybackTargetType type, WTF::String localizedDeviceName)
</del><ins>+void WebPlaybackSessionInterfaceContext::externalPlaybackChanged(bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType type, const String& localizedDeviceName)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setExternalPlayback(m_contextId, enabled, type, localizedDeviceName);
</del><ins>+ m_manager->externalPlaybackChanged(m_contextId, enabled, type, localizedDeviceName);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionInterfaceContext::setWirelessVideoPlaybackDisabled(bool disabled)
</del><ins>+void WebPlaybackSessionInterfaceContext::wirelessVideoPlaybackDisabledChanged(bool disabled)
</ins><span class="cx"> {
</span><span class="cx"> if (m_manager)
</span><del>- m_manager->setWirelessVideoPlaybackDisabled(m_contextId, disabled);
</del><ins>+ m_manager->wirelessVideoPlaybackDisabledChanged(m_contextId, disabled);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #pragma mark - WebPlaybackSessionManager
</span><span class="lines">@@ -151,8 +151,7 @@
</span><span class="cx"> RefPtr<WebPlaybackSessionModelMediaElement> model;
</span><span class="cx"> RefPtr<WebPlaybackSessionInterfaceContext> interface;
</span><span class="cx"> std::tie(model, interface) = tuple;
</span><del>-
- model->setWebPlaybackSessionInterface(nullptr);
</del><ins>+ model->removeClient(*interface);
</ins><span class="cx"> model->setMediaElement(nullptr);
</span><span class="cx">
</span><span class="cx"> interface->invalidate();
</span><span class="lines">@@ -169,9 +168,8 @@
</span><span class="cx"> {
</span><span class="cx"> RefPtr<WebPlaybackSessionModelMediaElement> model = WebPlaybackSessionModelMediaElement::create();
</span><span class="cx"> RefPtr<WebPlaybackSessionInterfaceContext> interface = WebPlaybackSessionInterfaceContext::create(*this, contextId);
</span><ins>+ model->addClient(*interface);
</ins><span class="cx">
</span><del>- model->setWebPlaybackSessionInterface(interface.get());
-
</del><span class="cx"> return std::make_tuple(WTFMove(model), WTFMove(interface));
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -201,7 +199,7 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<HTMLMediaElement> mediaElement = model->mediaElement();
</span><span class="cx"> model->setMediaElement(nullptr);
</span><del>- model->setWebPlaybackSessionInterface(nullptr);
</del><ins>+ model->removeClient(*interface);
</ins><span class="cx"> interface->invalidate();
</span><span class="cx"> m_mediaElements.remove(mediaElement.get());
</span><span class="cx"> m_contextMap.remove(contextId);
</span><span class="lines">@@ -284,27 +282,27 @@
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::ResetMediaState(contextId), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setDuration(uint64_t contextId, double duration)
</del><ins>+void WebPlaybackSessionManager::durationChanged(uint64_t contextId, double duration)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetDuration(contextId, duration), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setCurrentTime(uint64_t contextId, double currentTime, double anchorTime)
</del><ins>+void WebPlaybackSessionManager::currentTimeChanged(uint64_t contextId, double currentTime, double anchorTime)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetCurrentTime(contextId, currentTime, anchorTime), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setBufferedTime(uint64_t contextId, double bufferedTime)
</del><ins>+void WebPlaybackSessionManager::bufferedTimeChanged(uint64_t contextId, double bufferedTime)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetBufferedTime(contextId, bufferedTime), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setRate(uint64_t contextId, bool isPlaying, float playbackRate)
</del><ins>+void WebPlaybackSessionManager::rateChanged(uint64_t contextId, bool isPlaying, float playbackRate)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetRate(contextId, isPlaying, playbackRate), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setSeekableRanges(uint64_t contextId, const WebCore::TimeRanges& timeRanges)
</del><ins>+void WebPlaybackSessionManager::seekableRangesChanged(uint64_t contextId, const WebCore::TimeRanges& timeRanges)
</ins><span class="cx"> {
</span><span class="cx"> Vector<std::pair<double, double>> rangesVector;
</span><span class="cx">
</span><span class="lines">@@ -318,27 +316,27 @@
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetSeekableRangesVector(contextId, WTFMove(rangesVector)), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setCanPlayFastReverse(uint64_t contextId, bool value)
</del><ins>+void WebPlaybackSessionManager::canPlayFastReverseChanged(uint64_t contextId, bool value)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetCanPlayFastReverse(contextId, value), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setAudioMediaSelectionOptions(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionManager::audioMediaSelectionOptionsChanged(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetAudioMediaSelectionOptions(contextId, options, selectedIndex), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setLegibleMediaSelectionOptions(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex)
</del><ins>+void WebPlaybackSessionManager::legibleMediaSelectionOptionsChanged(uint64_t contextId, const Vector<String>& options, uint64_t selectedIndex)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetLegibleMediaSelectionOptions(contextId, options, selectedIndex), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setExternalPlayback(uint64_t contextId, bool enabled, WebPlaybackSessionInterface::ExternalPlaybackTargetType targetType, String localizedDeviceName)
</del><ins>+void WebPlaybackSessionManager::externalPlaybackChanged(uint64_t contextId, bool enabled, WebPlaybackSessionModel::ExternalPlaybackTargetType targetType, String localizedDeviceName)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetExternalPlaybackProperties(contextId, enabled, static_cast<uint32_t>(targetType), localizedDeviceName), m_page->pageID());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebPlaybackSessionManager::setWirelessVideoPlaybackDisabled(uint64_t contextId, bool disabled)
</del><ins>+void WebPlaybackSessionManager::wirelessVideoPlaybackDisabledChanged(uint64_t contextId, bool disabled)
</ins><span class="cx"> {
</span><span class="cx"> m_page->send(Messages::WebPlaybackSessionManagerProxy::SetWirelessVideoPlaybackDisabled(contextId, disabled));
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2WebProcesscocoaWebVideoFullscreenManagerh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.h (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.h        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.h        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><ins>+class FloatSize;
</ins><span class="cx"> class Node;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -56,11 +57,14 @@
</span><span class="cx"> class WebPlaybackSessionManager;
</span><span class="cx"> class WebVideoFullscreenManager;
</span><span class="cx">
</span><del>-class WebVideoFullscreenInterfaceContext : public RefCounted<WebVideoFullscreenInterfaceContext>, public WebCore::WebVideoFullscreenInterface {
</del><ins>+class WebVideoFullscreenInterfaceContext
+ : public RefCounted<WebVideoFullscreenInterfaceContext>
+ , public WebCore::WebVideoFullscreenInterface
+ , public WebCore::WebVideoFullscreenModelClient {
</ins><span class="cx"> public:
</span><del>- static Ref<WebVideoFullscreenInterfaceContext> create(WebVideoFullscreenManager& manager, WebPlaybackSessionInterfaceContext& playbackSessionInterface, uint64_t contextId)
</del><ins>+ static Ref<WebVideoFullscreenInterfaceContext> create(WebVideoFullscreenManager& manager, uint64_t contextId)
</ins><span class="cx"> {
</span><del>- return adoptRef(*new WebVideoFullscreenInterfaceContext(manager, playbackSessionInterface, contextId));
</del><ins>+ return adoptRef(*new WebVideoFullscreenInterfaceContext(manager, contextId));
</ins><span class="cx"> }
</span><span class="cx"> virtual ~WebVideoFullscreenInterfaceContext();
</span><span class="cx">
</span><span class="lines">@@ -82,26 +86,13 @@
</span><span class="cx"> void setIsFullscreen(bool flag) { m_isFullscreen = flag; }
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- // WebPlaybackSessionInterface
- void resetMediaState() override;
- void setDuration(double) override;
- void setCurrentTime(double currentTime, double anchorTime) override;
- void setBufferedTime(double) override;
- void setRate(bool isPlaying, float playbackRate) override;
- void setSeekableRanges(const WebCore::TimeRanges&) override;
- void setCanPlayFastReverse(bool value) override;
- void setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) override;
- void setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex) override;
- void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) override;
- void setWirelessVideoPlaybackDisabled(bool) override;
</del><ins>+ // WebVideoFullscreenModelClient
+ void hasVideoChanged(bool) override;
+ void videoDimensionsChanged(const WebCore::FloatSize&) override;
</ins><span class="cx">
</span><del>- // WebVideoFullscreenInterface
- void setVideoDimensions(bool hasVideo, float width, float height) override;
</del><ins>+ WebVideoFullscreenInterfaceContext(WebVideoFullscreenManager&, uint64_t contextId);
</ins><span class="cx">
</span><del>- WebVideoFullscreenInterfaceContext(WebVideoFullscreenManager&, WebPlaybackSessionInterfaceContext&, uint64_t contextId);
-
</del><span class="cx"> WebVideoFullscreenManager* m_manager;
</span><del>- Ref<WebPlaybackSessionInterfaceContext> m_playbackSessionInterface;
</del><span class="cx"> uint64_t m_contextId;
</span><span class="cx"> std::unique_ptr<LayerHostingContext> m_layerHostingContext;
</span><span class="cx"> bool m_isAnimating { false };
</span><span class="lines">@@ -138,7 +129,8 @@
</span><span class="cx"> void removeClientForContext(uint64_t contextId);
</span><span class="cx">
</span><span class="cx"> // Interface to WebVideoFullscreenInterfaceContext
</span><del>- void setVideoDimensions(uint64_t contextId, bool hasVideo, float width, float height);
</del><ins>+ void hasVideoChanged(uint64_t contextId, bool hasVideo);
+ void videoDimensionsChanged(uint64_t contextId, const WebCore::FloatSize&);
</ins><span class="cx">
</span><span class="cx"> // Messages from WebVideoFullscreenManagerProxy
</span><span class="cx"> void requestFullscreenMode(uint64_t contextId, WebCore::HTMLMediaElementEnums::VideoFullscreenMode);
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2WebProcesscocoaWebVideoFullscreenManagermm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.mm (205708 => 205709)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.mm        2016-09-09 08:42:03 UTC (rev 205708)
+++ branches/safari-602-branch/Source/WebKit2/WebProcess/cocoa/WebVideoFullscreenManager.mm        2016-09-09 08:42:16 UTC (rev 205709)
</span><span class="lines">@@ -66,9 +66,8 @@
</span><span class="cx">
</span><span class="cx"> #pragma mark - WebVideoFullscreenInterfaceContext
</span><span class="cx">
</span><del>-WebVideoFullscreenInterfaceContext::WebVideoFullscreenInterfaceContext(WebVideoFullscreenManager& manager, WebPlaybackSessionInterfaceContext& playbackSessionInterface, uint64_t contextId)
</del><ins>+WebVideoFullscreenInterfaceContext::WebVideoFullscreenInterfaceContext(WebVideoFullscreenManager& manager, uint64_t contextId)
</ins><span class="cx"> : m_manager(&manager)
</span><del>- , m_playbackSessionInterface(playbackSessionInterface)
</del><span class="cx"> , m_contextId(contextId)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -82,67 +81,18 @@
</span><span class="cx"> m_layerHostingContext = WTFMove(context);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceContext::resetMediaState()
</del><ins>+void WebVideoFullscreenInterfaceContext::hasVideoChanged(bool hasVideo)
</ins><span class="cx"> {
</span><del>- m_playbackSessionInterface->resetMediaState();
</del><ins>+ if (m_manager)
+ m_manager->hasVideoChanged(m_contextId, hasVideo);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceContext::setDuration(double duration)
</del><ins>+void WebVideoFullscreenInterfaceContext::videoDimensionsChanged(const FloatSize& videoDimensions)
</ins><span class="cx"> {
</span><del>- m_playbackSessionInterface->setDuration(duration);
-}
-
-void WebVideoFullscreenInterfaceContext::setCurrentTime(double currentTime, double anchorTime)
-{
- m_playbackSessionInterface->setCurrentTime(currentTime, anchorTime);
-}
-
-void WebVideoFullscreenInterfaceContext::setBufferedTime(double bufferedTime)
-{
- m_playbackSessionInterface->setBufferedTime(bufferedTime);
-}
-
-void WebVideoFullscreenInterfaceContext::setRate(bool isPlaying, float playbackRate)
-{
- m_playbackSessionInterface->setRate(isPlaying, playbackRate);
-}
-
-void WebVideoFullscreenInterfaceContext::setVideoDimensions(bool hasVideo, float width, float height)
-{
</del><span class="cx"> if (m_manager)
</span><del>- m_manager->setVideoDimensions(m_contextId, hasVideo, width, height);
</del><ins>+ m_manager->videoDimensionsChanged(m_contextId, videoDimensions);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void WebVideoFullscreenInterfaceContext::setSeekableRanges(const WebCore::TimeRanges& ranges)
-{
- m_playbackSessionInterface->setSeekableRanges(ranges);
-}
-
-void WebVideoFullscreenInterfaceContext::setCanPlayFastReverse(bool value)
-{
- m_playbackSessionInterface->setCanPlayFastReverse(value);
-}
-
-void WebVideoFullscreenInterfaceContext::setAudioMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
-{
- m_playbackSessionInterface->setAudioMediaSelectionOptions(options, selectedIndex);
-}
-
-void WebVideoFullscreenInterfaceContext::setLegibleMediaSelectionOptions(const Vector<WTF::String>& options, uint64_t selectedIndex)
-{
- m_playbackSessionInterface->setLegibleMediaSelectionOptions(options, selectedIndex);
-}
-
-void WebVideoFullscreenInterfaceContext::setExternalPlayback(bool enabled, ExternalPlaybackTargetType type, WTF::String localizedDeviceName)
-{
- m_playbackSessionInterface->setExternalPlayback(enabled, type, localizedDeviceName);
-}
-
-void WebVideoFullscreenInterfaceContext::setWirelessVideoPlaybackDisabled(bool disabled)
-{
- m_playbackSessionInterface->setWirelessVideoPlaybackDisabled(disabled);
-}
-
</del><span class="cx"> #pragma mark - WebVideoFullscreenManager
</span><span class="cx">
</span><span class="cx"> Ref<WebVideoFullscreenManager> WebVideoFullscreenManager::create(WebPage& page, WebPlaybackSessionManager& playbackSessionManager)
</span><span class="lines">@@ -164,8 +114,8 @@
</span><span class="cx"> RefPtr<WebVideoFullscreenInterfaceContext> interface;
</span><span class="cx"> std::tie(model, interface) = tuple;
</span><span class="cx">
</span><del>- model->setWebVideoFullscreenInterface(nullptr);
</del><span class="cx"> model->setVideoElement(nullptr);
</span><ins>+ model->removeClient(*interface);
</ins><span class="cx">
</span><span class="cx"> interface->invalidate();
</span><span class="cx"> }
</span><span class="lines">@@ -179,14 +129,12 @@
</span><span class="cx">
</span><span class="cx"> WebVideoFullscreenManager::ModelInterfaceTuple WebVideoFullscreenManager::createModelAndInterface(uint64_t contextId)
</span><span class="cx"> {
</span><del>- auto& playbackSessionModel = m_playbackSessionManager->ensureModel(contextId);
- RefPtr<WebVideoFullscreenModelVideoElement> model = WebVideoFullscreenModelVideoElement::create(playbackSessionModel);
- auto& playbackSessionInterface = m_playbackSessionManager->ensureInterface(contextId);
- RefPtr<WebVideoFullscreenInterfaceContext> interface = WebVideoFullscreenInterfaceContext::create(*this, playbackSessionInterface, contextId);
</del><ins>+ RefPtr<WebVideoFullscreenModelVideoElement> model = WebVideoFullscreenModelVideoElement::create();
+ RefPtr<WebVideoFullscreenInterfaceContext> interface = WebVideoFullscreenInterfaceContext::create(*this, contextId);
</ins><span class="cx"> m_playbackSessionManager->addClientForContext(contextId);
</span><span class="cx">
</span><span class="cx"> interface->setLayerHostingContext(LayerHostingContext::createForExternalHostingProcess());
</span><del>- model->setWebVideoFullscreenInterface(interface.get());
</del><ins>+ model->addClient(*interface);
</ins><span class="cx">
</span><span class="cx"> return std::make_tuple(WTFMove(model), WTFMove(interface));
</span><span class="cx"> }
</span><span class="lines">@@ -219,7 +167,7 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<HTMLVideoElement> videoElement = model->videoElement();
</span><span class="cx"> model->setVideoElement(nullptr);
</span><del>- model->setWebVideoFullscreenInterface(nullptr);
</del><ins>+ model->removeClient(*interface);
</ins><span class="cx"> interface->invalidate();
</span><span class="cx"> m_videoElements.remove(videoElement.get());
</span><span class="cx"> m_contextMap.remove(contextId);
</span><span class="lines">@@ -331,11 +279,16 @@
</span><span class="cx">
</span><span class="cx"> #pragma mark Interface to WebVideoFullscreenInterfaceContext:
</span><span class="cx">
</span><del>-void WebVideoFullscreenManager::setVideoDimensions(uint64_t contextId, bool hasVideo, float width, float height)
</del><ins>+void WebVideoFullscreenManager::hasVideoChanged(uint64_t contextId, bool hasVideo)
</ins><span class="cx"> {
</span><del>- m_page->send(Messages::WebVideoFullscreenManagerProxy::SetVideoDimensions(contextId, hasVideo, width, height), m_page->pageID());
</del><ins>+ m_page->send(Messages::WebVideoFullscreenManagerProxy::SetHasVideo(contextId, hasVideo), m_page->pageID());
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebVideoFullscreenManager::videoDimensionsChanged(uint64_t contextId, const FloatSize& videoDimensions)
+{
+ m_page->send(Messages::WebVideoFullscreenManagerProxy::SetVideoDimensions(contextId, videoDimensions), m_page->pageID());
+}
+
</ins><span class="cx"> #pragma mark Messages from WebVideoFullscreenManagerProxy:
</span><span class="cx">
</span><span class="cx"> void WebVideoFullscreenManager::requestFullscreenMode(uint64_t contextId, WebCore::HTMLMediaElementEnums::VideoFullscreenMode mode)
</span></span></pre>
</div>
</div>
</body>
</html>