Title: [276432] trunk
Revision
276432
Author
[email protected]
Date
2021-04-22 05:18:47 -0700 (Thu, 22 Apr 2021)

Log Message

[SOUP] Add support for preconnect
https://bugs.webkit.org/show_bug.cgi?id=177934

Reviewed by Sergio Villar Senin.

.:

Enable server preconnect support when building with libsoup3.

* Source/cmake/OptionsGTK.cmake:
* Source/cmake/OptionsWPE.cmake:

Source/WebKit:

Use new libsoup API to implement preconnect support.

* NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::create):
* NetworkProcess/soup/NetworkDataTaskSoup.cpp:
(WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
(WebKit::NetworkDataTaskSoup::createRequest):
(WebKit::NetworkDataTaskSoup::resume):
(WebKit::NetworkDataTaskSoup::preconnectCallback):
* NetworkProcess/soup/NetworkDataTaskSoup.h:

LayoutTests:

Remove expectations for tests that are now passing.

* platform/glib/TestExpectations:

Modified Paths

Diff

Modified: trunk/ChangeLog (276431 => 276432)


--- trunk/ChangeLog	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/ChangeLog	2021-04-22 12:18:47 UTC (rev 276432)
@@ -1,5 +1,17 @@
 2021-04-22  Carlos Garcia Campos  <[email protected]>
 
+        [SOUP] Add support for preconnect
+        https://bugs.webkit.org/show_bug.cgi?id=177934
+
+        Reviewed by Sergio Villar Senin.
+
+        Enable server preconnect support when building with libsoup3.
+
+        * Source/cmake/OptionsGTK.cmake:
+        * Source/cmake/OptionsWPE.cmake:
+
+2021-04-22  Carlos Garcia Campos  <[email protected]>
+
         [GTK][WPE] Bump libsoup3 version to 2.99.4
         https://bugs.webkit.org/show_bug.cgi?id=224925
 

Modified: trunk/LayoutTests/ChangeLog (276431 => 276432)


--- trunk/LayoutTests/ChangeLog	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/LayoutTests/ChangeLog	2021-04-22 12:18:47 UTC (rev 276432)
@@ -1,5 +1,16 @@
 2021-04-22  Carlos Garcia Campos  <[email protected]>
 
+        [SOUP] Add support for preconnect
+        https://bugs.webkit.org/show_bug.cgi?id=177934
+
+        Reviewed by Sergio Villar Senin.
+
+        Remove expectations for tests that are now passing.
+
+        * platform/glib/TestExpectations:
+
+2021-04-22  Carlos Garcia Campos  <[email protected]>
+
         [GTK][WPE] Bump libsoup3 version to 2.99.4
         https://bugs.webkit.org/show_bug.cgi?id=224925
 

Modified: trunk/LayoutTests/platform/glib/TestExpectations (276431 => 276432)


--- trunk/LayoutTests/platform/glib/TestExpectations	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/LayoutTests/platform/glib/TestExpectations	2021-04-22 12:18:47 UTC (rev 276432)
@@ -2001,10 +2001,6 @@
 webkit.org/b/176649 fast/text/international/synthesized-italic-vertical.html [ ImageOnlyFailure ]
 webkit.org/b/177294 fast/text/fitzpatrick-combination.html [ ImageOnlyFailure ]
 webkit.org/b/177533 webrtc/video-interruption.html
-webkit.org/b/177934 fast/dom/HTMLLinkElement/preconnect-support.html [ Failure ]
-webkit.org/b/177934 http/tests/preconnect/link-header-rel-preconnect-http.html [ Failure ]
-webkit.org/b/177934 http/tests/preconnect/link-rel-preconnect-http.html [ Timeout ]
-webkit.org/b/177934 http/tests/preconnect/link-rel-preconnect-https.html [ Timeout ]
 webkit.org/b/177936 fast/text/all-small-caps-whitespace.html [ ImageOnlyFailure ]
 webkit.org/b/177936 fast/text/regional-indicator-symobls.html [ Failure ]
 webkit.org/b/177936 fast/text/selection-in-initial-advance-region.html [ Failure ]

Modified: trunk/Source/WebKit/ChangeLog (276431 => 276432)


--- trunk/Source/WebKit/ChangeLog	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/Source/WebKit/ChangeLog	2021-04-22 12:18:47 UTC (rev 276432)
@@ -1,5 +1,23 @@
 2021-04-22  Carlos Garcia Campos  <[email protected]>
 
+        [SOUP] Add support for preconnect
+        https://bugs.webkit.org/show_bug.cgi?id=177934
+
+        Reviewed by Sergio Villar Senin.
+
+        Use new libsoup API to implement preconnect support.
+
+        * NetworkProcess/NetworkDataTask.cpp:
+        (WebKit::NetworkDataTask::create):
+        * NetworkProcess/soup/NetworkDataTaskSoup.cpp:
+        (WebKit::NetworkDataTaskSoup::NetworkDataTaskSoup):
+        (WebKit::NetworkDataTaskSoup::createRequest):
+        (WebKit::NetworkDataTaskSoup::resume):
+        (WebKit::NetworkDataTaskSoup::preconnectCallback):
+        * NetworkProcess/soup/NetworkDataTaskSoup.h:
+
+2021-04-22  Carlos Garcia Campos  <[email protected]>
+
         [GTK] Build error: Couldn't find include 'Soup-2.4.gir'
         https://bugs.webkit.org/show_bug.cgi?id=224926
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp (276431 => 276432)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2021-04-22 12:18:47 UTC (rev 276432)
@@ -57,7 +57,7 @@
     return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.webPageProxyID,  parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation, parameters.isMainResourceNavigationForAnyFrame, parameters.networkActivityTracker, parameters.isNavigatingToAppBoundDomain, parameters.shouldRelaxThirdPartyCookieBlocking, parameters.pcmDataCarried);
 #endif
 #if USE(SOUP)
