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)