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();