Title: [264021] trunk
Revision
264021
Author
[email protected]
Date
2020-07-07 10:04:58 -0700 (Tue, 07 Jul 2020)

Log Message

Add WebCoreNSURLSession SPI to send HTTP/2 ping
https://bugs.webkit.org/show_bug.cgi?id=214030
<rdar://problem/64495827>

Patch by Alex Christensen <[email protected]> on 2020-07-07
Reviewed by Jer Noble.

Source/WebCore:

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:

Source/WebKit:

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:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/Preconnect.mm:
(TestWebKitAPI::TEST):
Add a disabled test I used to verify this works correctly.

Modified Paths

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)
 
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to