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

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

<h3>Log Message</h3>
<pre>Add optimized fullscreen mode.
https://bugs.webkit.org/show_bug.cgi?id=138044

Patch by Jeremy Jones &lt;jeremyj@apple.com&gt; on 2014-10-28
Source/WebCore:

Reviewed by Jer Noble.

Enable different types of fullscreen video behavior.
Add an enum parameter to enterVideoFullscreenForVideoElement for alternate types of fullscreen.
Add gesture for alternate fullscreen.

* Modules/mediacontrols/MediaControlsHost.cpp:
(WebCore::MediaControlsHost::enterFullscreenOptimized): added
* Modules/mediacontrols/MediaControlsHost.h: added enterFullscreenOptimized
* Modules/mediacontrols/MediaControlsHost.idl: added enterFullscreenOptimized
* Modules/mediacontrols/mediaControlsiOS.js:
(ControllerIOS.prototype.handleBaseGestureChange): recognize alternate gesture
* WebCore.exp.in: added parameter to setupFullscreen
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::removedFrom) : replace m_isInVideoFullscreen with m_videoFullscreenType
(WebCore::HTMLMediaElement::stop) : ditto
(WebCore::HTMLMediaElement::isFullscreen) : ditto
(WebCore::HTMLMediaElement::enterFullscreen): add parameter to enterVideoFullscreenForVideoElement
(WebCore::HTMLMediaElement::exitFullscreen): replace m_isInVideoFullscreen with m_videoFullscreenType
(WebCore::HTMLMediaElement::enterFullscreenOptimized): added
* html/HTMLMediaElement.h: added enterFullscreenOptimized
* page/ChromeClient.h:
(WebCore::ChromeClient::enterVideoFullscreenForVideoElement): added parameter
* platform/ios/WebVideoFullscreenControllerAVKit.h: add parameter
* platform/ios/WebVideoFullscreenControllerAVKit.mm:
(-[WebVideoFullscreenController enterFullscreen:type:]): add parameter
(-[WebVideoFullscreenController enterFullscreen:]): Deleted.
* platform/ios/WebVideoFullscreenInterfaceAVKit.h: reorder protected to after public
* platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
(-[WebAVPlayerController player]): this stub is now required
(-[WebAVPlayerController layoutSublayersOfLayer:]): this is a better way to update video frames
(WebVideoFullscreenInterfaceAVKit::setupFullscreen): implement optimized fullscreen interface
(WebVideoFullscreenInterfaceAVKit::enterFullscreen): ditto
(WebVideoFullscreenInterfaceAVKit::exitFullscreen): ditto
(WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen): ditto

Source/WebKit/mac:

Reviewed by Jer Noble.

Enable different types of fullscreen video behavior.
Add an enum parameter to enterVideoFullscreenForVideoElement for alternate types of fullscreen.

* WebCoreSupport/WebChromeClient.h: Add fullscreenType parameter
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::enterVideoFullscreenForVideoElement): ditto
* WebView/WebView.mm:
(-[WebView _enterVideoFullscreenForVideoElement:type:]): ditto
(-[WebView _enterVideoFullscreenForVideoElement:]): Deleted.
* WebView/WebViewInternal.h: ditto

Source/WebKit2:

Reviewed by Anders Carlsson.

Enable different types of fullscreen video behavior.
Add an enum parameter to enterVideoFullscreenForVideoElement for alternate types of fullscreen.

