WebKit Bugzilla
Attachment 371854 Details for
Bug 197371
: Store prefetch redirects in the prefetch cache
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-197371-20190611194502.patch (text/plain), 16.83 KB, created by
Rob Buis
on 2019-06-11 10:45:03 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Rob Buis
Created:
2019-06-11 10:45:03 PDT
Size:
16.83 KB
patch
obsolete
>Subversion Revision: 246249 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index fb5b50dea19d1d58f201b1c632e9e03b1cc9432c..aae5fd69b286d31273cbca7c8757a56746d44ee3 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,18 @@ >+2019-06-11 Rob Buis <rbuis@igalia.com> >+ >+ 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-09 Rob Buis <rbuis@igalia.com> > > Add wildcard to Access-Control-Allow-Methods and Access-Control-Allow-Headers >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index e968451353ad6905736a12176046f44199f99994..77e7f0574512851aca1684ff102d6e873b1ded3d 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,23 @@ >+2019-06-11 Rob Buis <rbuis@igalia.com> >+ >+ 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-09 Brent Fulgham <bfulgham@apple.com> > > [iOS] ResourceLoadStatistics state is not properly relayed to the NetworkProcess >diff --git a/Source/WebCore/platform/network/ResourceRequestBase.cpp b/Source/WebCore/platform/network/ResourceRequestBase.cpp >index 4dbc37e72717d9df46a3284511b9c2da8f223e6b..619f0847485c1c5a54f3e34c3e53a9fe0b51c404 100644 >--- a/Source/WebCore/platform/network/ResourceRequestBase.cpp >+++ b/Source/WebCore/platform/network/ResourceRequestBase.cpp >@@ -357,6 +357,15 @@ void ResourceRequestBase::clearHTTPContentType() > m_platformRequestUpdated = false; > } > >+void ResourceRequestBase::clearPurpose() >+{ >+ updateResourceRequest(); >+ >+ m_httpHeaderFields.remove(HTTPHeaderName::Purpose); >+ >+ m_platformRequestUpdated = false; >+} >+ > String ResourceRequestBase::httpReferrer() const > { > return httpHeaderField(HTTPHeaderName::Referer); >diff --git a/Source/WebCore/platform/network/ResourceRequestBase.h b/Source/WebCore/platform/network/ResourceRequestBase.h >index d98890879f6c3e101bbde2db7bdba845f0264597..dd446a890cdb9dcea7778b1bc28155af6fb6c079 100644 >--- a/Source/WebCore/platform/network/ResourceRequestBase.h >+++ b/Source/WebCore/platform/network/ResourceRequestBase.h >@@ -140,6 +140,8 @@ public: > > 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()); > >diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp b/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >index 0d4f9a2a1aea5c8800a5b13fe37e017bbdc49599..0b3c081ec8321f74d779dbd43d9c770202a89a80 100644 >--- a/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >@@ -214,8 +214,13 @@ void NetworkResourceLoader::retrieveCacheEntry(const ResourceRequest& request) > 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 @@ void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request, > } > > 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 @@ void NetworkResourceLoader::continueWillSendRedirectedRequest(ResourceRequest&& > 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(); >diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoader.h b/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >index a8f6d315798c4adfff99da7e82ffc833a967683e..4b4ce4f08f8b80aa79d81bba25f6e24987a624d2 100644 >--- a/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoader.h >@@ -164,7 +164,7 @@ private: > #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 >diff --git a/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp b/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp >index 0401fc98b416ce0a9acd095c3c3a23ea2a38fdbb..10977d06782da324ecb039cf8fbd7e93de1e25ef 100644 >--- a/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp >+++ b/Source/WebKit/NetworkProcess/cache/PrefetchCache.cpp >@@ -35,6 +35,11 @@ PrefetchCache::Entry::Entry(WebCore::ResourceResponse&& response, RefPtr<WebCore > { > } > >+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 @@ void PrefetchCache::store(const URL& requestUrl, WebCore::ResourceResponse&& res > 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; >diff --git a/Source/WebKit/NetworkProcess/cache/PrefetchCache.h b/Source/WebKit/NetworkProcess/cache/PrefetchCache.h >index c8895fe24b76f8d04adb638c73b1a1c84b2a9c40..a1710bae9e5a88526cefa3b39aa788faaf2cfa0e 100644 >--- a/Source/WebKit/NetworkProcess/cache/PrefetchCache.h >+++ b/Source/WebKit/NetworkProcess/cache/PrefetchCache.h >@@ -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 @@ public: > > 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(); >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 74e8b9e7e994f9d394b7b52853d074c087313e8a..4a94bb4c035f065305de982c9db17b7c15faead2 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,23 @@ >+2019-06-11 Rob Buis <rbuis@igalia.com> >+ >+ 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-08 Cathie Chen <cathiechen@igalia.com> > > resize-observer/element-leak.html fails on Windows platform >diff --git a/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..f61f4079086e31e563981d11b6e33b980c0bc13a >--- /dev/null >+++ b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Test navigating to prefetched redirects. >+ >diff --git a/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html >new file mode 100644 >index 0000000000000000000000000000000000000000..d6d5a5bc3a0a289d02ddf1f1d97bead219ca27da >--- /dev/null >+++ b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html >@@ -0,0 +1,22 @@ >+<!DOCTYPE html> >+<meta charset="utf-8"> >+<script src="/resources/testharness.js"></script> >+<script src="/resources/testharnessreport.js"></script> >+<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> >diff --git a/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py b/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py >new file mode 100644 >index 0000000000000000000000000000000000000000..daa362ff2ef2499624bf708b8b197ef8429e2132 >--- /dev/null >+++ b/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py >@@ -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 >diff --git a/LayoutTests/http/wpt/prefetch/resources/navigate.html b/LayoutTests/http/wpt/prefetch/resources/navigate.html >new file mode 100644 >index 0000000000000000000000000000000000000000..44d8bd1b27b07bb4741fbb1b87ae8a75304cebc5 >--- /dev/null >+++ b/LayoutTests/http/wpt/prefetch/resources/navigate.html >@@ -0,0 +1,14 @@ >+<!DOCTYPE html> >+<meta charset="utf-8"> >+<script src="/common/get-host-info.sub.js"></script> >+<body> >+<script> >+ var link = document.createElement("link"); >+ link.rel = "prefetch"; >+ link.href = get_host_info().HTTP_REMOTE_ORIGIN + "/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> >diff --git a/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py b/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py >new file mode 100644 >index 0000000000000000000000000000000000000000..4c54c17223982e326fd774348a69d7a0dedaaf48 >--- /dev/null >+++ b/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py >@@ -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" >diff --git a/LayoutTests/platform/mac-wk1/TestExpectations b/LayoutTests/platform/mac-wk1/TestExpectations >index 4804a70df89451b2c3d204479c00d40e5c4ecaf3..575ff99d2d1e6708cfe5b8598345cf6cd45c1e3b 100644 >--- a/LayoutTests/platform/mac-wk1/TestExpectations >+++ b/LayoutTests/platform/mac-wk1/TestExpectations >@@ -701,7 +701,9 @@ webkit.org/b/196915 [ Debug ] inspector/timeline/timeline-recording.html [ Pass > 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 ] >-webkit.org/b/198459 [ HighSierra Debug ] inspector/canvas/recording-webgl-full.html [ Slow ] >\ No newline at end of file >+webkit.org/b/198459 [ HighSierra Debug ] inspector/canvas/recording-webgl-full.html [ Slow ] >diff --git a/LayoutTests/platform/win/TestExpectations b/LayoutTests/platform/win/TestExpectations >index ae571b0255e327de553e5de237f5b16c362fb4f4..2b8da1280813e20d257ebee45396339853ba9652 100644 >--- a/LayoutTests/platform/win/TestExpectations >+++ b/LayoutTests/platform/win/TestExpectations >@@ -4400,6 +4400,8 @@ webkit.org/b/197310 fast/harness/render-tree-as-text-options.html [ Failure ] > 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 ]
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 197371
:
368556
|
368559
|
368560
|
368565
|
368566
|
368568
|
369382
|
369384
|
369386
|
369387
|
369388
|
369418
|
369504
|
369733
|
371728
|
371854
|
372194