Title: [285224] trunk/Source
Revision
285224
Author
cdu...@apple.com
Date
2021-11-03 13:24:42 -0700 (Wed, 03 Nov 2021)

Log Message

Clicking a link should preconnect to destination as first party
https://bugs.webkit.org/show_bug.cgi?id=232668

Reviewed by Alex Christensen.

Clicking a link should preconnect to destination as first party, not third-party. Otherwise, the
preconnect is wasted when session isolation based on registrable domain is enabled. This is a
follow-up to r284730.

Source/WebCore:

* html/HTMLAnchorElement.cpp:
(WebCore::HTMLAnchorElement::handleClick):
* loader/LinkLoader.cpp:
(WebCore::LinkLoader::preconnectIfNeeded):
* loader/LoaderStrategy.h:

Source/WebKit:

* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::preconnectTo):
* WebProcess/Network/WebLoaderStrategy.h:

Source/WebKitLegacy:

* WebCoreSupport/WebResourceLoadScheduler.cpp:
(WebResourceLoadScheduler::preconnectTo):
* WebCoreSupport/WebResourceLoadScheduler.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285223 => 285224)


--- trunk/Source/WebCore/ChangeLog	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebCore/ChangeLog	2021-11-03 20:24:42 UTC (rev 285224)
@@ -1,3 +1,20 @@
+2021-11-03  Chris Dumez  <cdu...@apple.com>
+
+        Clicking a link should preconnect to destination as first party
+        https://bugs.webkit.org/show_bug.cgi?id=232668
+
+        Reviewed by Alex Christensen.
+
+        Clicking a link should preconnect to destination as first party, not third-party. Otherwise, the
+        preconnect is wasted when session isolation based on registrable domain is enabled. This is a
+        follow-up to r284730.
+
+        * html/HTMLAnchorElement.cpp:
+        (WebCore::HTMLAnchorElement::handleClick):
+        * loader/LinkLoader.cpp:
+        (WebCore::LinkLoader::preconnectIfNeeded):
+        * loader/LoaderStrategy.h:
+
 2021-11-03  Devin Rousso  <drou...@apple.com>
 
         [Modern Media Controls] should show tracks button/menu for <audio>

Modified: trunk/Source/WebCore/html/HTMLAnchorElement.cpp (285223 => 285224)


--- trunk/Source/WebCore/html/HTMLAnchorElement.cpp	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebCore/html/HTMLAnchorElement.cpp	2021-11-03 20:24:42 UTC (rev 285224)
@@ -541,9 +541,9 @@
     sendPings(completedURL);
 
     // Preconnect to the link's target for improved page load time.
-    if (completedURL.protocolIsInHTTPFamily()) {
+    if (completedURL.protocolIsInHTTPFamily() && ((frame->isMainFrame() && isSelfTargetFrameName(effectiveTarget)) || isBlankTargetFrameName(effectiveTarget))) {
         auto storageCredentialsPolicy = frame->page() && frame->page()->canUseCredentialStorage() ? StoredCredentialsPolicy::Use : StoredCredentialsPolicy::DoNotUse;
-        platformStrategies()->loaderStrategy()->preconnectTo(frame->loader(), completedURL, storageCredentialsPolicy, nullptr);
+        platformStrategies()->loaderStrategy()->preconnectTo(frame->loader(), completedURL, storageCredentialsPolicy, LoaderStrategy::ShouldPreconnectAsFirstParty::Yes, nullptr);
     }
 }
 

Modified: trunk/Source/WebCore/loader/LinkLoader.cpp (285223 => 285224)


--- trunk/Source/WebCore/loader/LinkLoader.cpp	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebCore/loader/LinkLoader.cpp	2021-11-03 20:24:42 UTC (rev 285224)
@@ -217,7 +217,7 @@
     if (equalIgnoringASCIICase(params.crossOrigin, "anonymous") && document.securityOrigin().isSameOriginDomain(SecurityOrigin::create(href)))
         storageCredentialsPolicy = StoredCredentialsPolicy::DoNotUse;
     ASSERT(document.frame()->loader().networkingContext());
