Title: [256912] trunk/Source/WebKit
Revision
256912
Author
[email protected]
Date
2020-02-18 22:44:31 -0800 (Tue, 18 Feb 2020)

Log Message

Set User-Agent in preconnect requests
https://bugs.webkit.org/show_bug.cgi?id=207777

Patch by Ben Nham <[email protected]> on 2020-02-18
Reviewed by Chris Dumez.

When using an HTTPS proxy, CFNetwork will not reuse a preconnected socket if the User-Agent
on the preconnect request doesn't match the User-Agent of the actual request
(<rdar://problem/59434166>). To work around this, this sets the User-Agent on preconnect
requests.

In addition, this patch moves the preconnect request from WebPage::loadRequest in the
WebProcess to WebPageProxy::loadRequest in the UIProcess. This is because there can be
long sync IPCs that last >100 ms that occur before WebProcess::loadRequest even starts,
e.g. https://bugs.webkit.org/show_bug.cgi?id=203165.

By making both changes, we see a ~2% improvement in PLT5 times.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::preconnectTo):
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::preconnectTo):
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::loadRequestWithNavigationShared):
(WebKit::WebPageProxy::preconnectTo):
* UIProcess/WebPageProxy.h:
* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::preconnectTo):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::loadRequest):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (256911 => 256912)


--- trunk/Source/WebKit/ChangeLog	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/ChangeLog	2020-02-19 06:44:31 UTC (rev 256912)
@@ -1,3 +1,38 @@
+2020-02-18  Ben Nham  <[email protected]>
+
+        Set User-Agent in preconnect requests
+        https://bugs.webkit.org/show_bug.cgi?id=207777
+
+        Reviewed by Chris Dumez.
+
+        When using an HTTPS proxy, CFNetwork will not reuse a preconnected socket if the User-Agent
+        on the preconnect request doesn't match the User-Agent of the actual request
+        (<rdar://problem/59434166>). To work around this, this sets the User-Agent on preconnect
+        requests.
+
+        In addition, this patch moves the preconnect request from WebPage::loadRequest in the
+        WebProcess to WebPageProxy::loadRequest in the UIProcess. This is because there can be
+        long sync IPCs that last >100 ms that occur before WebProcess::loadRequest even starts,
+        e.g. https://bugs.webkit.org/show_bug.cgi?id=203165.
+
+        By making both changes, we see a ~2% improvement in PLT5 times.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::preconnectTo):
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.messages.in:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::preconnectTo):
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::loadRequestWithNavigationShared):
+        (WebKit::WebPageProxy::preconnectTo):
+        * UIProcess/WebPageProxy.h:
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::preconnectTo):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::loadRequest):
+
 2020-02-18  Lauro Moura  <[email protected]>
 
         [WebKit] Avoid segfault if editor client is null

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (256911 => 256912)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-02-19 06:44:31 UTC (rev 256912)
@@ -79,6 +79,7 @@
 #include <WebCore/ResourceRequest.h>
 #include <WebCore/RuntimeApplicationChecks.h>
 #include <WebCore/RuntimeEnabledFeatures.h>
+#include <WebCore/SecurityOrigin.h>
 #include <WebCore/SecurityOriginData.h>
 #include <WebCore/StorageQuotaManager.h>
 #include <wtf/Algorithms.h>
@@ -1300,6 +1301,27 @@
 }
 #endif // ENABLE(RESOURCE_LOAD_STATISTICS)
 
