<!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>[208049] 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/208049">208049</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2016-10-28 08:39:27 -0700 (Fri, 28 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Always use iOS preload behavior
https://bugs.webkit.org/show_bug.cgi?id=164127

Reviewed by Andreas Kling.

Source/WebCore:

On non-iOS platforms we were delaying issuing lower priority preload (images mostly) until document has body.
This should be unnecessary as networking layer prioritization should ensure higher priority resources are
loaded earlier. Testing on iOS has showed that more aggressive behavior is a win.

This patch switches to iOS behavior on all platforms (and simplified the logic).

* html/parser/HTMLResourcePreloader.cpp:
(WebCore::HTMLResourcePreloader::preload):
* loader/LinkLoader.cpp:
(WebCore::LinkLoader::preloadIfNeeded):
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::performPostLoadActions):
(WebCore::CachedResourceLoader::preload):
(WebCore::CachedResourceLoader::isPreloaded):
(WebCore::CachedResourceLoader::checkForPendingPreloads): Deleted.
(WebCore::CachedResourceLoader::requestPreload): Deleted.
(WebCore::CachedResourceLoader::clearPendingPreloads): Deleted.
* loader/cache/CachedResourceLoader.h:

LayoutTests:

* http/tests/webgl/1.0.2/readPixelsBadArgs-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestshttptestswebgl102readPixelsBadArgsexpectedtxt">trunk/LayoutTests/http/tests/webgl/1.0.2/readPixelsBadArgs-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlparserHTMLResourcePreloadercpp">trunk/Source/WebCore/html/parser/HTMLResourcePreloader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderLinkLoadercpp">trunk/Source/WebCore/loader/LinkLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceLoadercpp">trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceLoaderh">trunk/Source/WebCore/loader/cache/CachedResourceLoader.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/LayoutTests/ChangeLog        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2016-10-28  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Always use iOS preload behavior
+        https://bugs.webkit.org/show_bug.cgi?id=164127
+
+        Reviewed by Andreas Kling.
+
+        * http/tests/webgl/1.0.2/readPixelsBadArgs-expected.txt:
+
</ins><span class="cx"> 2016-10-28  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Modern Media Controls] Media Controller: scrubbing support
</span></span></pre></div>
<a id="trunkLayoutTestshttptestswebgl102readPixelsBadArgsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/http/tests/webgl/1.0.2/readPixelsBadArgs-expected.txt (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/webgl/1.0.2/readPixelsBadArgs-expected.txt        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/LayoutTests/http/tests/webgl/1.0.2/readPixelsBadArgs-expected.txt        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -1,4 +1,5 @@
</span><span class="cx"> Blocked access to external URL http://www.opengl.org/img/opengl_logo.jpg
</span><ins>+Blocked access to external URL http://www.opengl.org/img/opengl_logo.jpg
</ins><span class="cx"> This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL.
</span><span class="cx"> 
</span><span class="cx"> Test: resources/webgl_test_files/conformance/more/functions/readPixelsBadArgs.html
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/Source/WebCore/ChangeLog        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2016-10-28  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Always use iOS preload behavior
+        https://bugs.webkit.org/show_bug.cgi?id=164127
+
+        Reviewed by Andreas Kling.
+
+        On non-iOS platforms we were delaying issuing lower priority preload (images mostly) until document has body.
+        This should be unnecessary as networking layer prioritization should ensure higher priority resources are
+        loaded earlier. Testing on iOS has showed that more aggressive behavior is a win.
+
+        This patch switches to iOS behavior on all platforms (and simplified the logic).
+
+        * html/parser/HTMLResourcePreloader.cpp:
+        (WebCore::HTMLResourcePreloader::preload):
+        * loader/LinkLoader.cpp:
+        (WebCore::LinkLoader::preloadIfNeeded):
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::performPostLoadActions):
+        (WebCore::CachedResourceLoader::preload):
+        (WebCore::CachedResourceLoader::isPreloaded):
+        (WebCore::CachedResourceLoader::checkForPendingPreloads): Deleted.
+        (WebCore::CachedResourceLoader::requestPreload): Deleted.
+        (WebCore::CachedResourceLoader::clearPendingPreloads): Deleted.
+        * loader/cache/CachedResourceLoader.h:
+
</ins><span class="cx"> 2016-10-28  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Fetch] Ensure redirection count is no more than 20 in case of cross origin requests
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlparserHTMLResourcePreloadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/parser/HTMLResourcePreloader.cpp (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/parser/HTMLResourcePreloader.cpp        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/Source/WebCore/html/parser/HTMLResourcePreloader.cpp        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx">     if (!preload-&gt;media().isEmpty() &amp;&amp; !mediaAttributeMatches(m_document, &amp;m_document.renderView()-&gt;style(), preload-&gt;media()))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_document.cachedResourceLoader().preload(preload-&gt;resourceType(), preload-&gt;resourceRequest(m_document), CachedResourceLoader::ImplicitPreload);
</del><ins>+    m_document.cachedResourceLoader().preload(preload-&gt;resourceType(), preload-&gt;resourceRequest(m_document));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderLinkLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/LinkLoader.cpp (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/LinkLoader.cpp        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/Source/WebCore/loader/LinkLoader.cpp        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -162,7 +162,7 @@
</span><span class="cx">     linkRequest.setInitiator(&quot;link&quot;);
</span><span class="cx"> 
</span><span class="cx">     linkRequest.setAsPotentiallyCrossOrigin(crossOriginMode, document);
</span><del>-    CachedResourceHandle&lt;CachedResource&gt; cachedLinkResource = document.cachedResourceLoader().preload(type.value(), WTFMove(linkRequest), CachedResourceLoader::ExplicitPreload);
</del><ins>+    CachedResourceHandle&lt;CachedResource&gt; cachedLinkResource = document.cachedResourceLoader().preload(type.value(), WTFMove(linkRequest));
</ins><span class="cx"> 
</span><span class="cx">     if (cachedLinkResource)
</span><span class="cx">         m_preloadResourceClient = createLinkPreloadResourceClient(*cachedLinkResource, *this, type.value());
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -1189,8 +1189,6 @@
</span><span class="cx"> 
</span><span class="cx"> void CachedResourceLoader::performPostLoadActions()
</span><span class="cx"> {
</span><del>-    checkForPendingPreloads();
-
</del><span class="cx">     platformStrategies()-&gt;loaderStrategy()-&gt;servePendingRequests();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1211,51 +1209,8 @@
</span><span class="cx">     ASSERT(m_requestCount &gt; -1);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CachedResourceHandle&lt;CachedResource&gt; CachedResourceLoader::preload(CachedResource::Type type, CachedResourceRequest&amp;&amp; request, PreloadType preloadType)
</del><ins>+CachedResourceHandle&lt;CachedResource&gt; CachedResourceLoader::preload(CachedResource::Type type, CachedResourceRequest&amp;&amp; request)
</ins><span class="cx"> {
</span><del>-    // We always preload resources on iOS. See &lt;https://bugs.webkit.org/show_bug.cgi?id=91276&gt;.
-    // FIXME: We should consider adding a setting to toggle aggressive preloading behavior as opposed
-    // to making this behavior specific to iOS.
-#if !PLATFORM(IOS)
-    bool hasRendering = m_document-&gt;bodyOrFrameset() &amp;&amp; m_document-&gt;renderView();
-    bool canBlockParser = type == CachedResource::Script || type == CachedResource::CSSStyleSheet;
-    if (!hasRendering &amp;&amp; !canBlockParser &amp;&amp; preloadType == ImplicitPreload) {
-        // Don't preload subresources that can't block the parser before we have something to draw.
-        // This helps prevent preloads from delaying first display when bandwidth is limited.
-        PendingPreload pendingPreload = { type, WTFMove(request) };
-        m_pendingPreloads.append(pendingPreload);
-        return nullptr;
-    }
-#else
-    UNUSED_PARAM(preloadType);
-#endif
-    return requestPreload(type, WTFMove(request));
-}
-
-void CachedResourceLoader::checkForPendingPreloads()
-{
-    if (m_pendingPreloads.isEmpty())
-        return;
-    auto* body = m_document-&gt;bodyOrFrameset();
-    if (!body || !body-&gt;renderer())
-        return;
-#if PLATFORM(IOS)
-    // We always preload resources on iOS. See &lt;https://bugs.webkit.org/show_bug.cgi?id=91276&gt;.
-    // So, we should never have any pending preloads.
-    // FIXME: We should look to avoid compiling this code entirely when building for iOS.
-    ASSERT_NOT_REACHED();
-#endif
-    while (!m_pendingPreloads.isEmpty()) {
-        PendingPreload preload = m_pendingPreloads.takeFirst();
-        // Don't request preload if the resource already loaded normally (this will result in double load if the page is being reloaded with cached results ignored).
-        if (!cachedResource(preload.m_request.resourceRequest().url()))
-            requestPreload(preload.m_type, WTFMove(preload.m_request));
-    }
-    m_pendingPreloads.clear();
-}
-
-CachedResourceHandle&lt;CachedResource&gt; CachedResourceLoader::requestPreload(CachedResource::Type type, CachedResourceRequest&amp;&amp; request)
-{
</del><span class="cx">     if (request.charset().isEmpty() &amp;&amp; (type == CachedResource::Script || type == CachedResource::CSSStyleSheet))
</span><span class="cx">         request.setCharset(m_document-&gt;charset());
</span><span class="cx"> 
</span><span class="lines">@@ -1287,11 +1242,6 @@
</span><span class="cx">                 return true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    for (auto&amp; pendingPreload : m_pendingPreloads) {
-        if (pendingPreload.m_request.resourceRequest().url() == url)
-            return true;
-    }
</del><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1312,11 +1262,6 @@
</span><span class="cx">     m_preloads = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CachedResourceLoader::clearPendingPreloads()
-{
-    m_pendingPreloads.clear();
-}
-
</del><span class="cx"> #if PRELOAD_DEBUG
</span><span class="cx"> void CachedResourceLoader::printPreloadStats()
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.h (208048 => 208049)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.h        2016-10-28 15:11:21 UTC (rev 208048)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.h        2016-10-28 15:39:27 UTC (rev 208049)
</span><span class="lines">@@ -130,10 +130,7 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool isPreloaded(const String&amp; urlString) const;
</span><span class="cx">     void clearPreloads();
</span><del>-    void clearPendingPreloads();
-    enum PreloadType { ImplicitPreload, ExplicitPreload };
-    CachedResourceHandle&lt;CachedResource&gt; preload(CachedResource::Type, CachedResourceRequest&amp;&amp;, PreloadType);
-    void checkForPendingPreloads();
</del><ins>+    CachedResourceHandle&lt;CachedResource&gt; preload(CachedResource::Type, CachedResourceRequest&amp;&amp;);
</ins><span class="cx">     void printPreloadStats();
</span><span class="cx"> 
</span><span class="cx">     bool updateRequestAfterRedirection(CachedResource::Type, ResourceRequest&amp;, const ResourceLoaderOptions&amp;);
</span><span class="lines">@@ -157,7 +154,6 @@
</span><span class="cx">     CachedResourceHandle&lt;CachedResource&gt; requestResource(CachedResource::Type, CachedResourceRequest&amp;&amp;, ForPreload = ForPreload::No, DeferOption = DeferOption::NoDefer);
</span><span class="cx">     CachedResourceHandle&lt;CachedResource&gt; revalidateResource(CachedResourceRequest&amp;&amp;, CachedResource&amp;);
</span><span class="cx">     CachedResourceHandle&lt;CachedResource&gt; loadResource(CachedResource::Type, CachedResourceRequest&amp;&amp;);
</span><del>-    CachedResourceHandle&lt;CachedResource&gt; requestPreload(CachedResource::Type, CachedResourceRequest&amp;&amp;);
</del><span class="cx"> 
</span><span class="cx">     void prepareFetch(CachedResource::Type, CachedResourceRequest&amp;);
</span><span class="cx">     void updateHTTPRequestHeaders(CachedResource::Type, CachedResourceRequest&amp;);
</span><span class="lines">@@ -191,11 +187,6 @@
</span><span class="cx">     int m_requestCount;
</span><span class="cx">     
</span><span class="cx">     std::unique_ptr&lt;ListHashSet&lt;CachedResource*&gt;&gt; m_preloads;
</span><del>-    struct PendingPreload {
-        CachedResource::Type m_type;
-        CachedResourceRequest m_request;
-    };
-    Deque&lt;PendingPreload&gt; m_pendingPreloads;
</del><span class="cx"> 
</span><span class="cx">     Timer m_garbageCollectDocumentResourcesTimer;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>