-    platformStrategies()->loaderStrategy()->preconnectTo(document.frame()->loader(), href, storageCredentialsPolicy, [weakDocument = WeakPtr { document }, href](ResourceError error) {
+    platformStrategies()->loaderStrategy()->preconnectTo(document.frame()->loader(), href, storageCredentialsPolicy, LoaderStrategy::ShouldPreconnectAsFirstParty::No, [weakDocument = WeakPtr { document }, href](ResourceError error) {
         if (!weakDocument)
             return;
 

Modified: trunk/Source/WebCore/loader/LoaderStrategy.h (285223 => 285224)


--- trunk/Source/WebCore/loader/LoaderStrategy.h	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebCore/loader/LoaderStrategy.h	2021-11-03 20:24:42 UTC (rev 285224)
@@ -79,7 +79,8 @@
     virtual void startPingLoad(Frame&, ResourceRequest&, const HTTPHeaderMap& originalRequestHeaders, const FetchOptions&, ContentSecurityPolicyImposition, PingLoadCompletionHandler&& = { }) = 0;
 
     using PreconnectCompletionHandler = Function<void(const ResourceError&)>;
-    virtual void preconnectTo(FrameLoader&, const URL&, StoredCredentialsPolicy, PreconnectCompletionHandler&&) = 0;
+    enum class ShouldPreconnectAsFirstParty : bool { No, Yes };
+    virtual void preconnectTo(FrameLoader&, const URL&, StoredCredentialsPolicy, ShouldPreconnectAsFirstParty, PreconnectCompletionHandler&&) = 0;
 
     virtual void setCaptureExtraNetworkLoadMetricsEnabled(bool) = 0;
 

Modified: trunk/Source/WebKit/ChangeLog (285223 => 285224)


--- trunk/Source/WebKit/ChangeLog	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebKit/ChangeLog	2021-11-03 20:24:42 UTC (rev 285224)
@@ -1,3 +1,18 @@
+2021-11-03  Chris Dumez  <cdu...@apple.com>
+
+        Clicking a link should preconnect to destination as first party
+        https://bugs.webkit.org/show_bug.cgi?id=232668
+
+        Reviewed by Alex Christensen.
+
+        Clicking a link should preconnect to destination as first party, not third-party. Otherwise, the
+        preconnect is wasted when session isolation based on registrable domain is enabled. This is a
+        follow-up to r284730.
+
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::preconnectTo):
+        * WebProcess/Network/WebLoaderStrategy.h:
+
 2021-11-03  Jer Noble  <jer.no...@apple.com>
 
         [Catalina] HLS streams will not select HDR variants when GPU Process is enabled

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (285223 => 285224)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2021-11-03 20:24:42 UTC (rev 285224)
@@ -766,7 +766,7 @@
         completionHandler(WTFMove(error), WTFMove(response));
 }
 
-void WebLoaderStrategy::preconnectTo(FrameLoader& frameLoader, const URL& url, StoredCredentialsPolicy storedCredentialsPolicy, PreconnectCompletionHandler&& completionHandler)
+void WebLoaderStrategy::preconnectTo(FrameLoader& frameLoader, const URL& url, StoredCredentialsPolicy storedCredentialsPolicy, ShouldPreconnectAsFirstParty shouldPreconnectAsFirstParty, PreconnectCompletionHandler&& completionHandler)
 {
     auto* webFrameLoaderClient = toWebFrameLoaderClient(frameLoader.client());
     if (!webFrameLoaderClient) {
@@ -782,10 +782,10 @@
         return;
     }
 
-    preconnectTo(ResourceRequest { url }, *webPage, webFrame, storedCredentialsPolicy, WTFMove(completionHandler));
+    preconnectTo(ResourceRequest { url }, *webPage, webFrame, storedCredentialsPolicy, shouldPreconnectAsFirstParty, WTFMove(completionHandler));
 }
 
-void WebLoaderStrategy::preconnectTo(WebCore::ResourceRequest&& request, WebPage& webPage, WebFrame& webFrame, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, PreconnectCompletionHandler&& completionHandler)
+void WebLoaderStrategy::preconnectTo(WebCore::ResourceRequest&& request, WebPage& webPage, WebFrame& webFrame, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, ShouldPreconnectAsFirstParty shouldPreconnectAsFirstParty, PreconnectCompletionHandler&& completionHandler)
 {
     if (webPage.corePage() && !webPage.corePage()->allowsLoadFromURL(request.url(), MainFrameMainResource::No)) {
         if (completionHandler)
@@ -794,7 +794,10 @@
     }
 
     if (auto* document = webPage.mainFrame()->document()) {
-        request.setFirstPartyForCookies(document->firstPartyForCookies());
+        if (shouldPreconnectAsFirstParty == ShouldPreconnectAsFirstParty::Yes)
+            request.setFirstPartyForCookies(request.url());
+        else
+            request.setFirstPartyForCookies(document->firstPartyForCookies());
         if (auto* loader = document->loader())
             request.setIsAppInitiated(loader->lastNavigationWasAppInitiated());
     }

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h (285223 => 285224)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h	2021-11-03 20:24:42 UTC (rev 285224)
@@ -69,8 +69,8 @@
     void startPingLoad(WebCore::Frame&, WebCore::ResourceRequest&, const WebCore::HTTPHeaderMap& originalRequestHeaders, const WebCore::FetchOptions&, WebCore::ContentSecurityPolicyImposition, PingLoadCompletionHandler&&) final;
     void didFinishPingLoad(WebCore::ResourceLoaderIdentifier pingLoadIdentifier, WebCore::ResourceError&&, WebCore::ResourceResponse&&);
 
-    void preconnectTo(WebCore::ResourceRequest&&, WebPage&, WebFrame&, WebCore::StoredCredentialsPolicy, PreconnectCompletionHandler&& = nullptr);
-    void preconnectTo(WebCore::FrameLoader&, const URL&, WebCore::StoredCredentialsPolicy, PreconnectCompletionHandler&&) final;
+    void preconnectTo(WebCore::ResourceRequest&&, WebPage&, WebFrame&, WebCore::StoredCredentialsPolicy, ShouldPreconnectAsFirstParty, PreconnectCompletionHandler&& = nullptr);
+    void preconnectTo(WebCore::FrameLoader&, const URL&, WebCore::StoredCredentialsPolicy, ShouldPreconnectAsFirstParty, PreconnectCompletionHandler&&) final;
     void didFinishPreconnection(WebCore::ResourceLoaderIdentifier preconnectionIdentifier, WebCore::ResourceError&&);
 
     void setCaptureExtraNetworkLoadMetricsEnabled(bool) final;

Modified: trunk/Source/WebKitLegacy/ChangeLog (285223 => 285224)


--- trunk/Source/WebKitLegacy/ChangeLog	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebKitLegacy/ChangeLog	2021-11-03 20:24:42 UTC (rev 285224)
@@ -1,3 +1,18 @@
+2021-11-03  Chris Dumez  <cdu...@apple.com>
+
+        Clicking a link should preconnect to destination as first party
+        https://bugs.webkit.org/show_bug.cgi?id=232668
+
+        Reviewed by Alex Christensen.
+
+        Clicking a link should preconnect to destination as first party, not third-party. Otherwise, the
+        preconnect is wasted when session isolation based on registrable domain is enabled. This is a
+        follow-up to r284730.
+
+        * WebCoreSupport/WebResourceLoadScheduler.cpp:
+        (WebResourceLoadScheduler::preconnectTo):
+        * WebCoreSupport/WebResourceLoadScheduler.h:
+
 2021-10-29  Alex Christensen  <achristen...@webkit.org>
 
         Remove code inside ENABLE(NETSCAPE_PLUGIN_API)

Modified: trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp (285223 => 285224)


--- trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp	2021-11-03 20:24:42 UTC (rev 285224)
@@ -402,7 +402,7 @@
     NetworkStateNotifier::singleton().addListener(WTFMove(listener));
 }
 
-void WebResourceLoadScheduler::preconnectTo(FrameLoader&, const URL&, StoredCredentialsPolicy, PreconnectCompletionHandler&&)
+void WebResourceLoadScheduler::preconnectTo(FrameLoader&, const URL&, StoredCredentialsPolicy, ShouldPreconnectAsFirstParty, PreconnectCompletionHandler&&)
 {
 }
 

Modified: trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h (285223 => 285224)


--- trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h	2021-11-03 20:14:47 UTC (rev 285223)
+++ trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h	2021-11-03 20:24:42 UTC (rev 285224)
@@ -59,7 +59,7 @@
 
     void startPingLoad(WebCore::Frame&, WebCore::ResourceRequest&, const WebCore::HTTPHeaderMap&, const WebCore::FetchOptions&, WebCore::ContentSecurityPolicyImposition, PingLoadCompletionHandler&&) final;
 
-    void preconnectTo(WebCore::FrameLoader&, const URL&, WebCore::StoredCredentialsPolicy, PreconnectCompletionHandler&&) final;
+    void preconnectTo(WebCore::FrameLoader&, const URL&, WebCore::StoredCredentialsPolicy, ShouldPreconnectAsFirstParty, PreconnectCompletionHandler&&) final;
 
     void setCaptureExtraNetworkLoadMetricsEnabled(bool) final { }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to