* UIProcess/ios/WebVideoFullscreenManagerProxy.h: Add fullscreenType parameter
* UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in: ditto
* UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
(WebKit::WebVideoFullscreenManagerProxy::setupFullscreenWithID): ditto
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::enterVideoFullscreenForVideoElement): ditto
* WebProcess/WebCoreSupport/WebChromeClient.h: ditto
* WebProcess/ios/WebVideoFullscreenManager.h: ditto
* WebProcess/ios/WebVideoFullscreenManager.mm:
(WebKit::WebVideoFullscreenManager::enterVideoFullscreenForVideoElement): ditto
(WebKit::WebVideoFullscreenManager::didCleanupFullscreen): ditto</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesmediacontrolsMediaControlsHostcpp">trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediacontrolsMediaControlsHosth">trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediacontrolsMediaControlsHostidl">trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.idl</a></li>
<li><a href="#trunkSourceWebCoreModulesmediacontrolsmediaControlsiOSjs">trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorepageChromeClienth">trunk/Source/WebCore/page/ChromeClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenControllerAVKith">trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenControllerAVKitmm">trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKith">trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h</a></li>
<li><a href="#trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKitmm">trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebChromeClienth">trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebChromeClientmm">trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebViewmm">trunk/Source/WebKit/mac/WebView/WebView.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebViewInternalh">trunk/Source/WebKit/mac/WebView/WebViewInternal.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWebVideoFullscreenManagerProxyh">trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWebVideoFullscreenManagerProxymessagesin">trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWebVideoFullscreenManagerProxymm">trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClienth">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessiosWebVideoFullscreenManagerh">trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessiosWebVideoFullscreenManagermm">trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/ChangeLog        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -1,3 +1,44 @@
</span><ins>+2014-10-28  Jeremy Jones  &lt;jeremyj@apple.com&gt;
+
+        Add optimized fullscreen mode.
+        https://bugs.webkit.org/show_bug.cgi?id=138044
+
+        Reviewed by Jer Noble.
+
+        Enable different types of fullscreen video behavior.
+        Add an enum parameter to enterVideoFullscreenForVideoElement for alternate types of fullscreen.
+        Add gesture for alternate fullscreen.
+
+        * Modules/mediacontrols/MediaControlsHost.cpp:
+        (WebCore::MediaControlsHost::enterFullscreenOptimized): added
+        * Modules/mediacontrols/MediaControlsHost.h: added enterFullscreenOptimized
+        * Modules/mediacontrols/MediaControlsHost.idl: added enterFullscreenOptimized
+        * Modules/mediacontrols/mediaControlsiOS.js:
+        (ControllerIOS.prototype.handleBaseGestureChange): recognize alternate gesture
+        * WebCore.exp.in: added parameter to setupFullscreen
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::removedFrom) : replace m_isInVideoFullscreen with m_videoFullscreenType
+        (WebCore::HTMLMediaElement::stop) : ditto
+        (WebCore::HTMLMediaElement::isFullscreen) : ditto
+        (WebCore::HTMLMediaElement::enterFullscreen): add parameter to enterVideoFullscreenForVideoElement
+        (WebCore::HTMLMediaElement::exitFullscreen): replace m_isInVideoFullscreen with m_videoFullscreenType
+        (WebCore::HTMLMediaElement::enterFullscreenOptimized): added
+        * html/HTMLMediaElement.h: added enterFullscreenOptimized
+        * page/ChromeClient.h:
+        (WebCore::ChromeClient::enterVideoFullscreenForVideoElement): added parameter
+        * platform/ios/WebVideoFullscreenControllerAVKit.h: add parameter
+        * platform/ios/WebVideoFullscreenControllerAVKit.mm:
+        (-[WebVideoFullscreenController enterFullscreen:type:]): add parameter
+        (-[WebVideoFullscreenController enterFullscreen:]): Deleted.
+        * platform/ios/WebVideoFullscreenInterfaceAVKit.h: reorder protected to after public
+        * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
+        (-[WebAVPlayerController player]): this stub is now required
+        (-[WebAVPlayerController layoutSublayersOfLayer:]): this is a better way to update video frames
+        (WebVideoFullscreenInterfaceAVKit::setupFullscreen): implement optimized fullscreen interface 
+        (WebVideoFullscreenInterfaceAVKit::enterFullscreen): ditto
+        (WebVideoFullscreenInterfaceAVKit::exitFullscreen): ditto
+        (WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen): ditto
+
</ins><span class="cx"> 2014-10-28  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Clean up virtual functions in accessibility/
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediacontrolsMediaControlsHostcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -187,6 +187,13 @@
</span><span class="cx">     if (m_textTrackContainer)
</span><span class="cx">         m_textTrackContainer-&gt;exitedFullscreen();
</span><span class="cx"> }
</span><ins>+    
+void MediaControlsHost::enterFullscreenOptimized()
+{
+#if ENABLE(OPTIMIZED_FULLSCREEN)
+    m_mediaElement-&gt;enterFullscreenOptimized();
+#endif
+}
</ins><span class="cx"> 
</span><span class="cx"> void MediaControlsHost::updateCaptionDisplaySizes()
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediacontrolsMediaControlsHosth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -70,6 +70,7 @@
</span><span class="cx">     void updateCaptionDisplaySizes();
</span><span class="cx">     void enteredFullscreen();
</span><span class="cx">     void exitedFullscreen();
</span><ins>+    void enterFullscreenOptimized();
</ins><span class="cx"> 
</span><span class="cx">     String externalDeviceDisplayName() const;
</span><span class="cx">     String externalDeviceType() const;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediacontrolsMediaControlsHostidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.idl (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.idl        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.idl        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -55,4 +55,5 @@
</span><span class="cx">     void updateTextTrackContainer();
</span><span class="cx">     void enteredFullscreen();
</span><span class="cx">     void exitedFullscreen();
</span><ins>+    void enterFullscreenOptimized();
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediacontrolsmediaControlsiOSjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -330,12 +330,17 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         var velocity = Math.abs(event.scale - 1) / duration;
</span><del>-
-        if (event.scale &lt; 1.25 || velocity &lt; 2)
</del><ins>+        
+        if (velocity &lt; 2)
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        delete this.gestureStartTime;
-        this.video.webkitEnterFullscreen();
</del><ins>+        if (event.scale &gt;= 1.25) {
+            delete this.gestureStartTime;
+            this.video.webkitEnterFullscreen();
+        } else if (event.scale &lt;= 0.75) {
+            delete this.gestureStartTime;
+            this.host.enterFullscreenOptimized();
+        }
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     handleBaseGestureEnd: function(event) {
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -3461,7 +3461,7 @@
</span><span class="cx"> __ZN7WebCore32WebVideoFullscreenInterfaceAVKit14exitFullscreenENS_7IntRectE
</span><span class="cx"> __ZN7WebCore32WebVideoFullscreenInterfaceAVKit14setCurrentTimeEdd
</span><span class="cx"> __ZN7WebCore32WebVideoFullscreenInterfaceAVKit15enterFullscreenEv
</span><del>-__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectEP6UIView
</del><ins>+__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectEP6UIViewNS_16HTMLMediaElement19VideoFullscreenModeE
</ins><span class="cx"> __ZN7WebCore32WebVideoFullscreenInterfaceAVKit17cleanupFullscreenEv
</span><span class="cx"> __ZN7WebCore32WebVideoFullscreenInterfaceAVKit17setSeekableRangesERKNS_10TimeRangesE
</span><span class="cx"> __ZN7WebCore32WebVideoFullscreenInterfaceAVKit18setVideoDimensionsEbff
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -273,6 +273,7 @@
</span><span class="cx">     , m_clockTimeAtLastUpdateEvent(0)
</span><span class="cx">     , m_lastTimeUpdateEventMovieTime(MediaTime::positiveInfiniteTime())
</span><span class="cx">     , m_loadState(WaitingForSource)
</span><ins>+    , m_videoFullscreenMode(VideoFullscreenModeNone)
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     , m_videoFullscreenGravity(MediaPlayer::VideoGravityResizeAspect)
</span><span class="cx"> #endif
</span><span class="lines">@@ -302,7 +303,6 @@
</span><span class="cx">     , m_sentEndEvent(false)
</span><span class="cx">     , m_pausedInternal(false)
</span><span class="cx">     , m_sendProgressEvents(true)
</span><del>-    , m_isInVideoFullscreen(false)
</del><span class="cx">     , m_closedCaptionsVisible(false)
</span><span class="cx">     , m_webkitLegacyClosedCaptionOverride(false)
</span><span class="cx">     , m_completelyLoaded(false)
</span><span class="lines">@@ -679,7 +679,7 @@
</span><span class="cx">             mediaControls()-&gt;hide();
</span><span class="cx">         if (m_networkState &gt; NETWORK_EMPTY)
</span><span class="cx">             pause();
</span><del>-        if (m_isInVideoFullscreen)
</del><ins>+        if (m_videoFullscreenMode != VideoFullscreenModeNone)
</ins><span class="cx">             exitFullscreen();
</span><span class="cx"> 
</span><span class="cx">         if (m_player) {
</span><span class="lines">@@ -4670,7 +4670,7 @@
</span><span class="cx"> void HTMLMediaElement::stop()
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;HTMLMediaElement::stop(%p)&quot;, this);
</span><del>-    if (m_isInVideoFullscreen)
</del><ins>+    if (m_videoFullscreenMode != VideoFullscreenModeNone)
</ins><span class="cx">         exitFullscreen();
</span><span class="cx">     
</span><span class="cx">     m_inActiveDocument = false;
</span><span class="lines">@@ -4765,7 +4765,7 @@
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> bool HTMLMediaElement::requiresTextTrackRepresentation() const
</span><span class="cx"> {
</span><del>-    return m_isInVideoFullscreen &amp;&amp; m_player ? m_player-&gt;requiresTextTrackRepresentation() : false;
</del><ins>+    return (m_videoFullscreenMode != VideoFullscreenModeNone) &amp;&amp; m_player ? m_player-&gt;requiresTextTrackRepresentation() : false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaElement::setTextTrackRepresentation(TextTrackRepresentation* representation)
</span><span class="lines">@@ -4857,7 +4857,7 @@
</span><span class="cx">     
</span><span class="cx"> bool HTMLMediaElement::isFullscreen() const
</span><span class="cx"> {
</span><del>-    if (m_isInVideoFullscreen)
</del><ins>+    if (m_videoFullscreenMode != VideoFullscreenModeNone)
</ins><span class="cx">         return true;
</span><span class="cx">     
</span><span class="cx"> #if ENABLE(FULLSCREEN_API)
</span><span class="lines">@@ -4878,10 +4878,11 @@
</span><span class="cx">         enterFullscreen();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLMediaElement::enterFullscreen()
</del><ins>+void HTMLMediaElement::enterFullscreen(VideoFullscreenMode mode)
</ins><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;HTMLMediaElement::enterFullscreen(%p)&quot;, this);
</span><del>-    if (m_isInVideoFullscreen)
</del><ins>+    ASSERT(mode != VideoFullscreenModeNone);
+    if (m_videoFullscreenMode != VideoFullscreenModeNone)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(FULLSCREEN_API)
</span><span class="lines">@@ -4891,18 +4892,23 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    m_isInVideoFullscreen = true;
</del><ins>+    m_videoFullscreenMode = mode;
</ins><span class="cx">     if (hasMediaControls())
</span><span class="cx">         mediaControls()-&gt;enteredFullscreen();
</span><span class="cx">     if (document().page() &amp;&amp; is&lt;HTMLVideoElement&gt;(*this)) {
</span><span class="cx">         HTMLVideoElement&amp; asVideo = downcast&lt;HTMLVideoElement&gt;(*this);
</span><span class="cx">         if (document().page()-&gt;chrome().client().supportsVideoFullscreen()) {
</span><del>-            document().page()-&gt;chrome().client().enterVideoFullscreenForVideoElement(&amp;asVideo);
</del><ins>+            document().page()-&gt;chrome().client().enterVideoFullscreenForVideoElement(&amp;asVideo, m_videoFullscreenMode);
</ins><span class="cx">             scheduleEvent(eventNames().webkitbeginfullscreenEvent);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void HTMLMediaElement::enterFullscreen()
+{
+    enterFullscreen(VideoFullscreenModeStandard);
+}
+
</ins><span class="cx"> void HTMLMediaElement::exitFullscreen()
</span><span class="cx"> {
</span><span class="cx">     LOG(Media, &quot;HTMLMediaElement::exitFullscreen(%p)&quot;, this);
</span><span class="lines">@@ -4914,8 +4920,8 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><del>-    ASSERT(m_isInVideoFullscreen);
-    m_isInVideoFullscreen = false;
</del><ins>+    ASSERT(m_videoFullscreenMode != VideoFullscreenModeNone);
+    m_videoFullscreenMode = VideoFullscreenModeNone;
</ins><span class="cx">     if (hasMediaControls())
</span><span class="cx">         mediaControls()-&gt;exitedFullscreen();
</span><span class="cx">     if (document().page() &amp;&amp; is&lt;HTMLVideoElement&gt;(*this)) {
</span><span class="lines">@@ -4929,6 +4935,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void HTMLMediaElement::enterFullscreenOptimized()
+{
+    enterFullscreen(VideoFullscreenModeOptimized);
+}
+
</ins><span class="cx"> void HTMLMediaElement::didBecomeFullscreenElement()
</span><span class="cx"> {
</span><span class="cx">     if (hasMediaControls())
</span><span class="lines">@@ -6002,6 +6013,9 @@
</span><span class="cx">     if (m_player &amp;&amp; m_player-&gt;isCurrentPlaybackTargetWireless())
</span><span class="cx">         return true;
</span><span class="cx"> #endif
</span><ins>+    if (m_videoFullscreenMode == VideoFullscreenModeOptimized)
+        return true;
+    
</ins><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -391,8 +391,11 @@
</span><span class="cx">     
</span><span class="cx">     WEBCORE_EXPORT virtual bool isFullscreen() const override;
</span><span class="cx">     void toggleFullscreenState();
</span><ins>+    enum VideoFullscreenMode { VideoFullscreenModeNone, VideoFullscreenModeStandard, VideoFullscreenModeOptimized };
+    void enterFullscreen(VideoFullscreenMode);
</ins><span class="cx">     virtual void enterFullscreen() override;
</span><span class="cx">     WEBCORE_EXPORT void exitFullscreen();
</span><ins>+    void enterFullscreenOptimized();
</ins><span class="cx"> 
</span><span class="cx">     virtual bool hasClosedCaptions() const override;
</span><span class="cx">     virtual bool closedCaptionsVisible() const override;
</span><span class="lines">@@ -768,6 +771,7 @@
</span><span class="cx">     RefPtr&lt;HTMLSourceElement&gt; m_currentSourceNode;
</span><span class="cx">     RefPtr&lt;Node&gt; m_nextChildNodeToConsider;
</span><span class="cx"> 
</span><ins>+    VideoFullscreenMode m_videoFullscreenMode;
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     RetainPtr&lt;PlatformLayer&gt; m_videoFullscreenLayer;
</span><span class="cx">     FloatRect m_videoFullscreenFrame;
</span><span class="lines">@@ -831,7 +835,6 @@
</span><span class="cx">     // support progress events so setting m_sendProgressEvents disables them 
</span><span class="cx">     bool m_sendProgressEvents : 1;
</span><span class="cx"> 
</span><del>-    bool m_isInVideoFullscreen : 1;
</del><span class="cx">     bool m_closedCaptionsVisible : 1;
</span><span class="cx">     bool m_webkitLegacyClosedCaptionOverride : 1;
</span><span class="cx">     bool m_completelyLoaded : 1;
</span></span></pre></div>
<a id="trunkSourceWebCorepageChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ChromeClient.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ChromeClient.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/page/ChromeClient.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #include &quot;FocusDirection.h&quot;
</span><span class="cx"> #include &quot;FrameLoader.h&quot;
</span><span class="cx"> #include &quot;GraphicsContext.h&quot;
</span><ins>+#include &quot;HTMLMediaElement.h&quot;
</ins><span class="cx"> #include &quot;HostWindow.h&quot;
</span><span class="cx"> #include &quot;LayerFlushThrottleState.h&quot;
</span><span class="cx"> #include &quot;PopupMenu.h&quot;
</span><span class="lines">@@ -338,7 +339,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     virtual bool supportsVideoFullscreen() { return false; }
</span><del>-    virtual void enterVideoFullscreenForVideoElement(HTMLVideoElement*) { }
</del><ins>+    virtual void enterVideoFullscreenForVideoElement(HTMLVideoElement*, HTMLMediaElement::VideoFullscreenMode) { }
</ins><span class="cx">     virtual void exitVideoFullscreen() { }
</span><span class="cx">     virtual bool requiresFullscreenForVideoPlayback() { return false; } 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenControllerAVKith"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> WEBCORE_EXPORT @interface WebVideoFullscreenController : NSObject
</span><span class="cx"> - (void)setVideoElement:(WebCore::HTMLVideoElement*)videoElement;
</span><span class="cx"> - (WebCore::HTMLVideoElement*)videoElement;
</span><del>-- (void)enterFullscreen:(UIView *)view;
</del><ins>+- (void)enterFullscreen:(UIView *)view mode:(WebCore::HTMLMediaElement::VideoFullscreenMode)mode;
</ins><span class="cx"> - (void)exitFullscreen;
</span><span class="cx"> - (void)requestHideAndExitFullscreen;
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenControllerAVKitmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -114,7 +114,7 @@
</span><span class="cx">     return _videoElement.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)enterFullscreen:(UIView *)view
</del><ins>+- (void)enterFullscreen:(UIView *)view mode:(HTMLMediaElement::VideoFullscreenMode)mode
</ins><span class="cx"> {
</span><span class="cx">     [self retain]; // Balanced by -release in didExitFullscreen:
</span><span class="cx">     
</span><span class="lines">@@ -125,7 +125,7 @@
</span><span class="cx">     _interface-&gt;setWebVideoFullscreenModel(_model.get());
</span><span class="cx">     _model-&gt;setVideoElement(_videoElement.get());
</span><span class="cx">     _videoFullscreenLayer = [CALayer layer];
</span><del>-    _interface-&gt;setupFullscreen(*_videoFullscreenLayer.get(), _videoElement-&gt;clientRect(), view);
</del><ins>+    _interface-&gt;setupFullscreen(*_videoFullscreenLayer.get(), _videoElement-&gt;clientRect(), view, mode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)exitFullscreen
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKith"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #if PLATFORM(IOS) &amp;&amp; __IPHONE_OS_VERSION_MIN_REQUIRED &gt;= 80000
</span><span class="cx"> 
</span><span class="cx"> #include &lt;WebCore/EventListener.h&gt;
</span><ins>+#include &lt;WebCore/HTMLMediaElement.h&gt;
</ins><span class="cx"> #include &lt;WebCore/PlatformLayer.h&gt;
</span><span class="cx"> #include &lt;WebCore/WebVideoFullscreenInterface.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="lines">@@ -63,23 +64,7 @@
</span><span class="cx"> class WebVideoFullscreenInterfaceAVKit
</span><span class="cx">     : public WebVideoFullscreenInterface
</span><span class="cx">     , public RefCounted&lt;WebVideoFullscreenInterfaceAVKit&gt; {
</span><del>-        
-    RetainPtr&lt;WebAVPlayerController&gt; m_playerController;
-    RetainPtr&lt;AVPlayerViewController&gt; m_playerViewController;
-    RetainPtr&lt;CALayer&gt; m_videoLayer;
-    RetainPtr&lt;WebAVVideoLayer&gt; m_videoLayerContainer;
-    WebVideoFullscreenModel* m_videoFullscreenModel;
-    WebVideoFullscreenChangeObserver* m_fullscreenChangeObserver;
</del><span class="cx"> 
</span><del>-    // These are only used when fullscreen is presented in a separate window.
-    RetainPtr&lt;UIWindow&gt; m_window;
-    RetainPtr&lt;UIViewController&gt; m_viewController;
-    RetainPtr&lt;UIView&gt; m_parentView;
-
-    WebAVPlayerController *playerController();
-    
-    void doEnterFullscreen();
-        
</del><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT WebVideoFullscreenInterfaceAVKit();
</span><span class="cx">     virtual ~WebVideoFullscreenInterfaceAVKit() { }
</span><span class="lines">@@ -95,13 +80,34 @@
</span><span class="cx">     WEBCORE_EXPORT virtual void setAudioMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; options, uint64_t selectedIndex) override;
</span><span class="cx">     WEBCORE_EXPORT virtual void setLegibleMediaSelectionOptions(const Vector&lt;WTF::String&gt;&amp; options, uint64_t selectedIndex) override;
</span><span class="cx">     WEBCORE_EXPORT virtual void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) override;
</span><del>-
-    WEBCORE_EXPORT virtual void setupFullscreen(PlatformLayer&amp;, IntRect initialRect, UIView *);
</del><ins>+    
+    WEBCORE_EXPORT virtual void setupFullscreen(PlatformLayer&amp;, IntRect initialRect, UIView *, HTMLMediaElement::VideoFullscreenMode);
</ins><span class="cx">     WEBCORE_EXPORT virtual void enterFullscreen();
</span><span class="cx">     WEBCORE_EXPORT virtual void exitFullscreen(IntRect finalRect);
</span><span class="cx">     WEBCORE_EXPORT virtual void cleanupFullscreen();
</span><span class="cx">     WEBCORE_EXPORT virtual void invalidate();
</span><span class="cx">     WEBCORE_EXPORT virtual void requestHideAndExitFullscreen();
</span><ins>+    
+protected:
+        
+    RetainPtr&lt;WebAVPlayerController&gt; m_playerController;
+    RetainPtr&lt;AVPlayerViewController&gt; m_playerViewController;
+    RetainPtr&lt;CALayer&gt; m_videoLayer;
+    RetainPtr&lt;WebAVVideoLayer&gt; m_videoLayerContainer;
+    WebVideoFullscreenModel* m_videoFullscreenModel;
+    WebVideoFullscreenChangeObserver* m_fullscreenChangeObserver;
+
+    // These are only used when fullscreen is presented in a separate window.
+    RetainPtr&lt;UIWindow&gt; m_window;
+    RetainPtr&lt;UIViewController&gt; m_viewController;
+    RetainPtr&lt;UIView&gt; m_parentView;
+    HTMLMediaElement::VideoFullscreenMode m_mode;
+    bool m_exitRequested;
+    bool m_exitCompleted;
+
+    WebAVPlayerController *playerController();
+    
+    void doEnterFullscreen();
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformiosWebVideoFullscreenInterfaceAVKitmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -157,6 +157,10 @@
</span><span class="cx">     [super dealloc];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (AVPlayer*) player {
+    return nil;
+}
+
</ins><span class="cx"> - (id)forwardingTargetForSelector:(SEL)selector
</span><span class="cx"> {
</span><span class="cx">     UNUSED_PARAM(selector);
</span><span class="lines">@@ -460,6 +464,18 @@
</span><span class="cx">     return [NSSet setWithObjects:@&quot;externalPlaybackActive&quot;, nil];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)layoutSublayersOfLayer:(CALayer *)layer
+{
+    CGRect layerBounds = [layer bounds];
+    self.delegate-&gt;setVideoLayerFrame(CGRectMake(0, 0, CGRectGetWidth(layerBounds), CGRectGetHeight(layerBounds)));
+    
+    [CATransaction begin];
+    for (CALayer *sublayer in [layer sublayers]) {
+        [sublayer setAnchorPoint:CGPointMake(0.5, 0.5)];
+        [sublayer setPosition:CGPointMake(CGRectGetMidX(layerBounds), CGRectGetMidY(layerBounds))];
+    }
+    [CATransaction commit];
+}
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface WebAVMediaSelectionOption : NSObject
</span><span class="lines">@@ -772,12 +788,15 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenInterfaceAVKit::setupFullscreen(PlatformLayer&amp; videoLayer, WebCore::IntRect initialRect, UIView* parentView)
</del><ins>+void WebVideoFullscreenInterfaceAVKit::setupFullscreen(PlatformLayer&amp; videoLayer, WebCore::IntRect initialRect, UIView* parentView, HTMLMediaElement::VideoFullscreenMode mode)
</ins><span class="cx"> {
</span><span class="cx">     __block RefPtr&lt;WebVideoFullscreenInterfaceAVKit&gt; protect(this);
</span><span class="cx">     
</span><ins>+    ASSERT(mode != HTMLMediaElement::VideoFullscreenModeNone);
</ins><span class="cx">     m_videoLayer = &amp;videoLayer;
</span><span class="cx">     
</span><ins>+    m_mode = mode;
+    
</ins><span class="cx">     dispatch_async(dispatch_get_main_queue(), ^{
</span><span class="cx"> 
</span><span class="cx">         [CATransaction begin];
</span><span class="lines">@@ -839,19 +858,58 @@
</span><span class="cx"> {
</span><span class="cx">     __block RefPtr&lt;WebVideoFullscreenInterfaceAVKit&gt; protect(this);
</span><span class="cx">     
</span><ins>+    m_exitCompleted = false;
+    m_exitRequested = false;
+    
</ins><span class="cx">     dispatch_async(dispatch_get_main_queue(), ^{
</span><span class="cx">         [m_videoLayerContainer setBackgroundColor:[[getUIColorClass() blackColor] CGColor]];
</span><del>-        [m_playerViewController enterFullScreenWithCompletionHandler:^(BOOL, NSError*)
-        {
-            [m_playerViewController setShowsPlaybackControls:YES];
-
-            WebThreadRun(^{
-                if (m_fullscreenChangeObserver)
-                    m_fullscreenChangeObserver-&gt;didEnterFullscreen();
-
-                protect = nullptr;
-            });
-        }];
</del><ins>+#if ENABLE(OPTIMIZED_FULLSCREEN)
+        if (m_mode == HTMLMediaElement::VideoFullscreenModeOptimized) {
+            [m_playerViewController startOptimizedFullscreenWithStartCompletionHandler:^(BOOL success, NSError *) {
+                
+                [m_playerViewController setShowsPlaybackControls:YES];
+                
+                WebThreadRun(^{
+                    [m_window setHidden:YES];
+                    if (m_fullscreenChangeObserver)
+                        m_fullscreenChangeObserver-&gt;didEnterFullscreen();
+                    
+                    if (!success) {
+                        if (m_videoFullscreenModel)
+                            m_videoFullscreenModel-&gt;requestExitFullscreen();
+                        protect = nullptr;
+                    }
+                });
+            } stopCompletionHandler:^(AVPlayerViewControllerOptimizedFullscreenStopReason) {
+                m_exitCompleted = true;
+                if (m_exitRequested) {
+                    [m_videoLayerContainer setBackgroundColor:[[getUIColorClass() clearColor] CGColor]];
+                    [[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]];
+                    WebThreadRun(^{
+                        if (m_fullscreenChangeObserver)
+                            m_fullscreenChangeObserver-&gt;didExitFullscreen();
+                        protect = nullptr;
+                    });
+                } else {
+                    if (m_videoFullscreenModel)
+                        m_videoFullscreenModel-&gt;requestExitFullscreen();
+                }
+            }];
+        } else
+#endif
+        if (m_mode == HTMLMediaElement::VideoFullscreenModeStandard) {
+            [m_playerViewController enterFullScreenWithCompletionHandler:^(BOOL, NSError*)
+            {
+                [m_playerViewController setShowsPlaybackControls:YES];
+                
+                WebThreadRun(^{
+                    if (m_fullscreenChangeObserver)
+                        m_fullscreenChangeObserver-&gt;didEnterFullscreen();
+                    
+                    protect = nullptr;
+                });
+            }];
+        }
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -859,6 +917,16 @@
</span><span class="cx"> {
</span><span class="cx">     __block RefPtr&lt;WebVideoFullscreenInterfaceAVKit&gt; protect(this);
</span><span class="cx">     
</span><ins>+    m_exitRequested = true;
+    if (m_exitCompleted) {
+        WebThreadRun(^{
+            if (m_fullscreenChangeObserver)
+                m_fullscreenChangeObserver-&gt;didExitFullscreen();
+            protect = nullptr;
+        });
+        return;
+    }
+    
</ins><span class="cx">     m_playerController = nil;
</span><span class="cx">     
</span><span class="cx">     dispatch_async(dispatch_get_main_queue(), ^{
</span><span class="lines">@@ -871,16 +939,26 @@
</span><span class="cx">         if ([m_videoLayerContainer videoLayerGravity] != AVVideoLayerGravityResizeAspect)
</span><span class="cx">             [m_videoLayerContainer setVideoLayerGravity:AVVideoLayerGravityResizeAspect];
</span><span class="cx">         [[m_playerViewController view] layoutIfNeeded];
</span><del>-        [m_playerViewController exitFullScreenWithCompletionHandler:^(BOOL, NSError*) {
-            [m_videoLayerContainer setBackgroundColor:[[getUIColorClass() clearColor] CGColor]];
-            [[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]];
</del><ins>+        
+#if ENABLE(OPTIMIZED_FULLSCREEN)
+        if (m_mode == HTMLMediaElement::VideoFullscreenModeOptimized) {
+            [m_window setHidden:NO];
+            [m_playerViewController stopOptimizedFullscreen];
+        } else
+#endif
+        if (m_mode == HTMLMediaElement::VideoFullscreenModeStandard) {
+            [m_playerViewController exitFullScreenWithCompletionHandler:^(BOOL, NSError*) {
+                m_exitCompleted = true;
+                [m_videoLayerContainer setBackgroundColor:[[getUIColorClass() clearColor] CGColor]];
+                [[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]];
+                WebThreadRun(^{
+                    if (m_fullscreenChangeObserver)
+                        m_fullscreenChangeObserver-&gt;didExitFullscreen();
+                    protect = nullptr;
+                });
</ins><span class="cx"> 
</span><del>-            WebThreadRun(^{
-                if (m_fullscreenChangeObserver)
-                    m_fullscreenChangeObserver-&gt;didExitFullscreen();
-                protect = nullptr;
-            });
-        }];
</del><ins>+            }];
+        }
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -952,8 +1030,10 @@
</span><span class="cx"> 
</span><span class="cx"> void WebVideoFullscreenInterfaceAVKit::requestHideAndExitFullscreen()
</span><span class="cx"> {
</span><ins>+    if (m_mode == HTMLMediaElement::VideoFullscreenModeOptimized)
+        return;
+    
</ins><span class="cx">     __block RefPtr&lt;WebVideoFullscreenInterfaceAVKit&gt; protect(this);
</span><del>-
</del><span class="cx">     dispatch_async(dispatch_get_main_queue(), ^{
</span><span class="cx">         [m_window setHidden:YES];
</span><span class="cx">         [m_playerViewController exitFullScreenAnimated:NO completionHandler:^(BOOL, NSError*) {
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit/mac/ChangeLog        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-10-28  Jeremy Jones  &lt;jeremyj@apple.com&gt;
+
+        Add optimized fullscreen mode.
+        https://bugs.webkit.org/show_bug.cgi?id=138044
+
+        Reviewed by Jer Noble.
+
+        Enable different types of fullscreen video behavior.
+        Add an enum parameter to enterVideoFullscreenForVideoElement for alternate types of fullscreen.
+
+        * WebCoreSupport/WebChromeClient.h: Add fullscreenType parameter
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::enterVideoFullscreenForVideoElement): ditto
+        * WebView/WebView.mm:
+        (-[WebView _enterVideoFullscreenForVideoElement:type:]): ditto
+        (-[WebView _enterVideoFullscreenForVideoElement:]): Deleted.
+        * WebView/WebViewInternal.h: ditto
+
</ins><span class="cx"> 2014-10-27  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Provide a way for WebKit1 clients to override default action menu items
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -182,7 +182,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx">     virtual bool supportsVideoFullscreen() override;
</span><del>-    virtual void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*) override;
</del><ins>+    virtual void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*, WebCore::HTMLMediaElement::VideoFullscreenMode) override;
</ins><span class="cx">     virtual void exitVideoFullscreen() override;
</span><span class="cx"> #endif
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebChromeClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -953,10 +953,11 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebChromeClient::enterVideoFullscreenForVideoElement(HTMLVideoElement* videoElement)
</del><ins>+void WebChromeClient::enterVideoFullscreenForVideoElement(HTMLVideoElement* videoElement, HTMLMediaElement::VideoFullscreenMode mode)
</ins><span class="cx"> {
</span><ins>+    ASSERT(mode != HTMLMediaElement::VideoFullscreenModeNone);
</ins><span class="cx">     BEGIN_BLOCK_OBJC_EXCEPTIONS;
</span><del>-    [m_webView _enterVideoFullscreenForVideoElement:videoElement];
</del><ins>+    [m_webView _enterVideoFullscreenForVideoElement:videoElement mode:mode];
</ins><span class="cx">     END_BLOCK_OBJC_EXCEPTIONS;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebView.mm        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -8374,7 +8374,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO)
</span><del>-- (void)_enterVideoFullscreenForVideoElement:(WebCore::HTMLVideoElement*)videoElement
</del><ins>+- (void)_enterVideoFullscreenForVideoElement:(WebCore::HTMLVideoElement*)videoElement mode:(WebCore::HTMLMediaElement::VideoFullscreenMode)mode
</ins><span class="cx"> {
</span><span class="cx">     if (_private-&gt;fullscreenController) {
</span><span class="cx">         if ([_private-&gt;fullscreenController videoElement] == videoElement) {
</span><span class="lines">@@ -8394,7 +8394,7 @@
</span><span class="cx">         _private-&gt;fullscreenController = [[WebVideoFullscreenController alloc] init];
</span><span class="cx">         [_private-&gt;fullscreenController setVideoElement:videoElement];
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-        [_private-&gt;fullscreenController enterFullscreen:(UIView *)[[[self window] hostLayer] delegate]];
</del><ins>+        [_private-&gt;fullscreenController enterFullscreen:(UIView *)[[[self window] hostLayer] delegate] mode:mode];
</ins><span class="cx"> #else
</span><span class="cx">         [_private-&gt;fullscreenController enterFullscreen:[[self window] screen]];
</span><span class="cx"> #endif
</span><span class="lines">@@ -8412,7 +8412,7 @@
</span><span class="cx">     _private-&gt;fullscreenController = nil;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#endif // ENABLE(VIDEO) &amp;&amp; !PLATFORM(IOS)
</del><ins>+#endif // ENABLE(VIDEO)
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(FULLSCREEN_API) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx"> - (BOOL)_supportsFullScreenForElement:(const WebCore::Element*)element withKeyboard:(BOOL)withKeyboard
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebViewInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebViewInternal.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebViewInternal.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit/mac/WebView/WebViewInternal.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #import &lt;WebCore/AlternativeTextClient.h&gt;
</span><span class="cx"> #import &lt;WebCore/FindOptions.h&gt;
</span><span class="cx"> #import &lt;WebCore/FloatRect.h&gt;
</span><ins>+#import &lt;WebCore/HTMLMediaElement.h&gt;
</ins><span class="cx"> #import &lt;WebCore/LayoutMilestones.h&gt;
</span><span class="cx"> #import &lt;WebCore/TextAlternativeWithRange.h&gt;
</span><span class="cx"> #import &lt;WebCore/WebCoreKeyboardUIMode.h&gt;
</span><span class="lines">@@ -239,7 +240,7 @@
</span><span class="cx"> - (void)_preferencesChanged:(WebPreferences *)preferences;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO) &amp;&amp; defined(__cplusplus)
</span><del>-- (void)_enterVideoFullscreenForVideoElement:(WebCore::HTMLVideoElement*)videoElement;
</del><ins>+- (void)_enterVideoFullscreenForVideoElement:(WebCore::HTMLVideoElement*)videoElement mode:(WebCore::HTMLMediaElement::VideoFullscreenMode)mode;
</ins><span class="cx"> - (void)_exitVideoFullscreen;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/ChangeLog        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2014-10-28  Jeremy Jones  &lt;jeremyj@apple.com&gt;
+
+        Add optimized fullscreen mode.
+        https://bugs.webkit.org/show_bug.cgi?id=138044
+
+        Reviewed by Anders Carlsson.
+
+        Enable different types of fullscreen video behavior.
+        Add an enum parameter to enterVideoFullscreenForVideoElement for alternate types of fullscreen.
+
+        * UIProcess/ios/WebVideoFullscreenManagerProxy.h: Add fullscreenType parameter
+        * UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in: ditto
+        * UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
+        (WebKit::WebVideoFullscreenManagerProxy::setupFullscreenWithID): ditto
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::enterVideoFullscreenForVideoElement): ditto
+        * WebProcess/WebCoreSupport/WebChromeClient.h: ditto
+        * WebProcess/ios/WebVideoFullscreenManager.h: ditto
+        * WebProcess/ios/WebVideoFullscreenManager.mm:
+        (WebKit::WebVideoFullscreenManager::enterVideoFullscreenForVideoElement): ditto
+        (WebKit::WebVideoFullscreenManager::didCleanupFullscreen): ditto
+
</ins><span class="cx"> 2014-10-28  Dan Bernstein  &lt;mitz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Added a Radar reference to a comment.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWebVideoFullscreenManagerProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&amp;) override;
</span><span class="cx"> 
</span><span class="cx">     // Translate to FullscreenInterface
</span><del>-    void setupFullscreenWithID(uint32_t, WebCore::IntRect initialRect, float hostingDeviceScaleFactor);
</del><ins>+    void setupFullscreenWithID(uint32_t, WebCore::IntRect initialRect, float hostingDeviceScaleFactor, uint32_t videoFullscreenMode);
</ins><span class="cx">     void setSeekableRangesVector(Vector&lt;std::pair&lt;double, double&gt;&gt;&amp;);
</span><span class="cx">     void setExternalPlaybackProperties(bool enabled, uint32_t targetType, String localizedDeviceName);
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWebVideoFullscreenManagerProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx">     SetExternalPlaybackProperties(bool enabled, uint32_t targetType, String localizedDeviceName);
</span><span class="cx">     SetDuration(double duration)
</span><span class="cx">     SetRate(bool isPlaying, double rate)
</span><del>-    SetupFullscreenWithID(uint32_t videoLayerID, WebCore::IntRect initialRect, float hostingScaleFactor)
</del><ins>+    SetupFullscreenWithID(uint32_t videoLayerID, WebCore::IntRect initialRect, float hostingScaleFactor, uint32_t videoFullscreenMode)
</ins><span class="cx">     EnterFullscreen()
</span><span class="cx">     ExitFullscreen(WebCore::IntRect finalRect)
</span><span class="cx">     CleanupFullscreen()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWebVideoFullscreenManagerProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx">     m_layerHost.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenManagerProxy::setupFullscreenWithID(uint32_t videoLayerID, WebCore::IntRect initialRect, float hostingDeviceScaleFactor)
</del><ins>+void WebVideoFullscreenManagerProxy::setupFullscreenWithID(uint32_t videoLayerID, WebCore::IntRect initialRect, float hostingDeviceScaleFactor, uint32_t videoFullscreenMode)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(videoLayerID);
</span><span class="cx">     m_layerHost = WKMakeRenderLayer(videoLayerID);
</span><span class="lines">@@ -92,7 +92,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     UIView *parentView = downcast&lt;RemoteLayerTreeDrawingAreaProxy&gt;(*m_page-&gt;drawingArea()).remoteLayerTreeHost().rootLayer();
</span><del>-    setupFullscreen(*m_layerHost.get(), initialRect, parentView);
</del><ins>+    HTMLMediaElement::VideoFullscreenMode mode = static_cast&lt;HTMLMediaElement::VideoFullscreenMode&gt;(videoFullscreenMode);
+    setupFullscreen(*m_layerHost.get(), initialRect, parentView, mode);
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> void WebVideoFullscreenManagerProxy::setSeekableRangesVector(Vector&lt;std::pair&lt;double, double&gt;&gt;&amp; ranges)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -905,9 +905,10 @@
</span><span class="cx">     return m_page-&gt;videoFullscreenManager()-&gt;supportsVideoFullscreen();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebChromeClient::enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement* videoElement)
</del><ins>+void WebChromeClient::enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement* videoElement, WebCore::HTMLMediaElement::VideoFullscreenMode mode)
</ins><span class="cx"> {
</span><del>-    m_page-&gt;videoFullscreenManager()-&gt;enterVideoFullscreenForVideoElement(videoElement);
</del><ins>+    ASSERT(mode != HTMLMediaElement::VideoFullscreenModeNone);
+    m_page-&gt;videoFullscreenManager()-&gt;enterVideoFullscreenForVideoElement(videoElement, mode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebChromeClient::exitVideoFullscreen()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -254,7 +254,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     virtual bool supportsVideoFullscreen();
</span><del>-    virtual void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*);
</del><ins>+    virtual void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*, WebCore::HTMLMediaElement::VideoFullscreenMode);
</ins><span class="cx">     virtual void exitVideoFullscreen();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessiosWebVideoFullscreenManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;MessageReceiver.h&quot;
</span><span class="cx"> #include &lt;WebCore/EventListener.h&gt;
</span><ins>+#include &lt;WebCore/HTMLMediaElement.h&gt;
</ins><span class="cx"> #include &lt;WebCore/PlatformCALayer.h&gt;
</span><span class="cx"> #include &lt;WebCore/WebVideoFullscreenInterface.h&gt;
</span><span class="cx"> #include &lt;WebCore/WebVideoFullscreenModelVideoElement.h&gt;
</span><span class="lines">@@ -59,7 +60,7 @@
</span><span class="cx">     void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&amp;);
</span><span class="cx">     
</span><span class="cx">     bool supportsVideoFullscreen() const;
</span><del>-    void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*);
</del><ins>+    void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*, WebCore::HTMLMediaElement::VideoFullscreenMode);
</ins><span class="cx">     void exitVideoFullscreen();
</span><span class="cx">     
</span><span class="cx"> protected:
</span><span class="lines">@@ -92,6 +93,7 @@
</span><span class="cx">     
</span><span class="cx">     bool m_isAnimating;
</span><span class="cx">     bool m_targetIsFullscreen;
</span><ins>+    WebCore::HTMLMediaElement::VideoFullscreenMode m_fullscreenMode;
</ins><span class="cx">     bool m_isFullscreen;
</span><span class="cx"> };
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessiosWebVideoFullscreenManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm (175278 => 175279)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm        2014-10-28 22:42:37 UTC (rev 175278)
+++ trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm        2014-10-28 23:14:42 UTC (rev 175279)
</span><span class="lines">@@ -85,11 +85,14 @@
</span><span class="cx">     return Settings::avKitEnabled();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebVideoFullscreenManager::enterVideoFullscreenForVideoElement(HTMLVideoElement* videoElement)
</del><ins>+void WebVideoFullscreenManager::enterVideoFullscreenForVideoElement(HTMLVideoElement* videoElement, HTMLMediaElement::VideoFullscreenMode mode)
</ins><span class="cx"> {
</span><ins>+    ASSERT(mode != HTMLMediaElement::VideoFullscreenModeNone);
+
</ins><span class="cx">     m_videoElement = videoElement;
</span><span class="cx"> 
</span><span class="cx">     m_targetIsFullscreen = true;
</span><ins>+    m_fullscreenMode = mode;
</ins><span class="cx"> 
</span><span class="cx">     if (m_isAnimating)
</span><span class="cx">         return;
</span><span class="lines">@@ -99,7 +102,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_layerHostingContext = LayerHostingContext::createForExternalHostingProcess();
</span><span class="cx">     
</span><del>-    m_page-&gt;send(Messages::WebVideoFullscreenManagerProxy::SetupFullscreenWithID(m_layerHostingContext-&gt;contextID(), clientRectForElement(videoElement), m_page-&gt;deviceScaleFactor()), m_page-&gt;pageID());
</del><ins>+    m_page-&gt;send(Messages::WebVideoFullscreenManagerProxy::SetupFullscreenWithID(m_layerHostingContext-&gt;contextID(), clientRectForElement(videoElement), m_page-&gt;deviceScaleFactor(), m_fullscreenMode), m_page-&gt;pageID());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebVideoFullscreenManager::exitVideoFullscreen()
</span><span class="lines">@@ -235,7 +238,7 @@
</span><span class="cx">     // enter fullscreen now if it was previously requested during an animation.
</span><span class="cx">     __block RefPtr&lt;WebVideoFullscreenModelVideoElement&gt; protect(this);
</span><span class="cx">     WebThreadRun(^ {
</span><del>-        enterVideoFullscreenForVideoElement(m_videoElement.get());
</del><ins>+        enterVideoFullscreenForVideoElement(m_videoElement.get(), m_fullscreenMode);
</ins><span class="cx">         protect.clear();
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>