+void NetworkProcess::preconnectTo(PAL::SessionID sessionID, const URL& url, const String& userAgent, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
+{
+#if ENABLE(SERVER_PRECONNECT)
+    NetworkLoadParameters parameters;
+    parameters.request = ResourceRequest { url };
+    if (!userAgent.isEmpty()) {
+        // FIXME: we add user-agent to the preconnect request because otherwise the preconnect
+        // gets thrown away by CFNetwork when using an HTTPS proxy (<rdar://problem/59434166>).
+        parameters.request.setHTTPUserAgent(userAgent);
+    }
+    parameters.storedCredentialsPolicy = storedCredentialsPolicy;
+    parameters.shouldPreconnectOnly = PreconnectOnly::Yes;
+
+    new PreconnectTask(*this, sessionID, WTFMove(parameters), [](const WebCore::ResourceError&) { });
+#else
+    UNUSED_PARAM(url);
+    UNUSED_PARAM(userAgent);
+    UNUSED_PARAM(storedCredentialsPolicy);
+#endif
+}
+
 bool NetworkProcess::sessionIsControlledByAutomation(PAL::SessionID sessionID) const
 {
     return m_sessionsControlledByAutomation.contains(sessionID);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (256911 => 256912)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-02-19 06:44:31 UTC (rev 256912)
@@ -268,6 +268,8 @@
     using CacheStorageRootPathCallback = CompletionHandler<void(String&&)>;
     void cacheStorageRootPath(PAL::SessionID, CacheStorageRootPathCallback&&);
 
+    void preconnectTo(PAL::SessionID, const URL&, const String&, WebCore::StoredCredentialsPolicy);
+
     void setSessionIsControlledByAutomation(PAL::SessionID, bool);
     bool sessionIsControlledByAutomation(PAL::SessionID) const;
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (256911 => 256912)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-02-19 06:44:31 UTC (rev 256912)
@@ -80,6 +80,8 @@
     PrepareToSuspend(bool isSuspensionImminent) -> () Async
     ProcessDidResume()
 
+    PreconnectTo(PAL::SessionID sessionID, URL url, String userAgent, enum:uint8_t WebCore::StoredCredentialsPolicy storedCredentialsPolicy);
+
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
     ClearPrevalentResource(PAL::SessionID sessionID, WebCore::RegistrableDomain resourceDomain) -> () Async
     ClearUserInteraction(PAL::SessionID sessionID, WebCore::RegistrableDomain resourceDomain) -> () Async

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (256911 => 256912)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-02-19 06:44:31 UTC (rev 256912)
@@ -1416,6 +1416,13 @@
     sendWithAsyncReply(Messages::NetworkProcess::GetLocalStorageOriginDetails(sessionID), WTFMove(completionHandler));
 }
 
+void NetworkProcessProxy::preconnectTo(PAL::SessionID sessionID, const URL& url, const String& userAgent, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
+{
+    if (!url.isValid() || !url.protocolIsInHTTPFamily() || SecurityOrigin::isLocalHostOrLoopbackIPAddress(url.host()))
+        return;
+    send(Messages::NetworkProcess::PreconnectTo(sessionID, url, userAgent, storedCredentialsPolicy), 0);
+}
+
 void NetworkProcessProxy::updateProcessAssertion()
 {
     if (processPool().hasForegroundWebProcesses()) {

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (256911 => 256912)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-02-19 06:44:31 UTC (rev 256912)
@@ -54,6 +54,7 @@
 enum class ShouldSample : bool;
 enum class StorageAccessPromptWasShown : bool;
 enum class StorageAccessWasGranted : bool;
+enum class StoredCredentialsPolicy : uint8_t;
 class SecurityOrigin;
 struct SecurityOriginData;
 struct ClientOrigin;
@@ -105,6 +106,8 @@
 
     void getLocalStorageDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
 
+    void preconnectTo(PAL::SessionID, const URL&, const String&, WebCore::StoredCredentialsPolicy);
+
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
     void clearPrevalentResource(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void()>&&);
     void clearUserInteraction(PAL::SessionID, const RegistrableDomain&, CompletionHandler<void()>&&);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (256911 => 256912)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-02-19 06:44:31 UTC (rev 256912)
@@ -169,6 +169,7 @@
 #include <WebCore/ShareData.h>
 #include <WebCore/SharedBuffer.h>
 #include <WebCore/ShouldTreatAsContinuingLoad.h>
+#include <WebCore/StoredCredentialsPolicy.h>
 #include <WebCore/TextCheckerClient.h>
 #include <WebCore/TextIndicator.h>
 #include <WebCore/ValidationBubble.h>
@@ -1293,6 +1294,8 @@
 
     addPlatformLoadParameters(loadParameters);
 
+    preconnectTo(url);
+
 #if HAVE(SANDBOX_ISSUE_READ_EXTENSION_TO_PROCESS_BY_AUDIT_TOKEN)
     if (!process->isLaunching() || !url.isLocalFile())
         process->send(Messages::WebPage::LoadRequest(loadParameters), webPageID);
@@ -4228,6 +4231,15 @@
     m_pageLoadState.setNetworkRequestsInProgress(transaction, networkRequestsInProgress);
 }
 
+void WebPageProxy::preconnectTo(const URL& url)
+{
+    if (!m_websiteDataStore->configuration().allowsServerPreconnect())
+        return;
+
+    if (auto* networkProcess = m_process->processPool().networkProcess())
+        networkProcess->preconnectTo(sessionID(), url, userAgent(), WebCore::StoredCredentialsPolicy::Use);
+}
+
 void WebPageProxy::hasInsecureContent(CompletionHandler<void(WebCore::HasInsecureContent, WebCore::UsedLegacyTLS)>&& completionHandler)
 {
     completionHandler(

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (256911 => 256912)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2020-02-19 06:44:31 UTC (rev 256912)
@@ -1770,6 +1770,8 @@
     void didFinishProgress();
     void setNetworkRequestsInProgress(bool);
 
+    void preconnectTo(const URL&);
+
     void hasInsecureContent(CompletionHandler<void(WebCore::HasInsecureContent, WebCore::UsedLegacyTLS)>&&);
 
     void didDestroyNavigation(uint64_t navigationID);

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (256911 => 256912)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2020-02-19 06:44:31 UTC (rev 256912)
@@ -724,6 +724,13 @@
 
     NetworkResourceLoadParameters parameters;
     parameters.request = WTFMove(request);
+    if (parameters.request.httpUserAgent().isEmpty()) {
+        // FIXME: we add user-agent to the preconnect request because otherwise the preconnect
+        // gets thrown away by CFNetwork when using an HTTPS proxy (<rdar://problem/59434166>).
+        String webPageUserAgent = webPage.userAgent(parameters.request.url());
+        if (!webPageUserAgent.isEmpty())
+            parameters.request.setHTTPUserAgent(webPageUserAgent);
+    }
     parameters.webPageProxyID = webPage.webPageProxyIdentifier();
     parameters.webPageID = webPage.identifier();
     parameters.webFrameID = webFrame.frameID();

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (256911 => 256912)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-02-19 05:42:37 UTC (rev 256911)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-02-19 06:44:31 UTC (rev 256912)
@@ -1572,11 +1572,6 @@
 {
     SendStopResponsivenessTimer stopper;
 
-    if (loadParameters.request.url().protocolIsInHTTPFamily() && !SecurityOrigin::isLocalHostOrLoopbackIPAddress(loadParameters.request.url().host())) {
-        ResourceRequest urlOnlyPreconnectRequest { loadParameters.request.url() };
-        WebProcess::singleton().webLoaderStrategy().preconnectTo(WTFMove(urlOnlyPreconnectRequest), *this, *m_mainFrame, StoredCredentialsPolicy::Use);
-    }
-
     m_pendingNavigationID = loadParameters.navigationID;
     m_pendingWebsitePolicies = WTFMove(loadParameters.websitePolicies);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to