Title: [246466] trunk
Revision
246466
Author
[email protected]
Date
2019-06-15 11:20:27 -0700 (Sat, 15 Jun 2019)

Log Message

Source/WebCore:
Add tests for prefetch redirects
https://bugs.webkit.org/show_bug.cgi?id=197371

Patch by Rob Buis <[email protected]> on 2019-06-15
Reviewed by Youenn Fablet.

Test: http/wpt/prefetch/link-prefetch-main-resource-redirect.html

Allow clearing of the Purpose request header field.

* platform/network/ResourceRequestBase.cpp:
(WebCore::ResourceRequestBase::clearPurpose):
* platform/network/ResourceRequestBase.h:

Source/WebKit:
Store prefetch redirects in the prefetch cache
https://bugs.webkit.org/show_bug.cgi?id=197371

Patch by Rob Buis <[email protected]> on 2019-06-15
Reviewed by Youenn Fablet.

Store prefetch redirects in the prefetch cache and use them when
navigating.

* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::retrieveCacheEntry):
(WebKit::NetworkResourceLoader::willSendRedirectedRequest):
(WebKit::NetworkResourceLoader::didFinishWithRedirectResponse):
* NetworkProcess/NetworkResourceLoader.h:
* NetworkProcess/cache/PrefetchCache.cpp:
(WebKit::PrefetchCache::Entry::Entry):
(WebKit::PrefetchCache::storeRedirect):
* NetworkProcess/cache/PrefetchCache.h:

LayoutTests:
Add tests for prefetch redirects
https://bugs.webkit.org/show_bug.cgi?id=197371

Patch by Rob Buis <[email protected]> on 2019-06-15
Reviewed by Youenn Fablet.

Add a test to verify prefetch redirections are cached in the prefetch
cache and reused when navigating.

* http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt: Added.
* http/wpt/prefetch/link-prefetch-main-resource-redirect.html: Added.
* http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py: Added.
(main):
* http/wpt/prefetch/resources/navigate.html: Added.
* http/wpt/prefetch/resources/prefetched-main-resource-redirect.py: Added.
(main):
* platform/mac-wk1/TestExpectations:
* platform/win/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (246465 => 246466)


--- trunk/LayoutTests/ChangeLog	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/LayoutTests/ChangeLog	2019-06-15 18:20:27 UTC (rev 246466)
@@ -1,3 +1,23 @@
+2019-06-15  Rob Buis  <[email protected]>
+
+        Add tests for prefetch redirects
+        https://bugs.webkit.org/show_bug.cgi?id=197371
+
+        Reviewed by Youenn Fablet.
+
+        Add a test to verify prefetch redirections are cached in the prefetch
+        cache and reused when navigating.
+
+        * http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt: Added.
+        * http/wpt/prefetch/link-prefetch-main-resource-redirect.html: Added.
+        * http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py: Added.
+        (main):
+        * http/wpt/prefetch/resources/navigate.html: Added.
+        * http/wpt/prefetch/resources/prefetched-main-resource-redirect.py: Added.
+        (main):
+        * platform/mac-wk1/TestExpectations:
+        * platform/win/TestExpectations:
+
 2019-06-15  Saam Barati  <[email protected]>
 
         Unreviewed. Temporarily mark webgpu/whlsl-oob-access.html as flaky.

Added: trunk/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt (0 => 246466)


--- trunk/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt	2019-06-15 18:20:27 UTC (rev 246466)
@@ -0,0 +1,3 @@
+
+PASS Test navigating to prefetched redirects. 
+

Added: trunk/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html (0 => 246466)


--- trunk/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html	2019-06-15 18:20:27 UTC (rev 246466)
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src=""
+<script src=""
+<script>
+
+const wait_for_message = () => {
+  return new Promise((resolve, reject) => {
+    window.addEventListener('message', e => {
+      resolve(e);
+    }, { once: true });
+  });
+};
+
+promise_test(async function(t) {
+  let url_from = "resources/navigate.html";
+  var w = window.open(url_from);
+  let message = await wait_for_message();
+  assert_equals(message.data, '');
+  w.close();
+}, 'Test navigating to prefetched redirects.');
+</script>

Added: trunk/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py (0 => 246466)


