<!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>[180646] 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/180646">180646</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-02-25 15:49:08 -0800 (Wed, 25 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make PublicURLManager suspendable
https://bugs.webkit.org/show_bug.cgi?id=141977
&lt;rdar://problem/19923085&gt;

Reviewed by Andreas Kling.

Source/WebCore:

Make PublicURLManager suspendable by overriding ActiveDOMObject::canSuspend()
and returning true. Nothing prevents suspending the PublicURLManager as its
implementation never causes JS to be executed. No implementation for
suspend() / resume() needs to be provided for the same reason.

The fact that PublicURLManager wasn't suspendable was preventing pages using
URL.createObjectURL() from entering the PageCache. Baidu.com search results
pages are using the API for example.

Test: fast/history/page-cache-createObjectURL.html

* html/PublicURLManager.cpp:
(WebCore::PublicURLManager::canSuspend):
* html/PublicURLManager.h:

LayoutTests:

Add a layout test to check that a page using URL.createObjectURL() API
can enter the PageCache.

* fast/history/page-cache-createObjectURL-expected.txt: Added.
* fast/history/page-cache-createObjectURL.html: Added.

* platform/wk2/TestExpectations:
  The new test is skipped on WK2 because WKTR does not support
  eventSender.beginDragWithFiles().</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformwk2TestExpectations">trunk/LayoutTests/platform/wk2/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlPublicURLManagercpp">trunk/Source/WebCore/html/PublicURLManager.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlPublicURLManagerh">trunk/Source/WebCore/html/PublicURLManager.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasthistorypagecachecreateObjectURLexpectedtxt">trunk/LayoutTests/fast/history/page-cache-createObjectURL-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasthistorypagecachecreateObjectURLhtml">trunk/LayoutTests/fast/history/page-cache-createObjectURL.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (180645 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-02-25 23:42:38 UTC (rev 180645)
