Diff
Modified: trunk/Source/WebCore/ChangeLog (264020 => 264021)
--- trunk/Source/WebCore/ChangeLog 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/ChangeLog 2020-07-07 17:04:58 UTC (rev 264021)
@@ -1,3 +1,38 @@
+2020-07-07 Alex Christensen <[email protected]>
+
+ Add WebCoreNSURLSession SPI to send HTTP/2 ping
+ https://bugs.webkit.org/show_bug.cgi?id=214030
+ <rdar://problem/64495827>
+
+ Reviewed by Jer Noble.
+
+ Add lots of plumbing, move internalError from WebKit to WebCore.
+
+ Covered by an API test that requires some future CFNetwork behavior.
+
+ * Sources.txt:
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSDOMPromiseDeferred.h:
+ * loader/FrameLoaderClient.cpp: Added.
+ (WebCore::FrameLoaderClient::sendH2Ping):
+ * loader/FrameLoaderClient.h:
+ * loader/MediaResourceLoader.cpp:
+ (WebCore::MediaResourceLoader::sendH2Ping):
+ * loader/MediaResourceLoader.h:
+ * platform/graphics/PlatformMediaResourceLoader.cpp: Added.
+ (WebCore::PlatformMediaResourceLoader::sendH2Ping):
+ * platform/graphics/PlatformMediaResourceLoader.h:
+ * platform/network/ResourceErrorBase.cpp:
+ (WebCore::internalError):
+ * platform/network/ResourceErrorBase.h:
+ * platform/network/cocoa/WebCoreNSURLSession.h:
+ * platform/network/cocoa/WebCoreNSURLSession.mm:
+ (-[WebCoreNSURLSession sendH2Ping:pongHandler:]):
+ * testing/Internals.cpp:
+ (WebCore::Internals::sendH2Ping):
+ * testing/Internals.h:
+ * testing/Internals.idl:
+
2020-07-07 Tomoki Imai <[email protected]>
[Win] Implement Pasteboard::writeCustomData for Web Inspector Console tab
Modified: trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h (264020 => 264021)
--- trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -123,7 +123,7 @@
void reject(RejectAsHandled = RejectAsHandled::No);
void reject(std::nullptr_t, RejectAsHandled = RejectAsHandled::No);
- void reject(Exception, RejectAsHandled = RejectAsHandled::No);
+ WEBCORE_EXPORT void reject(Exception, RejectAsHandled = RejectAsHandled::No);
WEBCORE_EXPORT void reject(ExceptionCode, const String& = { }, RejectAsHandled = RejectAsHandled::No);
void reject(const JSC::PrivateName&, RejectAsHandled = RejectAsHandled::No);
Modified: trunk/Source/WebCore/loader/EmptyClients.cpp (264020 => 264021)
--- trunk/Source/WebCore/loader/EmptyClients.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/loader/EmptyClients.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -546,6 +546,12 @@
return EmptyFrameNetworkingContext::create();
}
+void EmptyFrameLoaderClient::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&& completionHandler)
+{
+ ASSERT_NOT_REACHED();
+ completionHandler(makeUnexpected(internalError(url)));
+}
+
void EmptyEditorClient::EmptyTextCheckerClient::requestCheckingOfString(TextCheckingRequest&, const VisibleSelection&)
{
}
Modified: trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h (264020 => 264021)
--- trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -196,6 +196,7 @@
bool isEmptyFrameLoaderClient() const final { return true; }
void prefetchDNS(const String&) final { }
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&&) final;
#if USE(QUICK_LOOK)
RefPtr<LegacyPreviewLoaderClient> createPreviewLoaderClient(const String&, const String&) final { return nullptr; }
Modified: trunk/Source/WebCore/loader/FrameLoaderClient.h (264020 => 264021)
--- trunk/Source/WebCore/loader/FrameLoaderClient.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/loader/FrameLoaderClient.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -34,7 +34,7 @@
#include "LayoutMilestone.h"
#include "LinkIcon.h"
#include "PageIdentifier.h"
-#include <functional>
+#include <wtf/Expected.h>
#include <wtf/Forward.h>
#include <wtf/WallTime.h>
#include <wtf/text/WTFString.h>
@@ -358,6 +358,7 @@
#endif
virtual void prefetchDNS(const String&) = 0;
+ virtual void sendH2Ping(const URL&, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&&) = 0;
virtual void didRestoreScrollPosition() { }
Modified: trunk/Source/WebCore/loader/MediaResourceLoader.cpp (264020 => 264021)
--- trunk/Source/WebCore/loader/MediaResourceLoader.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -68,6 +68,15 @@
m_mediaElement = nullptr;
}
+void MediaResourceLoader::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&& completionHandler)
+{
+ if (!m_document || !m_document->frame())
+ return completionHandler(makeUnexpected(internalError(url)));
+
+ m_document->frame()->loader().client().sendH2Ping(url, WTFMove(completionHandler));
+}
+
+
RefPtr<PlatformMediaResource> MediaResourceLoader::requestResource(ResourceRequest&& request, LoadOptions options)
{
if (!m_document)
Modified: trunk/Source/WebCore/loader/MediaResourceLoader.h (264020 => 264021)
--- trunk/Source/WebCore/loader/MediaResourceLoader.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -50,6 +50,7 @@
WEBCORE_EXPORT virtual ~MediaResourceLoader();
RefPtr<PlatformMediaResource> requestResource(ResourceRequest&&, LoadOptions) final;
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&&) final;
void removeResource(MediaResource&);
Document* document() { return m_document.get(); }
Modified: trunk/Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h (264020 => 264021)
--- trunk/Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/platform/graphics/PlatformMediaResourceLoader.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -29,6 +29,7 @@
#include "PolicyChecker.h"
#include <wtf/CompletionHandler.h>
+#include <wtf/Expected.h>
#include <wtf/Noncopyable.h>
#include <wtf/RefCounted.h>
#include <wtf/ThreadSafeRefCounted.h>
@@ -66,6 +67,7 @@
virtual ~PlatformMediaResourceLoader() = default;
virtual RefPtr<PlatformMediaResource> requestResource(ResourceRequest&&, LoadOptions) = 0;
+ virtual void sendH2Ping(const URL&, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&&) = 0;
protected:
PlatformMediaResourceLoader() = default;
Modified: trunk/Source/WebCore/platform/network/ResourceErrorBase.cpp (264020 => 264021)
--- trunk/Source/WebCore/platform/network/ResourceErrorBase.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/platform/network/ResourceErrorBase.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -27,6 +27,9 @@
#include "config.h"
#include "ResourceError.h"
+#include "LocalizedStrings.h"
+#include "Logging.h"
+
namespace WebCore {
const char* const errorDomainWebKitInternal = "WebKitInternal";
@@ -88,4 +91,12 @@
return ResourceError::platformCompare(a, b);
}
+ResourceError internalError(const URL& url)
+{
+ RELEASE_LOG_ERROR(Loading, "Internal error called");
+ RELEASE_LOG_STACKTRACE(Loading);
+
+ return ResourceError("WebKitErrorDomain"_s, 300, url, WEB_UI_STRING("WebKit encountered an internal error", "WebKitErrorInternal description"));
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/network/ResourceErrorBase.h (264020 => 264021)
--- trunk/Source/WebCore/platform/network/ResourceErrorBase.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/platform/network/ResourceErrorBase.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -96,6 +96,8 @@
const ResourceError& asResourceError() const;
};
+WEBCORE_EXPORT ResourceError internalError(const URL&);
+
inline bool operator==(const ResourceError& a, const ResourceError& b) { return ResourceErrorBase::compare(a, b); }
inline bool operator!=(const ResourceError& a, const ResourceError& b) { return !(a == b); }
Modified: trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.h (264020 => 264021)
--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -105,6 +105,10 @@
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL * location, NSURLResponse * response, NSError * error))completionHandler;
@end
+@interface WebCoreNSURLSession (WebKitAwesomeness)
+- (void)sendH2Ping:(NSURL *)url pongHandler:(void (^)(NSError * _Nullable error, NSTimeInterval interval))pongHandler;
+@end
+
@interface WebCoreNSURLSessionDataTask : NSObject {
__unsafe_unretained WebCoreNSURLSession *_session;
RefPtr<WebCore::PlatformMediaResource> _resource;
Modified: trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm (264020 => 264021)
--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm 2020-07-07 17:04:58 UTC (rev 264021)
@@ -466,6 +466,19 @@
return (NSURLSessionDataTask *)[task autorelease];
}
+- (void)sendH2Ping:(NSURL *)url pongHandler:(void (^)(NSError *error, NSTimeInterval interval))pongHandler
+{
+ if (_invalidated)
+ return pongHandler(adoptNS([[NSError alloc] initWithDomain:NSURLErrorDomain code:NSURLErrorUnknown userInfo:nil]).get(), 0);
+
+ self.loader.sendH2Ping(url, [pongHandler = makeBlockPtr(pongHandler)] (Expected<Seconds, ResourceError>&& result) {
+ if (result)
+ pongHandler(nil, result.value().value());
+ else
+ pongHandler(result.error(), 0);
+ });
+}
+
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL
{
UNUSED_PARAM(request);
Modified: trunk/Source/WebCore/testing/Internals.cpp (264020 => 264021)
--- trunk/Source/WebCore/testing/Internals.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/testing/Internals.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -5349,6 +5349,28 @@
#endif
}
+void Internals::sendH2Ping(String url, DOMPromiseDeferred<IDLDouble>&& promise)
+{
+ auto* document = contextDocument();
+ if (!document) {
+ promise.settle(InvalidStateError);
+ return;
+ }
+
+ auto* frame = document->frame();
+ if (!frame) {
+ promise.settle(InvalidStateError);
+ return;
+ }
+
+ frame->loader().client().sendH2Ping(URL(URL(), url), [promise = WTFMove(promise)] (Expected<Seconds, ResourceError>&& result) mutable {
+ if (result.has_value())
+ promise.resolve(result.value().value());
+ else
+ promise.settle(InvalidStateError);
+ });
+}
+
void Internals::clearCacheStorageMemoryRepresentation(DOMPromiseDeferred<void>&& promise)
{
auto* document = contextDocument();
Modified: trunk/Source/WebCore/testing/Internals.h (264020 => 264021)
--- trunk/Source/WebCore/testing/Internals.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/testing/Internals.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -802,6 +802,7 @@
bool audioSessionActive() const;
void storeRegistrationsOnDisk(DOMPromiseDeferred<void>&&);
+ void sendH2Ping(String url, DOMPromiseDeferred<IDLDouble>&&);
void clearCacheStorageMemoryRepresentation(DOMPromiseDeferred<void>&&);
void cacheStorageEngineRepresentation(DOMPromiseDeferred<IDLDOMString>&&);
Modified: trunk/Source/WebCore/testing/Internals.idl (264020 => 264021)
--- trunk/Source/WebCore/testing/Internals.idl 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebCore/testing/Internals.idl 2020-07-07 17:04:58 UTC (rev 264021)
@@ -811,6 +811,7 @@
readonly attribute long processIdentifier;
DOMString serviceWorkerClientIdentifier(Document document);
Promise<void> storeRegistrationsOnDisk();
+ Promise<double> sendH2Ping(DOMString url);
Promise<void> clearCacheStorageMemoryRepresentation();
Promise<DOMString> cacheStorageEngineRepresentation();
Modified: trunk/Source/WebKit/ChangeLog (264020 => 264021)
--- trunk/Source/WebKit/ChangeLog 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/ChangeLog 2020-07-07 17:04:58 UTC (rev 264021)
@@ -1,3 +1,63 @@
+2020-07-07 Alex Christensen <[email protected]>
+
+ Add WebCoreNSURLSession SPI to send HTTP/2 ping
+ https://bugs.webkit.org/show_bug.cgi?id=214030
+ <rdar://problem/64495827>
+
+ Reviewed by Jer Noble.
+
+ The SPI to do this through CFNetwork requires setting a block on the task
+ between construction and resumption. To allow this, I made PreconnectTask
+ and NetworkLoad require a start() call, and I added start() calls everywhere
+ they were implied with construction before.
+
+ * NetworkProcess/Downloads/PendingDownload.cpp:
+ (WebKit::PendingDownload::PendingDownload):
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::sendH2Ping):
+ (WebKit::NetworkConnectionToWebProcess::preconnectTo):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ * NetworkProcess/NetworkDataTask.cpp:
+ (WebKit::NetworkDataTask::setH2PingCallback):
+ * NetworkProcess/NetworkDataTask.h:
+ * NetworkProcess/NetworkLoad.cpp:
+ (WebKit::NetworkLoad::NetworkLoad):
+ (WebKit::NetworkLoad::start):
+ (WebKit::NetworkLoad::setH2PingCallback):
+ (WebKit::NetworkLoad::initialize): Deleted.
+ * NetworkProcess/NetworkLoad.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::preconnectTo):
+ * NetworkProcess/NetworkResourceLoader.cpp:
+ (WebKit::NetworkResourceLoader::startNetworkLoad):
+ * NetworkProcess/PreconnectTask.cpp:
+ (WebKit::PreconnectTask::setH2PingCallback):
+ (WebKit::PreconnectTask::start):
+ (WebKit::PreconnectTask::~PreconnectTask): Deleted.
+ * NetworkProcess/PreconnectTask.h:
+ * NetworkProcess/ServiceWorker/ServiceWorkerSoftUpdateLoader.cpp:
+ (WebKit::ServiceWorkerSoftUpdateLoader::loadFromNetwork):
+ * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:
+ (WebKit::NetworkCache::SpeculativeLoad::SpeculativeLoad):
+ * NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
+ (WebKit::NetworkCache::SpeculativeLoadManager::preconnectForSubresource):
+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
+ * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
+ (WebKit::NetworkDataTaskCocoa::setH2PingCallback):
+ * Shared/WebErrors.cpp:
+ (WebKit::internalError): Deleted.
+ * Shared/WebErrors.h:
+ * WebProcess/Network/WebLoaderStrategy.cpp:
+ (WebKit::WebLoaderStrategy::generateLoadIdentifier):
+ (WebKit::WebLoaderStrategy::startPingLoad):
+ (WebKit::WebLoaderStrategy::preconnectTo):
+ (WebKit::generateLoadIdentifier): Deleted.
+ * WebProcess/Network/WebLoaderStrategy.h:
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+ (WebKit::WebFrameLoaderClient::sendH2Ping):
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+
2020-07-07 Brady Eidson <[email protected]>
Forward declare WKContentWorld in WKUserScript.h
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp (264020 => 264021)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -238,6 +238,11 @@
return remoteMediaResource;
}
+void RemoteMediaPlayerProxy::sendH2Ping(const URL& url, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+ m_webProcessConnection->sendWithAsyncReply(Messages::MediaPlayerPrivateRemote::SendH2Ping(url), WTFMove(completionHandler), m_id);
+}
+
void RemoteMediaPlayerProxy::removeResource(RemoteMediaResourceIdentifier remoteMediaResourceIdentifier)
{
m_webProcessConnection->send(Messages::MediaPlayerPrivateRemote::RemoveResource(remoteMediaResourceIdentifier), m_id);
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h (264020 => 264021)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -181,6 +181,7 @@
void wouldTaintOrigin(struct WebCore::SecurityOriginData, CompletionHandler<void(Optional<bool>)>&&);
Ref<WebCore::PlatformMediaResource> requestResource(WebCore::ResourceRequest&&, WebCore::PlatformMediaResourceLoader::LoadOptions);
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
void removeResource(RemoteMediaResourceIdentifier);
RefPtr<WebCore::MediaPlayer> mediaPlayer() { return m_player; }
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.cpp (264020 => 264021)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -51,6 +51,14 @@
return m_remoteMediaPlayerProxy->requestResource(WTFMove(request), options);
}
+void RemoteMediaResourceLoader::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&& completionHandler)
+{
+ if (!m_remoteMediaPlayerProxy)
+ return completionHandler(makeUnexpected(internalError(url)));
+
+ m_remoteMediaPlayerProxy->sendH2Ping(url, WTFMove(completionHandler));
+}
+
} // namespace WebKit
#endif
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.h (264020 => 264021)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceLoader.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -43,6 +43,8 @@
private:
RefPtr<WebCore::PlatformMediaResource> requestResource(WebCore::ResourceRequest&&, LoadOptions) final;
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&) final;
+
WeakPtr<RemoteMediaPlayerProxy> m_remoteMediaPlayerProxy;
};
Modified: trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/Downloads/PendingDownload.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -40,6 +40,7 @@
: m_networkLoad(makeUnique<NetworkLoad>(*this, blobRegistry, WTFMove(parameters), networkSession))
, m_parentProcessConnection(parentProcessConnection)
{
+ m_networkLoad->start();
m_isAllowedToAskUserForCredentials = parameters.clientCredentialPolicy == ClientCredentialPolicy::MayAskClientForCredentials;
m_networkLoad->setPendingDownloadID(downloadID);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -65,6 +65,7 @@
#include <WebCore/DocumentStorageAccess.h>
#include <WebCore/HTTPCookieAcceptPolicy.h>
#include <WebCore/NetworkStorageSession.h>
+#include <WebCore/ResourceError.h>
#include <WebCore/ResourceLoadObserver.h>
#include <WebCore/ResourceLoadStatistics.h>
#include <WebCore/ResourceRequest.h>
@@ -542,6 +543,19 @@
m_networkProcess->prefetchDNS(hostname);
}
+void NetworkConnectionToWebProcess::sendH2Ping(NetworkResourceLoadParameters&& parameters, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&& completionHandler)
+{
+#if ENABLE(SERVER_PRECONNECT)
+ URL url = ""
+ auto* task = new PreconnectTask(networkProcess(), sessionID(), WTFMove(parameters), [] (const ResourceError&) { });
+ task->setH2PingCallback(url, WTFMove(completionHandler));
+ task->start();
+#else
+ ASSERT_NOT_REACHED();
+ completionHandler(makeUnexpected(internalError(parameters.request.url())));
+#endif
+}
+
void NetworkConnectionToWebProcess::preconnectTo(Optional<uint64_t> preconnectionIdentifier, NetworkResourceLoadParameters&& loadParameters)
{
RELEASE_LOG_IF_ALLOWED(Loading, "preconnectTo: (parentPID=%d, pageProxyID=%" PRIu64 ", webPageID=%" PRIu64 ", frameID=%" PRIu64 ", resourceID=%" PRIu64 ")", loadParameters.parentPID, loadParameters.webPageProxyID.toUInt64(), loadParameters.webPageID.toUInt64(), loadParameters.webFrameID.toUInt64(), loadParameters.identifier);
@@ -563,9 +577,9 @@
#if ENABLE(SERVER_PRECONNECT)
auto* session = networkSession();
if (session && session->allowsServerPreconnect()) {
- new PreconnectTask(networkProcess(), sessionID(), WTFMove(loadParameters), [completionHandler = WTFMove(completionHandler)] (const ResourceError& error) {
+ (new PreconnectTask(networkProcess(), sessionID(), WTFMove(loadParameters), [completionHandler = WTFMove(completionHandler)] (const ResourceError& error) {
completionHandler(error);
- });
+ }))->start();
return;
}
#endif
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -197,6 +197,7 @@
void testProcessIncomingSyncMessagesWhenWaitingForSyncReply(WebPageProxyIdentifier, Messages::NetworkConnectionToWebProcess::TestProcessIncomingSyncMessagesWhenWaitingForSyncReplyDelayedReply&&);
void loadPing(NetworkResourceLoadParameters&&);
void prefetchDNS(const String&);
+ void sendH2Ping(NetworkResourceLoadParameters&&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
void preconnectTo(Optional<uint64_t> preconnectionIdentifier, NetworkResourceLoadParameters&&);
void removeLoadIdentifier(ResourceLoadIdentifier);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2020-07-07 17:04:58 UTC (rev 264021)
@@ -30,6 +30,7 @@
PageLoadCompleted(WebCore::PageIdentifier webPageID)
BrowsingContextRemoved(WebKit::WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier webPageID, WebCore::FrameIdentifier webFrameID)
PrefetchDNS(String hostname)
+ SendH2Ping(WebKit::NetworkResourceLoadParameters parameters) -> (Expected<Seconds, WebCore::ResourceError> result) Async
PreconnectTo(Optional<uint64_t> preconnectionIdentifier, WebKit::NetworkResourceLoadParameters loadParameters);
StartDownload(WebKit::DownloadID downloadID, WebCore::ResourceRequest request, enum:bool Optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, String suggestedName)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -147,6 +147,12 @@
return emptyString();
}
+void NetworkDataTask::setH2PingCallback(const URL& url, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+ ASSERT_NOT_REACHED();
+ completionHandler(makeUnexpected(internalError(url)));
+}
+
PAL::SessionID NetworkDataTask::sessionID() const
{
return m_session->sessionID();
Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -132,6 +132,7 @@
bool isTopLevelNavigation() const { return m_dataTaskIsForMainFrameNavigation; }
virtual String description() const;
+ virtual void setH2PingCallback(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
PAL::SessionID sessionID() const;
Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -64,17 +64,16 @@
, m_loadThrottleLatency(networkSession.loadThrottleLatency())
, m_currentRequest(m_parameters.request)
{
- initialize(networkSession, blobRegistry);
-}
-
-void NetworkLoad::initialize(NetworkSession& networkSession, WebCore::BlobRegistryImpl* blobRegistry)
-{
if (blobRegistry && m_parameters.request.url().protocolIsBlob())
m_task = NetworkDataTaskBlob::create(networkSession, *blobRegistry, *this, m_parameters.request, m_parameters.contentSniffingPolicy, m_parameters.blobFileReferences);
else
m_task = NetworkDataTask::create(networkSession, *this, m_parameters);
+}
- m_task->resume();
+void NetworkLoad::start()
+{
+ if (m_task)
+ m_task->resume();
}
NetworkLoad::~NetworkLoad()
@@ -300,4 +299,12 @@
return emptyString();
}
+void NetworkLoad::setH2PingCallback(const URL& url, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+ if (m_task)
+ m_task->setH2PingCallback(url, WTFMove(completionHandler));
+ else
+ completionHandler(makeUnexpected(internalError(url)));
+}
+
} // namespace WebKit
Modified: trunk/Source/WebKit/NetworkProcess/NetworkLoad.h (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkLoad.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkLoad.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -47,6 +47,7 @@
NetworkLoad(NetworkLoadClient&, WebCore::BlobRegistryImpl*, NetworkLoadParameters&&, NetworkSession&);
~NetworkLoad();
+ void start();
void cancel();
bool isAllowedToAskUserForCredentials() const;
@@ -67,10 +68,9 @@
bool shouldCaptureExtraNetworkLoadMetrics() const final;
String description() const;
+ void setH2PingCallback(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
private:
- void initialize(NetworkSession&, WebCore::BlobRegistryImpl*);
-
// NetworkDataTaskClient
void willPerformHTTPRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&, RedirectCompletionHandler&&) final;
void didReceiveChallenge(WebCore::AuthenticationChallenge&&, NegotiatedLegacyTLS, ChallengeCompletionHandler&&) final;
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -1421,7 +1421,7 @@
parameters.storedCredentialsPolicy = storedCredentialsPolicy;
parameters.shouldPreconnectOnly = PreconnectOnly::Yes;
- new PreconnectTask(*this, sessionID, WTFMove(parameters), [](const WebCore::ResourceError&) { });
+ (new PreconnectTask(*this, sessionID, WTFMove(parameters), [](const WebCore::ResourceError&) { }))->start();
#else
UNUSED_PARAM(url);
UNUSED_PARAM(userAgent);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -337,6 +337,7 @@
parameters.request = WTFMove(request);
parameters.isNavigatingToAppBoundDomain = m_parameters.isNavigatingToAppBoundDomain;
m_networkLoad = makeUnique<NetworkLoad>(*this, &networkSession->blobRegistry(), WTFMove(parameters), *networkSession);
+ m_networkLoad->start();
RELEASE_LOG_IF_ALLOWED("startNetworkLoad: Going to the network (description=%" PUBLIC_LOG_STRING ")", m_networkLoad->description().utf8().data());
}
Modified: trunk/Source/WebKit/NetworkProcess/PreconnectTask.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/PreconnectTask.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/PreconnectTask.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -54,14 +54,21 @@
ASSERT(parameters.shouldPreconnectOnly == PreconnectOnly::Yes);
m_networkLoad = makeUnique<NetworkLoad>(*this, nullptr, WTFMove(parameters), *networkSession);
-
m_timeoutTimer.startOneShot(60000_s);
}
-PreconnectTask::~PreconnectTask()
+void PreconnectTask::setH2PingCallback(const URL& url, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&& completionHandler)
{
+ m_networkLoad->setH2PingCallback(url, WTFMove(completionHandler));
}
+void PreconnectTask::start()
+{
+ m_networkLoad->start();
+}
+
+PreconnectTask::~PreconnectTask() = default;
+
void PreconnectTask::willSendRedirectedRequest(ResourceRequest&&, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
{
// HSTS redirection may happen here.
Modified: trunk/Source/WebKit/NetworkProcess/PreconnectTask.h (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/PreconnectTask.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/PreconnectTask.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -40,9 +40,12 @@
class PreconnectTask final : public NetworkLoadClient {
public:
- PreconnectTask(NetworkProcess&, PAL::SessionID, NetworkLoadParameters&&, CompletionHandler<void(const WebCore::ResourceError&)>&& completionHandler = { });
+ PreconnectTask(NetworkProcess&, PAL::SessionID, NetworkLoadParameters&&, CompletionHandler<void(const WebCore::ResourceError&)>&&);
~PreconnectTask();
+ void setH2PingCallback(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
+ void start();
+
private:
// NetworkLoadClient.
bool isSynchronous() const final { return false; }
Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerSoftUpdateLoader.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerSoftUpdateLoader.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerSoftUpdateLoader.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -127,6 +127,7 @@
parameters.contentEncodingSniffingPolicy = ContentEncodingSniffingPolicy::Sniff;
parameters.request = WTFMove(request);
m_networkLoad = makeUnique<NetworkLoad>(*this, nullptr, WTFMove(parameters), session);
+ m_networkLoad->start();
}
void ServiceWorkerSoftUpdateLoader::willSendRedirectedRequest(ResourceRequest&&, ResourceRequest&&, ResourceResponse&&)
Modified: trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -69,6 +69,7 @@
parameters.request = m_originalRequest;
parameters.isNavigatingToAppBoundDomain = isNavigatingToAppBoundDomain;
m_networkLoad = makeUnique<NetworkLoad>(*this, nullptr, WTFMove(parameters), *networkSession);
+ m_networkLoad->start();
}
SpeculativeLoad::~SpeculativeLoad()
Modified: trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -463,7 +463,7 @@
parameters.shouldPreconnectOnly = PreconnectOnly::Yes;
parameters.request = constructRevalidationRequest(subresourceInfo.key(), subresourceInfo, entry);
parameters.isNavigatingToAppBoundDomain = isNavigatingToAppBoundDomain;
- new PreconnectTask(m_cache.networkProcess(), m_cache.sessionID(), WTFMove(parameters), [](const WebCore::ResourceError&) { });
+ (new PreconnectTask(m_cache.networkProcess(), m_cache.sessionID(), WTFMove(parameters), [](const WebCore::ResourceError&) { }))->start();
#else
UNUSED_PARAM(subresourceInfo);
UNUSED_PARAM(entry);
Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -77,6 +77,8 @@
String description() const override;
+ void setH2PingCallback(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&) override;
+
private:
NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::FrameIdentifier, WebCore::PageIdentifier, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly, bool dataTaskIsForMainFrameNavigation, bool dataTaskIsForMainResourceNavigationForAnyFrame, Optional<NetworkActivityTracker>, Optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, WebCore::ShouldRelaxThirdPartyCookieBlocking);
Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (264020 => 264021)
--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm 2020-07-07 17:04:58 UTC (rev 264021)
@@ -577,4 +577,24 @@
return String([m_task description]);
}
+void NetworkDataTaskCocoa::setH2PingCallback(const URL& url, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+#if HAVE(PRECONNECT_PING)
+ ASSERT(m_task.get()._preconnect);
+ auto handler = CompletionHandlerWithFinalizer<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>(WTFMove(completionHandler), [url] (Function<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>& completionHandler) {
+ completionHandler(makeUnexpected(WebCore::internalError(url)));
+ });
+ [m_task getUnderlyingHTTPConnectionInfoWithCompletionHandler:makeBlockPtr([completionHandler = WTFMove(handler), url] (_NSHTTPConnectionInfo *connectionInfo) mutable {
+ if (!connectionInfo.isValid)
+ return completionHandler(makeUnexpected(WebCore::internalError(url)));
+ [connectionInfo sendPingWithReceiveHandler:makeBlockPtr([completionHandler = WTFMove(completionHandler)](NSError *error, NSTimeInterval interval) mutable {
+ completionHandler(Seconds(interval));
+ }).get()];
+ }).get()];
+#else
+ ASSERT_NOT_REACHED();
+ return completionHandler(makeUnexpected(WebCore::internalError(url)));
+#endif
}
+
+}
Modified: trunk/Source/WebKit/Shared/WebErrors.cpp (264020 => 264021)
--- trunk/Source/WebKit/Shared/WebErrors.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/Shared/WebErrors.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -84,14 +84,6 @@
return ResourceError(API::Error::webKitPluginErrorDomain(), API::Error::Plugin::PlugInWillHandleLoad, response.url(), WEB_UI_STRING("Plug-in handled load", "WebKitErrorPlugInWillHandleLoad description"));
}
-ResourceError internalError(const URL& url)
-{
- RELEASE_LOG_ERROR(Loading, "Internal error called");
- RELEASE_LOG_STACKTRACE(Loading);
-
- return ResourceError(API::Error::webKitErrorDomain(), API::Error::General::Internal, url, WEB_UI_STRING("WebKit encountered an internal error", "WebKitErrorInternal description"));
-}
-
#if !PLATFORM(COCOA)
ResourceError cancelledError(const ResourceRequest& request)
{
Modified: trunk/Source/WebKit/Shared/WebErrors.h (264020 => 264021)
--- trunk/Source/WebKit/Shared/WebErrors.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/Shared/WebErrors.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -48,7 +48,6 @@
WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&);
WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&);
WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&);
-WebCore::ResourceError internalError(const URL&);
#if USE(SOUP)
WebCore::ResourceError downloadNetworkError(const URL&, const WTF::String&);
Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -47,6 +47,7 @@
#include <WebCore/NotImplemented.h>
#include <WebCore/PlatformLayer.h>
#include <WebCore/PlatformTimeRanges.h>
+#include <WebCore/ResourceError.h>
#include <wtf/HashMap.h>
#include <wtf/MachSendRight.h>
#include <wtf/MainThread.h>
@@ -1106,6 +1107,11 @@
completionHandler();
}
+void MediaPlayerPrivateRemote::sendH2Ping(const URL& url, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+ m_mediaResourceLoader->sendH2Ping(url, WTFMove(completionHandler));
+}
+
void MediaPlayerPrivateRemote::removeResource(RemoteMediaResourceIdentifier remoteMediaResourceIdentifier)
{
// The client(RemoteMediaResourceProxy) will be destroyed as well
Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -132,6 +132,7 @@
void requestResource(RemoteMediaResourceIdentifier, WebCore::ResourceRequest&&, WebCore::PlatformMediaResourceLoader::LoadOptions, CompletionHandler<void()>&&);
void removeResource(RemoteMediaResourceIdentifier);
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&);
void resourceNotSupported();
void engineUpdated();
Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in 2020-07-07 17:04:58 UTC (rev 264021)
@@ -67,6 +67,7 @@
RequestResource(WebKit::RemoteMediaResourceIdentifier remoteMediaResourceIdentifier, WebCore::ResourceRequest request, enum:uint8_t WebCore::PlatformMediaResourceLoader::LoadOptions options) -> () Async
RemoveResource(WebKit::RemoteMediaResourceIdentifier remoteMediaResourceIdentifier)
+ SendH2Ping(URL url) -> (Expected<Seconds, WebCore::ResourceError> result) Async
ResourceNotSupported()
EngineUpdated()
Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -633,7 +633,7 @@
WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::BrowsingContextRemoved(page.webPageProxyIdentifier(), page.identifier(), WebFrame::fromCoreFrame(frame)->frameID()), 0);
}
-static uint64_t generateLoadIdentifier()
+uint64_t WebLoaderStrategy::generateLoadIdentifier()
{
static uint64_t identifier = 0;
return ++identifier;
@@ -662,7 +662,7 @@
}
NetworkResourceLoadParameters loadParameters;
- loadParameters.identifier = generateLoadIdentifier();
+ loadParameters.identifier = WebLoaderStrategy::generateLoadIdentifier();
loadParameters.webPageProxyID = webPage->webPageProxyIdentifier();
loadParameters.webPageID = webPage->identifier();
loadParameters.webFrameID = webFrame->frameID();
@@ -726,7 +726,7 @@
{
Optional<uint64_t> preconnectionIdentifier;
if (completionHandler) {
- preconnectionIdentifier = generateLoadIdentifier();
+ preconnectionIdentifier = WebLoaderStrategy::generateLoadIdentifier();
auto addResult = m_preconnectCompletionHandlers.add(*preconnectionIdentifier, WTFMove(completionHandler));
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}
Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -89,6 +89,8 @@
void addOnlineStateChangeListener(Function<void(bool)>&&) final;
void setOnLineState(bool);
+ static uint64_t generateLoadIdentifier();
+
private:
void scheduleLoad(WebCore::ResourceLoader&, WebCore::CachedResource*, bool shouldClearReferrerOnHTTPSToHTTPRedirect);
void scheduleInternallyFailedLoad(WebCore::ResourceLoader&);
Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -39,6 +39,7 @@
#include "NavigationActionData.h"
#include "NetworkConnectionToWebProcessMessages.h"
#include "NetworkProcessConnection.h"
+#include "NetworkResourceLoadParameters.h"
#include "PluginView.h"
#include "SharedBufferDataReference.h"
#include "UserData.h"
@@ -52,6 +53,7 @@
#include "WebFrame.h"
#include "WebFrameNetworkingContext.h"
#include "WebFullScreenManager.h"
+#include "WebLoaderStrategy.h"
#include "WebNavigationDataStore.h"
#include "WebPage.h"
#include "WebPageGroupProxy.h"
@@ -84,6 +86,7 @@
#include <WebCore/ProgressTracker.h>
#include <WebCore/ResourceError.h>
#include <WebCore/ResourceRequest.h>
+#include <WebCore/RuntimeApplicationChecks.h>
#include <WebCore/ScriptController.h>
#include <WebCore/SecurityOriginData.h>
#include <WebCore/Settings.h>
@@ -1860,6 +1863,29 @@
WebProcess::singleton().prefetchDNS(hostname);
}
+void WebFrameLoaderClient::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, ResourceError>&&)>&& completionHandler)
+{
+ WebPage* webPage = m_frame->page();
+ if (!webPage)
+ return completionHandler(makeUnexpected(internalError(url)));
+
+ NetworkResourceLoadParameters parameters;
+ parameters.request = ResourceRequest(url);
+ parameters.identifier = WebLoaderStrategy::generateLoadIdentifier();
+ parameters.webPageProxyID = webPage->webPageProxyIdentifier();
+ parameters.webPageID = webPage->identifier();
+ parameters.webFrameID = m_frame->frameID();
+ parameters.parentPID = presentingApplicationPID();
+#if HAVE(AUDIT_TOKEN)
+ parameters.networkProcessAuditToken = WebProcess::singleton().ensureNetworkProcessConnection().networkProcessAuditToken();
+#endif
+ parameters.shouldPreconnectOnly = PreconnectOnly::Yes;
+ parameters.options.destination = FetchOptions::Destination::EmptyString;
+ parameters.isNavigatingToAppBoundDomain = m_frame->isTopFrameNavigatingToAppBoundDomain();
+
+ WebProcess::singleton().ensureNetworkProcessConnection().connection().sendWithAsyncReply(Messages::NetworkConnectionToWebProcess::SendH2Ping(parameters), WTFMove(completionHandler));
+}
+
void WebFrameLoaderClient::didRestoreScrollPosition()
{
WebPage* webPage = m_frame->page();
Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h (264020 => 264021)
--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -263,6 +263,7 @@
#endif
void prefetchDNS(const String&) final;
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<WTF::Seconds, WebCore::ResourceError>&&)>&&) final;
void didRestoreScrollPosition() final;
Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h (264020 => 264021)
--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -246,6 +246,7 @@
#endif
void prefetchDNS(const String&) final;
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<Seconds, WebCore::ResourceError>&&)>&&) final;
void getLoadDecisionForIcons(const Vector<std::pair<WebCore::LinkIcon&, uint64_t>>&) final;
void finishedLoadingIcon(uint64_t, WebCore::SharedBuffer*) final;
Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm (264020 => 264021)
--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm 2020-07-07 17:04:58 UTC (rev 264021)
@@ -2092,6 +2092,12 @@
return 0;
}
+void WebFrameLoaderClient::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+ ASSERT_NOT_REACHED();
+ completionHandler(makeUnexpected(WebCore::internalError(url)));
+}
+
String WebFrameLoaderClient::overrideMediaType() const
{
NSString* overrideType = [getWebView(m_webFrame.get()) mediaStyle];
Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.cpp (264020 => 264021)
--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.cpp 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.cpp 2020-07-07 17:04:58 UTC (rev 264021)
@@ -1284,3 +1284,9 @@
{
WebCore::prefetchDNS(hostname);
}
+
+void WebFrameLoaderClient::sendH2Ping(const URL& url, CompletionHandler<void(Expected<Seconds, WebCore::ResourceError>&&)>&& completionHandler)
+{
+ ASSERT_NOT_REACHED();
+ completionHandler(makeUnexpected(WebCore::internalError(url)));
+}
Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.h (264020 => 264021)
--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.h 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.h 2020-07-07 17:04:58 UTC (rev 264021)
@@ -192,6 +192,7 @@
bool shouldAlwaysUsePluginDocument(const WTF::String& mimeType) const override;
void prefetchDNS(const String&) override;
+ void sendH2Ping(const URL&, CompletionHandler<void(Expected<Seconds, WebCore::ResourceError>&&)>&&) final;
private:
WebHistory* webHistory() const;
Modified: trunk/Tools/ChangeLog (264020 => 264021)
--- trunk/Tools/ChangeLog 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Tools/ChangeLog 2020-07-07 17:04:58 UTC (rev 264021)
@@ -1,3 +1,15 @@
+2020-07-07 Alex Christensen <[email protected]>
+
+ Add WebCoreNSURLSession SPI to send HTTP/2 ping
+ https://bugs.webkit.org/show_bug.cgi?id=214030
+ <rdar://problem/64495827>
+
+ Reviewed by Jer Noble.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm:
+ (TestWebKitAPI::TEST):
+ Add a disabled test I used to verify this works correctly.
+
2020-07-07 Geoffrey Garen <[email protected]>
Added a test for callOnMainThread
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm (264020 => 264021)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm 2020-07-07 16:48:08 UTC (rev 264020)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm 2020-07-07 17:04:58 UTC (rev 264021)
@@ -30,7 +30,9 @@
#import "HTTPServer.h"
#import "PlatformUtilities.h"
#import "TestNavigationDelegate.h"
+#import "TestUIDelegate.h"
#import "Utilities.h"
+#import "WKWebViewConfigurationExtras.h"
#import <WebKit/WKWebViewPrivate.h>
#import <pal/spi/cf/CFNetworkSPI.h>
#import <wtf/RetainPtr.h>
@@ -171,6 +173,34 @@
Util::spinRunLoop(100);
EXPECT_EQ(headersCount, 1u);
}
+
+// This should remain disabled until rdar://problem/65055930 is integrated and bots are updated
+TEST(Preconnect, DISABLED_H2PingFromWebCoreNSURLSession)
+{
+ size_t headersCount = 0;
+ HTTPServer server([headersCount = &headersCount] (Connection tlsConnection) {
+ pingPong(H2::Connection::create(tlsConnection), headersCount);
+ }, HTTPServer::Protocol::Http2);
+
+ WKWebViewConfiguration *configuration = [WKWebViewConfiguration _test_configurationWithTestPlugInClassName:@"WebProcessPlugInWithInternals" configureJSCForTesting:YES];
+ auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]);
+
+ auto delegate = adoptNS([TestNavigationDelegate new]);
+ __block bool receivedChallenge = false;
+ [delegate setDidReceiveAuthenticationChallenge:^(WKWebView *, NSURLAuthenticationChallenge *challenge, void (^callback)(NSURLSessionAuthChallengeDisposition, NSURLCredential *)) {
+ EXPECT_WK_STREQ(challenge.protectionSpace.authenticationMethod, NSURLAuthenticationMethodServerTrust);
+ receivedChallenge = true;
+ callback(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
+ }];
+ [webView setNavigationDelegate:delegate.get()];
+ [webView loadHTMLString:[NSString stringWithFormat:@"<script>internals.sendH2Ping('https://127.0.0.1:%d/').then(function(t){if(t>0){alert('pass')}else{alert('fail')}})</script>", server.port()] baseURL:nil];
+ EXPECT_WK_STREQ([webView _test_waitForAlert], "pass");
+ EXPECT_FALSE(headersCount);
+ EXPECT_TRUE(receivedChallenge);
+}
+
+
+
#endif // HAVE(PRECONNECT_PING)
}