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