-    return NetworkDataTaskSoup::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation);
+    return NetworkDataTaskSoup::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly, parameters.isMainFrameNavigation);
 #endif
 #if USE(CURL)
     return NetworkDataTaskCurl::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation, parameters.shouldRelaxThirdPartyCookieBlocking);

Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp (276431 => 276432)


--- trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp	2021-04-22 12:18:47 UTC (rev 276432)
@@ -53,11 +53,12 @@
 
 static const size_t gDefaultReadBufferSize = 8192;
 
-NetworkDataTaskSoup::NetworkDataTaskSoup(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& requestWithCredentials, FrameIdentifier frameID, PageIdentifier pageID, StoredCredentialsPolicy storedCredentialsPolicy, ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation)
+NetworkDataTaskSoup::NetworkDataTaskSoup(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& requestWithCredentials, FrameIdentifier frameID, PageIdentifier pageID, StoredCredentialsPolicy storedCredentialsPolicy, ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation)
     : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation)
     , m_frameID(frameID)
     , m_pageID(pageID)
     , m_shouldContentSniff(shouldContentSniff)
+    , m_shouldPreconnectOnly(shouldPreconnectOnly)
     , m_timeoutSource(RunLoop::main(), this, &NetworkDataTaskSoup::timeoutFired)
 {
     m_session->registerNetworkDataTask(*this);
@@ -130,6 +131,13 @@
         return;
     }
 
+    if (m_shouldPreconnectOnly == PreconnectOnly::Yes) {
+#if !USE(SOUP2)
+        g_signal_connect(m_soupMessage.get(), "accept-certificate", G_CALLBACK(acceptCertificateCallback), this);
+#endif
+        return;
+    }
+
     unsigned messageFlags = SOUP_MESSAGE_NO_REDIRECT;
     if (m_shouldContentSniff == ContentSniffingPolicy::DoNotSniffContent)
         soup_message_disable_feature(m_soupMessage.get(), SOUP_TYPE_CONTENT_SNIFFER);
@@ -244,11 +252,20 @@
     RefPtr<NetworkDataTaskSoup> protectedThis(this);
     if (m_soupMessage && !m_cancellable) {
         m_cancellable = adoptGRef(g_cancellable_new());
-        // We need to protect cancellable here, because soup_session_send_async uses it after emitting SoupSession::request-queued, and we
-        // might cancel the operation in a feature callback emitted on request-queued, for example hsts-enforced.
-        GRefPtr<GCancellable> protectCancellable(m_cancellable);
-        soup_session_send_async(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), m_soupMessage.get(), RunLoopSourcePriority::AsyncIONetwork, m_cancellable.get(),
-            reinterpret_cast<GAsyncReadyCallback>(sendRequestCallback), new SendRequestData({ m_soupMessage, WTFMove(protectedThis) }));
+        if (m_shouldPreconnectOnly == PreconnectOnly::Yes) {
+#if !USE(SOUP2)
+            soup_session_preconnect_async(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), m_soupMessage.get(), RunLoopSourcePriority::AsyncIONetwork, m_cancellable.get(),
+                reinterpret_cast<GAsyncReadyCallback>(preconnectCallback), protectedThis.leakRef());
+#else
+            RELEASE_ASSERT_NOT_REACHED();
+#endif
+        } else {
+            // We need to protect cancellable here, because soup_session_send_async uses it after emitting SoupSession::request-queued, and we
+            // might cancel the operation in a feature callback emitted on request-queued, for example hsts-enforced.
+            GRefPtr<GCancellable> protectCancellable(m_cancellable);
+            soup_session_send_async(static_cast<NetworkSessionSoup&>(*m_session).soupSession(), m_soupMessage.get(), RunLoopSourcePriority::AsyncIONetwork, m_cancellable.get(),
+                reinterpret_cast<GAsyncReadyCallback>(sendRequestCallback), new SendRequestData({ m_soupMessage, WTFMove(protectedThis) }));
+        }
         return;
     }
 
