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

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

<h3>Log Message</h3>
<pre>Videos on apple.com don't show up when restored from page cache.
&lt;https://webkit.org/b/146766&gt;
&lt;rdar://problem/21712311&gt;

Reviewed by Darin Adler.

Source/WebCore:

Break out most of HTMLMediaElement::stop() (override of ActiveDOMObject::stop(), to be clear)
into a stopWithoutDestroyingMediaPlayer() function that both stop() and suspend() can call.

Before this change, suspend() would call stop() when moving into the page cache, killing the
internal MediaPlayer object which caused the video to disappear from the page.

Test: LayoutTests/media/restore-from-page-cache.html (amended)

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::stopWithoutDestroyingMediaPlayer):
(WebCore::HTMLMediaElement::stop):
(WebCore::HTMLMediaElement::suspend):
* html/HTMLMediaElement.h:

LayoutTests:

Tweaked an existing media element page caching test to dump out the video height
after restoring from page cache. Failure to restore the video player would result
in incorrect geometry (it falls back to RenderReplaced's default 300x150.)

* media/restore-from-page-cache-expected.txt:
* media/restore-from-page-cache.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsmediarestorefrompagecacheexpectedtxt">trunk/LayoutTests/media/restore-from-page-cache-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediarestorefrompagecachehtml">trunk/LayoutTests/media/restore-from-page-cache.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (186568 => 186569)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-07-09 03:01:47 UTC (rev 186568)
+++ trunk/LayoutTests/ChangeLog        2015-07-09 03:28:24 UTC (rev 186569)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-07-08  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Videos on apple.com don't show up when restored from page cache.
+        &lt;https://webkit.org/b/146766&gt;
+        &lt;rdar://problem/21712311&gt;
+
+        Reviewed by Darin Adler.
+
+        Tweaked an existing media element page caching test to dump out the video height
+        after restoring from page cache. Failure to restore the video player would result
+        in incorrect geometry (it falls back to RenderReplaced's default 300x150.)
+
+        * media/restore-from-page-cache-expected.txt:
+        * media/restore-from-page-cache.html:
+
</ins><span class="cx"> 2015-07-08  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Content Extensions] Fuse undistinguishable actions as much as possible
</span></span></pre></div>
<a id="trunkLayoutTestsmediarestorefrompagecacheexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/media/restore-from-page-cache-expected.txt (186568 => 186569)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/restore-from-page-cache-expected.txt        2015-07-09 03:01:47 UTC (rev 186568)
+++ trunk/LayoutTests/media/restore-from-page-cache-expected.txt        2015-07-09 03:28:24 UTC (rev 186569)
</span><span class="lines">@@ -7,4 +7,6 @@
</span><span class="cx"> *** Page going into cache
</span><span class="cx"> *** Page returned from cache
</span><span class="cx"> EXPECTED (loadCount == '1') OK
</span><ins>+EXPECTED (videoComputedStyle.width == '320px') OK
+EXPECTED (videoComputedStyle.height == '240px') OK
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsmediarestorefrompagecachehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/media/restore-from-page-cache.html (186568 => 186569)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/restore-from-page-cache.html        2015-07-09 03:01:47 UTC (rev 186568)
+++ trunk/LayoutTests/media/restore-from-page-cache.html        2015-07-09 03:28:24 UTC (rev 186569)
</span><span class="lines">@@ -21,7 +21,13 @@
</span><span class="cx">                     consoleWrite(&quot;*** Page returned from cache&quot;);
</span><span class="cx"> 
</span><span class="cx">                     testExpected(&quot;loadCount&quot;, 1);
</span><del>-                    
</del><ins>+
+                    // Dump the height of the video so we can verify that the player was restored.
+                    video = document.getElementsByTagName('video')[0];
+                    videoComputedStyle = getComputedStyle(video);
+                    testExpected(&quot;videoComputedStyle.width&quot;, &quot;320px&quot;);
+                    testExpected(&quot;videoComputedStyle.height&quot;, &quot;240px&quot;);
+
</ins><span class="cx">                     // schedule the test to end shortly, but wait long enough for the element to fire loading events
</span><span class="cx">                     //  if that is going to happen
</span><span class="cx">                     setTimeout(function() { if (window.testRunner) testRunner.notifyDone(); }, 200);
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (186568 => 186569)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-07-09 03:01:47 UTC (rev 186568)
+++ trunk/Source/WebCore/ChangeLog        2015-07-09 03:28:24 UTC (rev 186569)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-07-08  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Videos on apple.com don't show up when restored from page cache.
+        &lt;https://webkit.org/b/146766&gt;
+        &lt;rdar://problem/21712311&gt;
+
+        Reviewed by Darin Adler.
+
+        Break out most of HTMLMediaElement::stop() (override of ActiveDOMObject::stop(), to be clear)
+        into a stopWithoutDestroyingMediaPlayer() function that both stop() and suspend() can call.
+
+        Before this change, suspend() would call stop() when moving into the page cache, killing the
+        internal MediaPlayer object which caused the video to disappear from the page.
+
+        Test: LayoutTests/media/restore-from-page-cache.html (amended)
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::stopWithoutDestroyingMediaPlayer):
+        (WebCore::HTMLMediaElement::stop):
+        (WebCore::HTMLMediaElement::suspend):
+        * html/HTMLMediaElement.h:
+
</ins><span class="cx"> 2015-07-08  Matthew Daiter  &lt;mdaiter@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make MediaStream conform to its private client like MediaSource does
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (186568 => 186569)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2015-07-09 03:01:47 UTC (rev 186568)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2015-07-09 03:28:24 UTC (rev 186569)
</span><span class="lines">@@ -4862,9 +4862,10 @@
</span><span class="cx">     return &quot;HTMLMediaElement&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLMediaElement::stop()
</del><ins>+void HTMLMediaElement::stopWithoutDestroyingMediaPlayer()
</ins><span class="cx"> {
</span><del>-    LOG(Media, &quot;HTMLMediaElement::stop(%p)&quot;, this);
</del><ins>+    LOG(Media, &quot;HTMLMediaElement::stopWithoutDestroyingMediaPlayer(%p)&quot;, this);
+
</ins><span class="cx">     if (m_videoFullscreenMode != VideoFullscreenModeNone)
</span><span class="cx">         exitFullscreen();
</span><span class="cx">     
</span><span class="lines">@@ -4885,13 +4886,20 @@
</span><span class="cx"> 
</span><span class="cx">     m_asyncEventQueue.close();
</span><span class="cx"> 
</span><ins>+    updateSleepDisabling();
+}
+
+void HTMLMediaElement::stop()
+{
+    LOG(Media, &quot;HTMLMediaElement::stop(%p)&quot;, this);
+
+    stopWithoutDestroyingMediaPlayer();
+
</ins><span class="cx">     // Once an active DOM object has been stopped it can not be restarted, so we can deallocate
</span><span class="cx">     // the media player now. Note that userCancelledLoad will already called clearMediaPlayer
</span><span class="cx">     // if the media was not fully loaded, but we need the same cleanup if the file was completely
</span><span class="cx">     // loaded and calling it again won't cause any problems.
</span><span class="cx">     clearMediaPlayer(EveryDelayedAction);
</span><del>-
-    updateSleepDisabling();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLMediaElement::suspend(ReasonForSuspension why)
</span><span class="lines">@@ -4901,7 +4909,7 @@
</span><span class="cx">     switch (why)
</span><span class="cx">     {
</span><span class="cx">         case PageCache:
</span><del>-            stop();
</del><ins>+            stopWithoutDestroyingMediaPlayer();
</ins><span class="cx">             m_mediaSession-&gt;addBehaviorRestriction(MediaElementSession::RequirePageConsentToResumeMedia);
</span><span class="cx">             break;
</span><span class="cx">         case DocumentWillBePaused:
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (186568 => 186569)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2015-07-09 03:01:47 UTC (rev 186568)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2015-07-09 03:28:24 UTC (rev 186569)
</span><span class="lines">@@ -505,6 +505,7 @@
</span><span class="cx">     void suspend(ReasonForSuspension) override;
</span><span class="cx">     void resume() override;
</span><span class="cx">     void stop() override;
</span><ins>+    void stopWithoutDestroyingMediaPlayer();
</ins><span class="cx">     
</span><span class="cx">     virtual void mediaVolumeDidChange() override;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>