+++ trunk/LayoutTests/ChangeLog        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-02-25  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Make PublicURLManager suspendable
+        https://bugs.webkit.org/show_bug.cgi?id=141977
+        &lt;rdar://problem/19923085&gt;
+
+        Reviewed by Andreas Kling.
+
+        Add a layout test to check that a page using URL.createObjectURL() API
+        can enter the PageCache.
+
+        * fast/history/page-cache-createObjectURL-expected.txt: Added.
+        * fast/history/page-cache-createObjectURL.html: Added.
+
+        * platform/wk2/TestExpectations:
+          The new test is skipped on WK2 because WKTR does not support
+          eventSender.beginDragWithFiles().
+
</ins><span class="cx"> 2015-02-25  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Horizontal and vertical lines are clipped completely if clip-path is included in the tag but the referenced element is defined later.
</span></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachecreateObjectURLexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/history/page-cache-createObjectURL-expected.txt (0 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-createObjectURL-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/history/page-cache-createObjectURL-expected.txt        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+Tests that a page calling URL.createObjectURL() can use the page cache.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS img.width is 0
+PASS img.height is 0
+img.src = blobURL
+pageshow - not from cache
+PASS Image loaded
+PASS img.width is 76
+PASS img.height is 103
+pagehide - entering cache
+pageshow - from cache
+PASS Page did enter and was restored from the page cache
+Reuse the previous blobURL
+img2.src = blobURL
+PASS Image2 loaded
+PASS img2.width is 76
+PASS img2.height is 103
+PASS successfullyParsed is true
+
+TEST COMPLETE
+  
</ins></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachecreateObjectURLhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/history/page-cache-createObjectURL.html (0 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-createObjectURL.html                                (rev 0)
+++ trunk/LayoutTests/fast/history/page-cache-createObjectURL.html        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -0,0 +1,86 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+
+&lt;input type=&quot;file&quot; name=&quot;file&quot; id=&quot;file&quot; onchange=&quot;onInputFileChange()&quot;/&gt;
+&lt;img id='imgToReplace1' src=''/&gt;
+&lt;img id='imgToReplace2' src=''/&gt;
+
+&lt;script&gt;
+description('Tests that a page calling URL.createObjectURL() can use the page cache.');
+window.jsTestIsAsync = true;
+var blobURL = null;
+
+if (window.testRunner)
+    window.testRunner.overridePreference(&quot;WebKitUsesPageCachePreferenceKey&quot;, 1);
+
+function onInputFileChange()
+{
+    var file = document.getElementById(&quot;file&quot;).files[0];
+    img = document.getElementById('imgToReplace1');
+    shouldBe(&quot;img.width&quot;, &quot;0&quot;);
+    shouldBe(&quot;img.height&quot;, &quot;0&quot;);
+    img.onload = onImgLoad;
+    blobURL = URL.createObjectURL(file);
+    evalAndLog(&quot;img.src = blobURL&quot;);
+}
+
+function onImgLoad()
+{
+    img = document.getElementById('imgToReplace1');
+    testPassed(&quot;Image loaded&quot;);
+    shouldBe(&quot;img.width&quot;, &quot;76&quot;);
+    shouldBe(&quot;img.height&quot;, &quot;103&quot;);
+
+    // Force a back navigation back to this page.
+    window.location.href = &quot;resources/page-cache-helper.html&quot;;
+}
+
+function onImg2Load()
+{
+    img2 = document.getElementById('imgToReplace2');
+    testPassed(&quot;Image2 loaded&quot;);
+    shouldBe(&quot;img2.width&quot;, &quot;76&quot;);
+    shouldBe(&quot;img2.height&quot;, &quot;103&quot;);
+
+    finishJSTest();
+}
+
+function moveMouseToCenterOfElement(element)
+{
+    var centerX = element.offsetLeft + element.offsetWidth / 2;
+    var centerY = element.offsetTop + element.offsetHeight / 2;
+    eventSender.mouseMoveTo(centerX, centerY);
+}
+
+window.addEventListener(&quot;pageshow&quot;, function(event) {
+    debug(&quot;pageshow - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;from cache&quot;);
+    if (event.persisted) {
+        testPassed(&quot;Page did enter and was restored from the page cache&quot;);
+
+        debug(&quot;Reuse the previous blobURL&quot;);
+        img2 = document.getElementById('imgToReplace2');
+        img2.onload = onImg2Load;
+        evalAndLog(&quot;img2.src = blobURL&quot;);
+    }
+}, false);
+
+window.addEventListener(&quot;pagehide&quot;, function(event) {
+    debug(&quot;pagehide - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;entering cache&quot;);
+    if (!event.persisted) {
+        testFailed(&quot;Page did not enter the page cache.&quot;);
+        finishJSTest();
+    }
+}, false);
+
+window.addEventListener('load', function() {
+    eventSender.beginDragWithFiles(['../files/resources/abe.png']);
+    moveMouseToCenterOfElement(document.getElementById('file'));
+    eventSender.mouseUp();
+}, false);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformwk2TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/wk2/TestExpectations (180645 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/wk2/TestExpectations        2015-02-25 23:42:38 UTC (rev 180645)
+++ trunk/LayoutTests/platform/wk2/TestExpectations        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -640,6 +640,7 @@
</span><span class="cx"> fast/forms/file/input-file-re-render.html
</span><span class="cx"> fast/forms/file/recover-file-input-in-unposted-form.html
</span><span class="cx"> fast/forms/file/selected-files-from-history-state.html
</span><ins>+fast/history/page-cache-createObjectURL.html
</ins><span class="cx"> fast/workers/worker-copy-shared-blob-url.html
</span><span class="cx"> http/tests/local/fileapi/file-last-modified-after-delete.html
</span><span class="cx"> http/tests/local/fileapi/file-last-modified.html
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (180645 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-02-25 23:42:38 UTC (rev 180645)
+++ trunk/Source/WebCore/ChangeLog        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-02-25  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Make PublicURLManager suspendable
+        https://bugs.webkit.org/show_bug.cgi?id=141977
+        &lt;rdar://problem/19923085&gt;
+
+        Reviewed by Andreas Kling.
+
+        Make PublicURLManager suspendable by overriding ActiveDOMObject::canSuspend()
+        and returning true. Nothing prevents suspending the PublicURLManager as its
+        implementation never causes JS to be executed. No implementation for
+        suspend() / resume() needs to be provided for the same reason.
+
+        The fact that PublicURLManager wasn't suspendable was preventing pages using
+        URL.createObjectURL() from entering the PageCache. Baidu.com search results
+        pages are using the API for example.
+
+        Test: fast/history/page-cache-createObjectURL.html
+
+        * html/PublicURLManager.cpp:
+        (WebCore::PublicURLManager::canSuspend):
+        * html/PublicURLManager.h:
+
</ins><span class="cx"> 2015-02-25  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Cleanup BackgroundImageGeometry class.
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlPublicURLManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/PublicURLManager.cpp (180645 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/PublicURLManager.cpp        2015-02-25 23:42:38 UTC (rev 180645)
+++ trunk/Source/WebCore/html/PublicURLManager.cpp        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -80,4 +80,10 @@
</span><span class="cx">     m_registryToURL.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool PublicURLManager::canSuspend() const
+{
+    // Suspending an PublicURLManager is safe as it does not cause any JS to be executed.
+    return true;
</ins><span class="cx"> }
</span><ins>+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlPublicURLManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/PublicURLManager.h (180645 => 180646)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/PublicURLManager.h        2015-02-25 23:42:38 UTC (rev 180645)
+++ trunk/Source/WebCore/html/PublicURLManager.h        2015-02-25 23:49:08 UTC (rev 180646)
</span><span class="lines">@@ -52,6 +52,8 @@
</span><span class="cx"> 
</span><span class="cx">     // ActiveDOMObject interface.
</span><span class="cx">     virtual void stop() override;
</span><ins>+    virtual bool canSuspend() const override;
+
</ins><span class="cx"> private:
</span><span class="cx">     virtual const char* activeDOMObjectName() const override { return &quot;PublicURLManager&quot;; }
</span><span class="cx">     
</span></span></pre>
</div>
</div>

</body>
</html>