--- trunk/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py	2019-06-15 18:20:27 UTC (rev 246466)
@@ -0,0 +1,11 @@
+def main(request, response):
+    headers = [("Content-Type", "text/html")]
+
+    document = """
+<!DOCTYPE html>
+<script>
+  window.opener.postMessage('{result}', '*');
+</script>
+""".format(result=request.headers.get("Purpose", ""))
+
+    return headers, document

Added: trunk/LayoutTests/http/wpt/prefetch/resources/navigate.html (0 => 246466)


--- trunk/LayoutTests/http/wpt/prefetch/resources/navigate.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/prefetch/resources/navigate.html	2019-06-15 18:20:27 UTC (rev 246466)
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src=""
+<body>
+<script>
+  var link = document.createElement("link");
+  link.rel = "prefetch";
+  link.href = "" + "/WebKit/prefetch/resources/prefetched-main-resource-redirect.py";
+  link._onload_ = function() {
+    window.location = get_host_info().HTTP_REMOTE_ORIGIN + "/WebKit/prefetch/resources/prefetched-main-resource-redirect.py";
+  };
+  document.body.appendChild(link);
+</script>
+</body>

Added: trunk/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py (0 => 246466)


--- trunk/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py	2019-06-15 18:20:27 UTC (rev 246466)
@@ -0,0 +1,5 @@
+def main(request, response):
+    if "prefetch" in request.headers.get("Purpose"):
+        headers = [("Cache-Control", "max-age=3600"), ("Location", "/WebKit/prefetch/resources/main-resource-redirect-no-prefetch.py")]
+        return 302, headers, ""
+    return 200, [], "FAIL"

Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (246465 => 246466)


--- trunk/LayoutTests/platform/mac-wk1/TestExpectations	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations	2019-06-15 18:20:27 UTC (rev 246466)
@@ -733,6 +733,8 @@
 webkit.org/b/195623 http/tests/cache/link-prefetch-main-resource.html [ Skip ]
 webkit.org/b/195623 http/tests/cache/link-prefetch-main-resource-iframe.html [ Skip ]
 
+webkit.org/b/197371 http/wpt/prefetch/link-prefetch-main-resource-redirect.html [ Skip ]
+
 webkit.org/b/198177 pointerevents/mouse/compatibility-mouse-events-prevention-mouse-pressed.html [ Skip ]
 
 webkit.org/b/198459 [ HighSierra Debug ] inspector/canvas/recording-2d-full.html [ Slow ]

Modified: trunk/LayoutTests/platform/win/TestExpectations (246465 => 246466)


--- trunk/LayoutTests/platform/win/TestExpectations	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/LayoutTests/platform/win/TestExpectations	2019-06-15 18:20:27 UTC (rev 246466)
@@ -4416,6 +4416,8 @@
 webkit.org/b/195623 http/tests/cache/link-prefetch-main-resource.html [ Skip ]
 webkit.org/b/195623 http/tests/cache/link-prefetch-main-resource-iframe.html [ Skip ]
 
+webkit.org/b/197371 http/wpt/prefetch/link-prefetch-main-resource-redirect.html [ Skip ]
+
 webkit.org/b/198112 http/tests/security/showModalDialog-sync-cross-origin-page-load2.html [ Skip ]
 
 webkit.org/b/198679 fast/events/fire-mousedown-while-pressing-mouse-button.html [ Failure ]

Modified: trunk/Source/WebCore/ChangeLog (246465 => 246466)


--- trunk/Source/WebCore/ChangeLog	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebCore/ChangeLog	2019-06-15 18:20:27 UTC (rev 246466)
@@ -1,3 +1,18 @@
+2019-06-15  Rob Buis  <[email protected]>
+
+        Add tests for prefetch redirects
+        https://bugs.webkit.org/show_bug.cgi?id=197371
+
+        Reviewed by Youenn Fablet.
+
+        Test: http/wpt/prefetch/link-prefetch-main-resource-redirect.html
+
+        Allow clearing of the Purpose request header field.
+
+        * platform/network/ResourceRequestBase.cpp:
+        (WebCore::ResourceRequestBase::clearPurpose):
+        * platform/network/ResourceRequestBase.h:
+
 2019-06-15  Zalan Bujtas  <[email protected]>
 
         [LFC][MarginCollapsing] Remove redundant checks in MarginCollapse::marginBefore/AfterCollapsesWith*

Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp (246465 => 246466)


--- trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp	2019-06-15 18:20:27 UTC (rev 246466)
@@ -357,6 +357,15 @@
     m_platformRequestUpdated = false;
 }
 
+void ResourceRequestBase::clearPurpose()
+{
+    updateResourceRequest();
+
+    m_httpHeaderFields.remove(HTTPHeaderName::Purpose);
+
+    m_platformRequestUpdated = false;
+}
+
 String ResourceRequestBase::httpReferrer() const
 {
     return httpHeaderField(HTTPHeaderName::Referer);

Modified: trunk/Source/WebCore/platform/network/ResourceRequestBase.h (246465 => 246466)


--- trunk/Source/WebCore/platform/network/ResourceRequestBase.h	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebCore/platform/network/ResourceRequestBase.h	2019-06-15 18:20:27 UTC (rev 246466)
@@ -140,6 +140,8 @@
 
     void clearHTTPAcceptEncoding();
 
+    WEBCORE_EXPORT void clearPurpose();
+
     const Vector<String>& responseContentDispositionEncodingFallbackArray() const { return m_responseContentDispositionEncodingFallbackArray; }
     WEBCORE_EXPORT void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String());
 

Modified: trunk/Source/WebKit/ChangeLog (246465 => 246466)


--- trunk/Source/WebKit/ChangeLog	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebKit/ChangeLog	2019-06-15 18:20:27 UTC (rev 246466)
@@ -1,3 +1,23 @@
+2019-06-15  Rob Buis  <[email protected]>
+
+        Store prefetch redirects in the prefetch cache
+        https://bugs.webkit.org/show_bug.cgi?id=197371
+
+        Reviewed by Youenn Fablet.
+
+        Store prefetch redirects in the prefetch cache and use them when
+        navigating.
+
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::NetworkResourceLoader::retrieveCacheEntry):
+        (WebKit::NetworkResourceLoader::willSendRedirectedRequest):
+        (WebKit::NetworkResourceLoader::didFinishWithRedirectResponse):
+        * NetworkProcess/NetworkResourceLoader.h:
+        * NetworkProcess/cache/PrefetchCache.cpp:
+        (WebKit::PrefetchCache::Entry::Entry):
+        (WebKit::PrefetchCache::storeRedirect):
+        * NetworkProcess/cache/PrefetchCache.h:
+
 2019-06-14  Devin Rousso  <[email protected]>
 
         waitForNavigationToComplete may be called before WebPageProxy knows it's loading

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (246465 => 246466)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2019-06-15 18:20:27 UTC (rev 246466)
@@ -214,8 +214,13 @@
     if (isMainFrameLoad()) {
         ASSERT(m_parameters.options.mode == FetchOptions::Mode::Navigate);
         if (auto session = m_connection->networkProcess().networkSession(sessionID())) {
-            if (auto entry = session->prefetchCache().take(request.url()))
-                m_cache->store(request, entry->response, entry->releaseBuffer(), nullptr);
+            if (auto entry = session->prefetchCache().take(request.url())) {
+                if (!entry->redirectRequest.isNull()) {
+                    auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, entry->redirectRequest, entry->response);
+                    m_cache->storeRedirect(request, entry->response, entry->redirectRequest, maxAgeCap);
+                } else
+                    m_cache->store(request, entry->response, entry->releaseBuffer(), nullptr);
+            }
         }
     }
     m_cache->retrieve(request, { m_parameters.webPageID, m_parameters.webFrameID }, [this, loader = WTFMove(loader), request = ResourceRequest { request }](auto entry, auto info) mutable {
@@ -640,7 +645,7 @@
             }
 
             if (m_parameters.options.redirect == FetchOptions::Redirect::Manual) {
-                this->didFinishWithRedirectResponse(WTFMove(result->redirectResponse));
+                this->didFinishWithRedirectResponse(WTFMove(result->request), WTFMove(result->redirectRequest), WTFMove(result->redirectResponse));
                 return;
             }
 
@@ -681,10 +686,13 @@
     send(Messages::WebResourceLoader::WillSendRequest(redirectRequest, sanitizeResponseIfPossible(WTFMove(redirectResponse), ResourceResponse::SanitizationType::Redirection)));
 }
 