@@ -443,6 +460,24 @@
     });
 }
 
+#if !USE(SOUP2)
+void NetworkDataTaskSoup::preconnectCallback(SoupSession* session, GAsyncResult* result, NetworkDataTaskSoup* task)
+{
+    RefPtr<NetworkDataTaskSoup> protectedThis = adoptRef(task);
+    if (task->state() == State::Canceling || task->state() == State::Completed || !task->m_client) {
+        task->clearRequest();
+        return;
+    }
+
+    ResourceError resourceError;
+    GUniqueOutPtr<GError> error;
+    if (!soup_session_preconnect_finish(session, result, &error.outPtr()))
+        resourceError = ResourceError::genericGError(task->m_currentRequest.url(), error.get());
+    task->clearRequest();
+    task->dispatchDidCompleteWithError(resourceError);
+}
+#endif
+
 void NetworkDataTaskSoup::dispatchDidCompleteWithError(const ResourceError& error)
 {
     m_networkLoadMetrics.responseEnd = MonotonicTime::now().secondsSinceEpoch() - m_networkLoadMetrics.fetchStart;

Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.h (276431 => 276432)


--- trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.h	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.h	2021-04-22 12:18:47 UTC (rev 276432)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "NetworkDataTask.h"
+#include "NetworkLoadParameters.h"
 #include <WebCore/DataURLDecoder.h>
 #include <WebCore/FrameIdentifier.h>
 #include <WebCore/NetworkLoadMetrics.h>
@@ -40,15 +41,15 @@
 
 class NetworkDataTaskSoup final : public NetworkDataTask {
 public:
-    static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation)
+    static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, WebCore::ContentEncodingSniffingPolicy shouldContentEncodingSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation)
     {
-        return adoptRef(*new NetworkDataTaskSoup(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation));
+        return adoptRef(*new NetworkDataTaskSoup(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly, dataTaskIsForMainFrameNavigation));
     }
 
     ~NetworkDataTaskSoup();
 
 private:
-    NetworkDataTaskSoup(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::FrameIdentifier, WebCore::PageIdentifier, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation);
+    NetworkDataTaskSoup(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::FrameIdentifier, WebCore::PageIdentifier, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly, bool dataTaskIsForMainFrameNavigation);
 
     void cancel() override;
     void resume() override;
@@ -76,6 +77,10 @@
     void dispatchDidReceiveResponse();
     void dispatchDidCompleteWithError(const WebCore::ResourceError&);
 
+#if !USE(SOUP2)
+    static void preconnectCallback(SoupSession*, GAsyncResult*, NetworkDataTaskSoup*);
+#endif
+
 #if USE(SOUP2)
     static gboolean tlsConnectionAcceptCertificateCallback(GTlsConnection*, GTlsCertificate*, GTlsCertificateFlags, NetworkDataTaskSoup*);
 #else
@@ -165,6 +170,7 @@
     WebCore::PageIdentifier m_pageID;
     State m_state { State::Suspended };
     WebCore::ContentSniffingPolicy m_shouldContentSniff;
+    PreconnectOnly m_shouldPreconnectOnly { PreconnectOnly::No };
     GRefPtr<SoupMessage> m_soupMessage;
     GRefPtr<GFile> m_file;
     GRefPtr<GInputStream> m_inputStream;

Modified: trunk/Source/cmake/OptionsGTK.cmake (276431 => 276432)


--- trunk/Source/cmake/OptionsGTK.cmake	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/Source/cmake/OptionsGTK.cmake	2021-04-22 12:18:47 UTC (rev 276432)
@@ -205,6 +205,7 @@
 else ()
     set(SOUP_MINIMUM_VERSION 2.99.4)
     set(SOUP_API_VERSION 3.0)
+    set(ENABLE_SERVER_PRECONNECT ON)
 endif ()
 find_package(LibSoup ${SOUP_MINIMUM_VERSION} REQUIRED)
 

Modified: trunk/Source/cmake/OptionsWPE.cmake (276431 => 276432)


--- trunk/Source/cmake/OptionsWPE.cmake	2021-04-22 12:14:39 UTC (rev 276431)
+++ trunk/Source/cmake/OptionsWPE.cmake	2021-04-22 12:18:47 UTC (rev 276432)
@@ -128,6 +128,7 @@
     set(WPE_API_VERSION 1.1)
     # No API changes in 1.1, so keep using the same API documentation.
     set(WPE_API_DOC_VERSION 1.0)
+    set(ENABLE_SERVER_PRECONNECT ON)
 endif ()
 find_package(LibSoup ${SOUP_MINIMUM_VERSION} REQUIRED)
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to