-void NetworkResourceLoader::didFinishWithRedirectResponse(ResourceResponse&& redirectResponse)
+void NetworkResourceLoader::didFinishWithRedirectResponse(WebCore::ResourceRequest&& request, WebCore::ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
 {
     redirectResponse.setType(ResourceResponse::Type::Opaqueredirect);
-    didReceiveResponse(WTFMove(redirectResponse), [] (auto) { });
+    if (!isCrossOriginPrefetch())
+        didReceiveResponse(WTFMove(redirectResponse), [] (auto) { });
+    else if (auto session = m_connection->networkProcess().networkSession(sessionID()))
+        session->prefetchCache().storeRedirect(m_networkLoad->currentRequest().url(), WTFMove(redirectResponse), WTFMove(redirectRequest));
 
     WebCore::NetworkLoadMetrics networkLoadMetrics;
     networkLoadMetrics.markComplete();

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h (246465 => 246466)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h	2019-06-15 18:20:27 UTC (rev 246466)
@@ -164,7 +164,7 @@
 #endif
 
     void continueWillSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&, Optional<WebCore::AdClickAttribution::Conversion>&&);
-    void didFinishWithRedirectResponse(WebCore::ResourceResponse&&);
+    void didFinishWithRedirectResponse(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&);
     WebCore::ResourceResponse sanitizeResponseIfPossible(WebCore::ResourceResponse&&, WebCore::ResourceResponse::SanitizationType);
 
     // ContentSecurityPolicyClient

Modified: trunk/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp (246465 => 246466)


--- trunk/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp	2019-06-15 18:20:27 UTC (rev 246466)
@@ -35,6 +35,11 @@
 {
 }
 
+PrefetchCache::Entry::Entry(WebCore::ResourceResponse&& redirectResponse, WebCore::ResourceRequest&& redirectRequest)
+    : response(WTFMove(redirectResponse)), redirectRequest(WTFMove(redirectRequest))
+{
+}
+
 PrefetchCache::PrefetchCache()
     : m_expirationTimer(*this, &PrefetchCache::clearExpiredEntries)
 {
@@ -78,6 +83,17 @@
         m_expirationTimer.startOneShot(expirationTimeout);
 }
 
+void PrefetchCache::storeRedirect(const URL& requestUrl, WebCore::ResourceResponse&& redirectResponse, WebCore::ResourceRequest&& redirectRequest)
+{
+    if (!m_sessionPrefetches)
+        m_sessionPrefetches = std::make_unique<PrefetchEntriesMap>();
+    redirectRequest.clearPurpose();
+    m_sessionPrefetches->set(requestUrl, std::make_unique<PrefetchCache::Entry>(WTFMove(redirectResponse), WTFMove(redirectRequest)));
+    m_sessionExpirationList.append(std::make_tuple(requestUrl, WallTime::now()));
+    if (!m_expirationTimer.isActive())
+        m_expirationTimer.startOneShot(expirationTimeout);
+}
+
 void PrefetchCache::clearExpiredEntries()
 {
     URL requestUrl;

Modified: trunk/Source/WebKit/NetworkProcess/cache/PrefetchCache.h (246465 => 246466)


--- trunk/Source/WebKit/NetworkProcess/cache/PrefetchCache.h	2019-06-15 17:42:48 UTC (rev 246465)
+++ trunk/Source/WebKit/NetworkProcess/cache/PrefetchCache.h	2019-06-15 18:20:27 UTC (rev 246466)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include <WebCore/ResourceRequest.h>
 #include <WebCore/ResourceResponse.h>
 #include <WebCore/SharedBuffer.h>
 #include <WebCore/Timer.h>
@@ -46,15 +47,18 @@
 
     struct Entry {
         Entry(WebCore::ResourceResponse&&, RefPtr<WebCore::SharedBuffer>&&);
+        Entry(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&);
 
         Ref<WebCore::SharedBuffer> releaseBuffer() { return buffer.releaseNonNull(); }
 
         WebCore::ResourceResponse response;
         RefPtr<WebCore::SharedBuffer> buffer;
+        WebCore::ResourceRequest redirectRequest;
     };
 
     std::unique_ptr<Entry> take(const URL&);
     void store(const URL&, WebCore::ResourceResponse&&, RefPtr<WebCore::SharedBuffer>&&);
+    void storeRedirect(const URL&, WebCore::ResourceResponse&&, WebCore::ResourceRequest&&);
 
 private:
     void clearExpiredEntries();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to