Title: [262971] trunk
Revision
262971
Author
commit-qu...@webkit.org
Date
2020-06-12 12:47:15 -0700 (Fri, 12 Jun 2020)

Log Message

[Curl] Implement functions to use ResourceLoadStatistics.
https://bugs.webkit.org/show_bug.cgi?id=207692

Patch by Takashi Komori <takashi.kom...@sony.com> on 2020-06-12
Reviewed by Don Olmstead.

Implement functions which are required to implement ResourceLoadStatistics for Curl port.

Source/WebCore:

Tests: http/tests/resourceLoadStatistics/

* CMakeLists.txt:
* platform/network/curl/CookieJarDB.cpp:
(WebCore::CookieJarDB::openDatabase):
(WebCore::CookieJarDB::setCookie):
(WebCore::CookieJarDB::allDomains):
(WebCore::CookieJarDB::deleteCookiesForHostname):
* platform/network/curl/CookieJarDB.h:
* platform/network/curl/NetworkStorageSessionCurl.cpp:
(WebCore::NetworkStorageSession::setCookiesFromDOM const):
(WebCore::NetworkStorageSession::setCookies):
(WebCore::NetworkStorageSession::deleteCookiesForHostnames):
(WebCore::NetworkStorageSession::getHostnamesWithCookies):

Source/WebKit:

In NetworkDataTaskCurl.cpp we check if we should block cookies and block if needed.

Tests: http/tests/resourceLoadStatistics/

* NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::create):
* NetworkProcess/curl/NetworkDataTaskCurl.cpp:
(WebKit::NetworkDataTaskCurl::NetworkDataTaskCurl):
(WebKit::NetworkDataTaskCurl::createCurlRequest):
(WebKit::NetworkDataTaskCurl::willPerformHTTPRedirection):
(WebKit::NetworkDataTaskCurl::blockCookies):
(WebKit::NetworkDataTaskCurl::unblockCookies):
(WebKit::NetworkDataTaskCurl::shouldBlockCookies):
(WebKit::NetworkDataTaskCurl::isThirdPartyRequest):
* NetworkProcess/curl/NetworkDataTaskCurl.h:
* NetworkProcess/curl/NetworkSessionCurl.cpp:
(WebKit::NetworkSessionCurl::NetworkSessionCurl):
* UIProcess/API/C/WKWebsiteDataStoreRef.cpp:
(WKWebsiteDataStoreGetAllStorageAccessEntries):
* UIProcess/API/C/WKWebsiteDataStoreRef.h:
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::parameters):

Tools:

Tests: http/tests/resourceLoadStatistics/

* WebKitTestRunner/TestController.cpp:
(WTR::GetAllStorageAccessEntriesCallbackContext::GetAllStorageAccessEntriesCallbackContext):
(WTR::getAllStorageAccessEntriesCallback):
(WTR::TestController::getAllStorageAccessEntries):

LayoutTests:

Tests: http/tests/resourceLoadStatistics/

* platform/wincairo-wk1/TestExpectations:
* platform/wincairo/TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (262970 => 262971)


--- trunk/LayoutTests/ChangeLog	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/LayoutTests/ChangeLog	2020-06-12 19:47:15 UTC (rev 262971)
@@ -1,3 +1,17 @@
+2020-06-12  Takashi Komori  <takashi.kom...@sony.com>
+
+        [Curl] Implement functions to use ResourceLoadStatistics.
+        https://bugs.webkit.org/show_bug.cgi?id=207692
+
+        Reviewed by Don Olmstead.
+
+        Implement functions which are required to implement ResourceLoadStatistics for Curl port.
+
+        Tests: http/tests/resourceLoadStatistics/
+
+        * platform/wincairo-wk1/TestExpectations:
+        * platform/wincairo/TestExpectations:
+
 2020-06-12  Yusuke Suzuki  <ysuz...@apple.com>
 
         [ Mojave wk2 Release ] js/dom/unhandled-promise-rejection-console-no-report.html is flaky failing.

Modified: trunk/LayoutTests/platform/wincairo/TestExpectations (262970 => 262971)


--- trunk/LayoutTests/platform/wincairo/TestExpectations	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/LayoutTests/platform/wincairo/TestExpectations	2020-06-12 19:47:15 UTC (rev 262971)
@@ -1175,9 +1175,37 @@
 http/tests/referrer-policy/unsafe-url/cross-origin-http-http.html [ Skip ] 
 http/tests/referrer-policy/unsafe-url/cross-origin-http.https.html [ Skip ] 
 
+# ResourceLoadStatistics
+http/tests/resourceLoadStatistics [ Pass ]
+http/tests/resourceLoadStatistics/exemptDomains [ Skip ]
+http/tests/resourceLoadStatistics/add-blocking-to-redirect-database.html [ Skip ]
+http/tests/resourceLoadStatistics/add-blocking-to-redirect.html [ Skip ]
+http/tests/resourceLoadStatistics/cookie-deletion-database.html [ Skip ]
+http/tests/resourceLoadStatistics/cookie-deletion.html [ Skip ]
+http/tests/resourceLoadStatistics/cookies-with-and-without-user-interaction-database.html [ Skip ]
+http/tests/resourceLoadStatistics/cookies-with-and-without-user-interaction.html [ Skip ]
+http/tests/resourceLoadStatistics/do-not-remove-blocking-in-redirect-database.html [ Skip ]
+http/tests/resourceLoadStatistics/do-not-remove-blocking-in-redirect.html [ Skip ]
+http/tests/resourceLoadStatistics/enforce-samesite-strict-based-on-top-frame-unique-redirects-to-database.html [ Skip ]
+http/tests/resourceLoadStatistics/enforce-samesite-strict-based-on-top-frame-unique-redirects-to.html [ Skip ]
+http/tests/resourceLoadStatistics/ping-to-prevalent-resource-database.html [ Skip ]
+http/tests/resourceLoadStatistics/ping-to-prevalent-resource.html [ Skip ]
+http/tests/resourceLoadStatistics/set-all-cookies-to-same-site-strict.html [ Skip ]
+http/tests/resourceLoadStatistics/standalone-web-application-exempt-from-website-data-deletion-database.html [ Skip ]
+http/tests/resourceLoadStatistics/standalone-web-application-exempt-from-website-data-deletion.html [ Skip ]
+http/tests/resourceLoadStatistics/switch-session-on-navigation-to-prevalent-with-interaction-database.php [ Skip ]
+http/tests/resourceLoadStatistics/switch-session-on-navigation-to-prevalent-with-interaction.php [ Skip ]
+http/tests/resourceLoadStatistics/telemetry-generation.html [ Skip ]
+http/tests/resourceLoadStatistics/third-party-cookie-blocking-ephemeral-database.html [ Skip ]
+http/tests/resourceLoadStatistics/third-party-cookie-blocking-ephemeral.html [ Skip ]
+http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction-database.html [ Skip ]
+http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction.html [ Skip ]
+http/tests/resourceLoadStatistics/user-interaction-only-reported-once-within-short-period-of-time-database.html [ Skip ]
+http/tests/resourceLoadStatistics/user-interaction-only-reported-once-within-short-period-of-time.html [ Skip ]
+http/tests/resourceLoadStatistics/user-interaction-reported-after-website-data-removal-database.html [ Skip ]
+http/tests/resourceLoadStatistics/user-interaction-reported-after-website-data-removal.html [ Skip ]
+
 # All timing out
-http/tests/resourceLoadStatistics [ Skip ]
-
 http/tests/security [ Skip ]
 http/tests/security/401-logout/401-logout.php [ Pass ]
 http/tests/security/cookies/third-party-cookie-blocking.html [ Pass ]

Modified: trunk/LayoutTests/platform/wincairo-wk1/TestExpectations (262970 => 262971)


--- trunk/LayoutTests/platform/wincairo-wk1/TestExpectations	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/LayoutTests/platform/wincairo-wk1/TestExpectations	2020-06-12 19:47:15 UTC (rev 262971)
@@ -309,3 +309,6 @@
 
 # Skip IsLoggedIn
 http/tests/is-logged-in/ [ Skip ]
+
+# Skip ResourceLoadStatistics
+http/tests/resourceLoadStatistics [ Skip ]

Modified: trunk/Source/WebCore/CMakeLists.txt (262970 => 262971)


--- trunk/Source/WebCore/CMakeLists.txt	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebCore/CMakeLists.txt	2020-06-12 19:47:15 UTC (rev 262971)
@@ -696,6 +696,7 @@
     dom/DocumentFragment.idl
     dom/DocumentFullscreen.idl
     dom/DocumentOrShadowRoot.idl
+    dom/DocumentStorageAccess.idl
     dom/DocumentTouch.idl
     dom/DocumentType.idl
     dom/DragEvent.idl

Modified: trunk/Source/WebCore/ChangeLog (262970 => 262971)


--- trunk/Source/WebCore/ChangeLog	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebCore/ChangeLog	2020-06-12 19:47:15 UTC (rev 262971)
@@ -1,3 +1,27 @@
+2020-06-12  Takashi Komori  <takashi.kom...@sony.com>
+
+        [Curl] Implement functions to use ResourceLoadStatistics.
+        https://bugs.webkit.org/show_bug.cgi?id=207692
+
+        Reviewed by Don Olmstead.
+
+        Implement functions which are required to implement ResourceLoadStatistics for Curl port.
+
+        Tests: http/tests/resourceLoadStatistics/
+
+        * CMakeLists.txt:
+        * platform/network/curl/CookieJarDB.cpp:
+        (WebCore::CookieJarDB::openDatabase):
+        (WebCore::CookieJarDB::setCookie):
+        (WebCore::CookieJarDB::allDomains):
+        (WebCore::CookieJarDB::deleteCookiesForHostname):
+        * platform/network/curl/CookieJarDB.h:
+        * platform/network/curl/NetworkStorageSessionCurl.cpp:
+        (WebCore::NetworkStorageSession::setCookiesFromDOM const):
+        (WebCore::NetworkStorageSession::setCookies):
+        (WebCore::NetworkStorageSession::deleteCookiesForHostnames):
+        (WebCore::NetworkStorageSession::getHostnamesWithCookies):
+
 2020-06-12  Andres Gonzalez  <andresg...@apple.com>
 
         In isolated tree mode 2, AXIsolatedObject::setChildrenIDs should be called only on secondary thread.

Modified: trunk/Source/WebCore/platform/network/curl/CookieJarDB.cpp (262970 => 262971)


--- trunk/Source/WebCore/platform/network/curl/CookieJarDB.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebCore/platform/network/curl/CookieJarDB.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -24,6 +24,7 @@
 
 #include "config.h"
 #include "CookieJarDB.h"
+#include "cookieJar.h"
 
 #include "CookieUtil.h"
 #include "Logging.h"
@@ -63,6 +64,8 @@
     "CREATE INDEX IF NOT EXISTS domain_index ON Cookie(domain);"
 #define CREATE_PATH_INDEX_SQL \
     "CREATE INDEX IF NOT EXISTS path_index ON Cookie(path);"
+#define SELECT_ALL_DOMAINS_SQL \
+    "SELECT DISTINCT domain FROM Cookie;"
 #define CHECK_EXISTS_COOKIE_SQL \
     "SELECT domain FROM Cookie WHERE ((domain = ?) OR (domain GLOB ?));"
 #define CHECK_EXISTS_HTTPONLY_COOKIE_SQL \
@@ -76,6 +79,10 @@
     "DELETE FROM Cookie WHERE name = ? AND domain = ?;"
 #define DELETE_ALL_SESSION_COOKIE_SQL \
     "DELETE FROM Cookie WHERE session = 1;"
+#define DELETE_COOKIES_BY_DOMAIN_SQL \
+    "DELETE FROM Cookie WHERE domain = ? ;"
+#define DELETE_COOKIES_BY_DOMAIN_EXCEPT_HTTP_ONLY_SQL \
+    "DELETE FROM Cookie WHERE (domain = ?) AND (httponly = 0);"
 #define DELETE_ALL_COOKIE_SQL \
     "DELETE FROM Cookie;"
 
@@ -165,6 +172,8 @@
     createPrepareStatement(CHECK_EXISTS_HTTPONLY_COOKIE_SQL);
     createPrepareStatement(DELETE_COOKIE_BY_NAME_DOMAIN_PATH_SQL);
     createPrepareStatement(DELETE_COOKIE_BY_NAME_DOMAIN_SQL);
+    createPrepareStatement(DELETE_COOKIES_BY_DOMAIN_SQL);
+    createPrepareStatement(DELETE_COOKIES_BY_DOMAIN_EXCEPT_HTTP_ONLY_SQL);
 
     return true;
 }
@@ -529,7 +538,7 @@
     return checkSQLiteReturnCode(statement.step());
 }
 
-bool CookieJarDB::setCookie(const URL& firstParty, const URL& url, const String& body, CookieJarDB::Source source)
+bool CookieJarDB::setCookie(const URL& firstParty, const URL& url, const String& body, CookieJarDB::Source source, Optional<Seconds> cappedLifetime)
 {
     if (!isEnabled() || !m_database.isOpen())
         return false;
@@ -550,9 +559,31 @@
     if (!canAcceptCookie(*cookie, firstParty, url, source))
         return false;
 
+    if (cappedLifetime && cookie->expires) {
+        ASSERT(*cappedLifetime >= 0_s);
+        auto cappedExpires = WallTime::now() + *cappedLifetime;
+        if (cappedExpires < WallTime::fromRawSeconds(*cookie->expires / WTF::msPerSecond))
+            cookie->expires = cappedExpires.secondsSinceEpoch().milliseconds();
+    }
+
     return setCookie(*cookie);
 }
 
+HashSet<String> CookieJarDB::allDomains()
+{
+    SQLiteStatement statement(m_database, SELECT_ALL_DOMAINS_SQL);
+    statement.prepare();
+
+    HashSet<String> domains;
+    while (statement.step() == SQLITE_ROW) {
+        auto domain = statement.getColumnText(0);
+        domains.add(domain);
+    }
+
+    statement.finalize();
+    return domains;
+}
+
 bool CookieJarDB::deleteCookie(const String& url, const String& name)
 {
     if (!isEnabled() || !m_database.isOpen())
@@ -589,6 +620,13 @@
     return false;
 }
 
+bool CookieJarDB::deleteCookiesForHostname(const String& hostname, IncludeHttpOnlyCookies includeHttpOnlyCookies)
+{
+    auto& statement = preparedStatement(includeHttpOnlyCookies == IncludeHttpOnlyCookies::Yes ? DELETE_COOKIES_BY_DOMAIN_SQL : DELETE_COOKIES_BY_DOMAIN_EXCEPT_HTTP_ONLY_SQL);
+    statement.bindText(1, hostname);
+    return checkSQLiteReturnCode(statement.step());
+}
+
 bool CookieJarDB::deleteAllCookies()
 {
     if (!isEnabled() || !m_database.isOpen())

Modified: trunk/Source/WebCore/platform/network/curl/CookieJarDB.h (262970 => 262971)


--- trunk/Source/WebCore/platform/network/curl/CookieJarDB.h	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebCore/platform/network/curl/CookieJarDB.h	2020-06-12 19:47:15 UTC (rev 262971)
@@ -25,6 +25,7 @@
 #pragma once
 
 #include "Cookie.h"
+#include "CookieJar.h"
 #include "SQLiteDatabase.h"
 #include "SQLiteStatement.h"
 #include <wtf/HashMap.h>
@@ -56,13 +57,15 @@
     void setAcceptPolicy(CookieAcceptPolicy policy) { m_acceptPolicy = policy; }
     CookieAcceptPolicy acceptPolicy() const { return m_acceptPolicy; }
 
+    HashSet<String> allDomains();
     Optional<Vector<Cookie>> searchCookies(const URL& firstParty, const URL& requestUrl, const Optional<bool>& httpOnly, const Optional<bool>& secure, const Optional<bool>& session);
     Vector<Cookie> getAllCookies();
-    bool setCookie(const URL& firstParty, const URL&, const String& cookie, Source);
+    bool setCookie(const URL& firstParty, const URL&, const String& cookie, Source, Optional<Seconds> cappedLifetime = WTF::nullopt);
     bool setCookie(const Cookie&);
 
     bool deleteCookie(const String& url, const String& name);
     bool deleteCookies(const String& url);
+    bool deleteCookiesForHostname(const String& hostname, IncludeHttpOnlyCookies);
     bool deleteAllCookies();
 
     WEBCORE_EXPORT CookieJarDB(const String& databasePath);

Modified: trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp (262970 => 262971)


--- trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -95,9 +95,14 @@
     return m_cookieDatabase;
 }
 
-void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier>, Optional<PageIdentifier>, ShouldAskITP, const String& value, ShouldRelaxThirdPartyCookieBlocking) const
+void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, const String& value, ShouldRelaxThirdPartyCookieBlocking shouldRelaxThirdPartyCookieBlocking) const
 {
-    cookieDatabase().setCookie(firstParty, url, value, CookieJarDB::Source::Script);
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    Optional<Seconds> cappedLifetime = clientSideCookieCap(RegistrableDomain { firstParty }, pageID);
+#else
+    Optional<Seconds> cappedLifetime = WTF::nullopt;
+#endif
+    cookieDatabase().setCookie(firstParty, url, value, CookieJarDB::Source::Script, cappedLifetime);
 }
 
 void NetworkStorageSession::setCookiesFromHTTPResponse(const URL& firstParty, const URL& url, const String& value) const
@@ -133,9 +138,10 @@
     return { cookiesForSession(*this, firstParty, url, false), false };
 }
 
-void NetworkStorageSession::setCookies(const Vector<Cookie>&, const URL&, const URL& /* mainDocumentURL */)
+void NetworkStorageSession::setCookies(const Vector<Cookie>& cookies, const URL&, const URL& /* mainDocumentURL */)
 {
-    // FIXME: Implement for WebKit to use.
+    for (const auto& cookie : cookies)
+        cookieDatabase().setCookie(cookie);
 }
 
 void NetworkStorageSession::setCookie(const Cookie& cookie)
@@ -164,9 +170,10 @@
     // FIXME: Not yet implemented
 }
 
-void NetworkStorageSession::deleteCookiesForHostnames(const Vector<String>& /* cookieHostNames */, IncludeHttpOnlyCookies)
+void NetworkStorageSession::deleteCookiesForHostnames(const Vector<String>& cookieHostNames, IncludeHttpOnlyCookies includeHttpOnlyCookies)
 {
-    // FIXME: Not yet implemented.
+    for (auto hostname : cookieHostNames)
+        cookieDatabase().deleteCookiesForHostname(hostname, includeHttpOnlyCookies);
 }
 
 void NetworkStorageSession::deleteCookiesForHostnames(const Vector<String>& cookieHostNames)
@@ -179,9 +186,9 @@
     return cookieDatabase().getAllCookies();
 }
 
-void NetworkStorageSession::getHostnamesWithCookies(HashSet<String>& /* hostnames */)
+void NetworkStorageSession::getHostnamesWithCookies(HashSet<String>& hostnames)
 {
-    // FIXME: Not yet implemented
+    hostnames = cookieDatabase().allDomains();
 }
 
 Vector<Cookie> NetworkStorageSession::getCookies(const URL&)

Modified: trunk/Source/WebKit/ChangeLog (262970 => 262971)


--- trunk/Source/WebKit/ChangeLog	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/ChangeLog	2020-06-12 19:47:15 UTC (rev 262971)
@@ -1,3 +1,35 @@
+2020-06-12  Takashi Komori  <takashi.kom...@sony.com>
+
+        [Curl] Implement functions to use ResourceLoadStatistics.
+        https://bugs.webkit.org/show_bug.cgi?id=207692
+
+        Reviewed by Don Olmstead.
+
+        Implement functions which are required to implement ResourceLoadStatistics for Curl port.
+
+        In NetworkDataTaskCurl.cpp we check if we should block cookies and block if needed.
+
+        Tests: http/tests/resourceLoadStatistics/
+
+        * NetworkProcess/NetworkDataTask.cpp:
+        (WebKit::NetworkDataTask::create):
+        * NetworkProcess/curl/NetworkDataTaskCurl.cpp:
+        (WebKit::NetworkDataTaskCurl::NetworkDataTaskCurl):
+        (WebKit::NetworkDataTaskCurl::createCurlRequest):
+        (WebKit::NetworkDataTaskCurl::willPerformHTTPRedirection):
+        (WebKit::NetworkDataTaskCurl::blockCookies):
+        (WebKit::NetworkDataTaskCurl::unblockCookies):
+        (WebKit::NetworkDataTaskCurl::shouldBlockCookies):
+        (WebKit::NetworkDataTaskCurl::isThirdPartyRequest):
+        * NetworkProcess/curl/NetworkDataTaskCurl.h:
+        * NetworkProcess/curl/NetworkSessionCurl.cpp:
+        (WebKit::NetworkSessionCurl::NetworkSessionCurl):
+        * UIProcess/API/C/WKWebsiteDataStoreRef.cpp:
+        (WKWebsiteDataStoreGetAllStorageAccessEntries):
+        * UIProcess/API/C/WKWebsiteDataStoreRef.h:
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::parameters):
+
 2020-06-12  Antoine Quint  <grao...@webkit.org>
 
         Double tap to zoom out doesn't work after upgrading to iOS 13

Modified: trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp (262970 => 262971)


--- trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -60,7 +60,7 @@
     return NetworkDataTaskSoup::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation);
 #endif
 #if USE(CURL)
-    return NetworkDataTaskCurl::create(session, client, parameters.request, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation);
+    return NetworkDataTaskCurl::create(session, client, parameters.request, parameters.webFrameID, parameters.webPageID, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.contentEncodingSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.isMainFrameNavigation, parameters.shouldRelaxThirdPartyCookieBlocking);
 #endif
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp (262970 => 262971)


--- trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -44,8 +44,11 @@
 
 using namespace WebCore;
 
-NetworkDataTaskCurl::NetworkDataTaskCurl(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& requestWithCredentials, StoredCredentialsPolicy storedCredentialsPolicy, ContentSniffingPolicy shouldContentSniff, ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation)
+NetworkDataTaskCurl::NetworkDataTaskCurl(NetworkSession& session, NetworkDataTaskClient& client, const ResourceRequest& requestWithCredentials, FrameIdentifier frameID, PageIdentifier& pageID, StoredCredentialsPolicy storedCredentialsPolicy, ContentSniffingPolicy shouldContentSniff, ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation, WebCore::ShouldRelaxThirdPartyCookieBlocking shouldRelaxThirdPartyCookieBlocking)
     : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation)
+    , m_frameID(frameID)
+    , m_pageID(pageID)
+    , m_shouldRelaxThirdPartyCookieBlocking(shouldRelaxThirdPartyCookieBlocking)
 {
     if (m_scheduledFailureType != NoFailure)
         return;
@@ -67,6 +70,12 @@
         }
     }
 
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    if (shouldBlockCookies(request))
+        blockCookies();
+#endif
+    restrictRequestReferrerToOriginIfNeeded(request);
+
     m_curlRequest = createCurlRequest(WTFMove(request));
     if (!m_initialCredential.isEmpty()) {
         m_curlRequest->setUserPass(m_initialCredential.user(), m_initialCredential.password());
@@ -124,7 +133,7 @@
 
 Ref<CurlRequest> NetworkDataTaskCurl::createCurlRequest(ResourceRequest&& request, RequestStatus status)
 {
-    if (status == RequestStatus::NewRequest)
+    if (status == RequestStatus::NewRequest && !m_blockingCookies)
         appendCookieHeader(request);
 
     // Creates a CurlRequest in suspended state.
@@ -296,6 +305,10 @@
         }
     }
 
+#if ENABLE(RESOURCE_LOAD_STATISTCS)
+    if (!m_blockingCookies && shouldBlockCookies(request))
+        blockCookies();
+#endif
     auto response = ResourceResponse(m_response);
     m_client->willPerformHTTPRedirection(WTFMove(response), WTFMove(request), [this, protectedThis = makeRef(*this), didChangeCredential, isCrossOrigin](const ResourceRequest& newRequest) {
         if (newRequest.isNull() || m_state == State::Canceling)
@@ -308,6 +321,7 @@
             m_startTime = MonotonicTime::now();
 
         auto requestCopy = newRequest;
+        restrictRequestReferrerToOriginIfNeeded(requestCopy);
         m_curlRequest = createCurlRequest(WTFMove(requestCopy));
         if (didChangeCredential && !m_initialCredential.isEmpty()) {
             m_curlRequest->setUserPass(m_initialCredential.user(), m_initialCredential.password());
@@ -463,4 +477,37 @@
     }
 }
 
+void NetworkDataTaskCurl::blockCookies()
+{
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    m_blockingCookies = true;
+#endif
+}
+
+void NetworkDataTaskCurl::unblockCookies()
+{
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    m_blockingCookies = false;
+#endif
+}
+
+bool NetworkDataTaskCurl::shouldBlockCookies(const WebCore::ResourceRequest& request)
+{
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    bool shouldBlockCookies = m_storedCredentialsPolicy == WebCore::StoredCredentialsPolicy::EphemeralStateless;
+
+    if (!shouldBlockCookies && m_session->networkStorageSession())
+        shouldBlockCookies = m_session->networkStorageSession()->shouldBlockCookies(request, m_frameID, m_pageID, m_shouldRelaxThirdPartyCookieBlocking);
+
+    if (shouldBlockCookies)
+        return true;
+#endif
+    return false;
+}
+
+bool NetworkDataTaskCurl::isThirdPartyRequest(const WebCore::ResourceRequest& request)
+{
+    return !WebCore::areRegistrableDomainsEqual(request.url(), request.firstPartyForCookies());
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h (262970 => 262971)


--- trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.h	2020-06-12 19:47:15 UTC (rev 262971)
@@ -27,8 +27,11 @@
 
 #include "NetworkDataTask.h"
 #include <WebCore/CurlRequestClient.h>
+#include <WebCore/FrameIdentifier.h>
+#include <WebCore/PageIdentifier.h>
 #include <WebCore/ProtectionSpace.h>
 #include <WebCore/ResourceResponse.h>
+#include <WebCore/ShouldRelaxThirdPartyCookieBlocking.h>
 
 namespace WebCore {
 class CurlRequest;
@@ -38,9 +41,9 @@
 
 class NetworkDataTaskCurl final : public NetworkDataTask, public WebCore::CurlRequestClient {
 public:
-    static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, 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, bool dataTaskIsForMainFrameNavigation, WebCore::ShouldRelaxThirdPartyCookieBlocking shouldRelaxThirdPartyCookieBlocking)
     {
-        return adoptRef(*new NetworkDataTaskCurl(session, client, request, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation));
+        return adoptRef(*new NetworkDataTaskCurl(session, client, request, frameID, pageID, storedCredentialsPolicy, shouldContentSniff, shouldContentEncodingSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, dataTaskIsForMainFrameNavigation, shouldRelaxThirdPartyCookieBlocking));
     }
 
     ~NetworkDataTaskCurl();
@@ -54,7 +57,7 @@
         ReusedRequest
     };
 
-    NetworkDataTaskCurl(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation);
+    NetworkDataTaskCurl(NetworkSession&, NetworkDataTaskClient&,  const WebCore::ResourceRequest&, WebCore::FrameIdentifier, WebCore::PageIdentifier&, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, WebCore::ContentEncodingSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, bool dataTaskIsForMainFrameNavigation, WebCore::ShouldRelaxThirdPartyCookieBlocking);
 
     void cancel() override;
     void resume() override;
@@ -82,6 +85,11 @@
     void appendCookieHeader(WebCore::ResourceRequest&);
     void handleCookieHeaders(const WebCore::ResourceRequest&, const WebCore::CurlResponse&);
 
+    bool isThirdPartyRequest(const WebCore::ResourceRequest&);
+    bool shouldBlockCookies(const WebCore::ResourceRequest&);
+    void blockCookies();
+    void unblockCookies();
+
     State m_state { State::Suspended };
 
     RefPtr<WebCore::CurlRequest> m_curlRequest;
@@ -89,6 +97,13 @@
     unsigned m_redirectCount { 0 };
     unsigned m_authFailureCount { 0 };
     MonotonicTime m_startTime;
+
+    WebCore::FrameIdentifier m_frameID;
+    WebCore::PageIdentifier m_pageID;
+
+    bool m_blockingCookies { false };
+
+    WebCore::ShouldRelaxThirdPartyCookieBlocking m_shouldRelaxThirdPartyCookieBlocking { WebCore::ShouldRelaxThirdPartyCookieBlocking::No };
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp (262970 => 262971)


--- trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -43,6 +43,14 @@
     if (!parameters.cookiePersistentStorageFile.isEmpty())
         networkStorageSession()->setCookieDatabase(makeUniqueRef<CookieJarDB>(parameters.cookiePersistentStorageFile));
     networkStorageSession()->setProxySettings(WTFMove(parameters.proxySettings));
+
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    m_resourceLoadStatisticsDirectory = parameters.resourceLoadStatisticsParameters.directory;
+    m_shouldIncludeLocalhostInResourceLoadStatistics = parameters.resourceLoadStatisticsParameters.shouldIncludeLocalhost ? ShouldIncludeLocalhost::Yes : ShouldIncludeLocalhost::No;
+    m_enableResourceLoadStatisticsDebugMode = parameters.resourceLoadStatisticsParameters.enableDebugMode ? EnableResourceLoadStatisticsDebugMode::Yes : EnableResourceLoadStatisticsDebugMode::No;
+    m_resourceLoadStatisticsManualPrevalentResource = parameters.resourceLoadStatisticsParameters.manualPrevalentResource;
+    setResourceLoadStatisticsEnabled(parameters.resourceLoadStatisticsParameters.enabled);
+#endif
 }
 
 NetworkSessionCurl::~NetworkSessionCurl()

Modified: trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp (262970 => 262971)


--- trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -36,6 +36,7 @@
 #include "WKSecurityOriginRef.h"
 #include "WKString.h"
 #include "WebDeviceOrientationAndMotionAccessController.h"
+#include "WebPageProxy.h"
 #include "WebResourceLoadStatisticsStore.h"
 #include "WebsiteData.h"
 #include "WebsiteDataFetchOption.h"
@@ -819,3 +820,18 @@
         completionHandler(context);
     });
 }
+
+void WKWebsiteDataStoreGetAllStorageAccessEntries(WKWebsiteDataStoreRef dataStoreRef, WKPageRef pageRef, void* context, WKWebsiteDataStoreGetAllStorageAccessEntriesFunction callback)
+{
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    WebKit::toImpl(dataStoreRef)->getAllStorageAccessEntries(toImpl(pageRef)->identifier(), [context, callback] (Vector<String>&& domains) {
+        auto domainArrayRef = WKMutableArrayCreate();
+        for (auto domain : domains)
+            WKArrayAppendItem(domainArrayRef, adoptWK(WKStringCreateWithUTF8CString(domain.utf8().data())).get());
+
+        callback(context, domainArrayRef);
+    });
+#else
+    callback(context, WKMutableArrayCreate());
+#endif
+}

Modified: trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h (262970 => 262971)


--- trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h	2020-06-12 19:47:15 UTC (rev 262971)
@@ -162,6 +162,9 @@
 
 WK_EXPORT void WKWebsiteDataStoreSetPerOriginStorageQuota(WKWebsiteDataStoreRef dataStoreRef, uint64_t quota) WK_C_API_DEPRECATED_WITH_REPLACEMENT(WKWebsiteDataStoreConfigurationSetPerOriginStorageQuota);
 
+typedef void(*WKWebsiteDataStoreGetAllStorageAccessEntriesFunction)(void* context, WKArrayRef domains);
+WK_EXPORT void WKWebsiteDataStoreGetAllStorageAccessEntries(WKWebsiteDataStoreRef dataStoreRef, WKPageRef pageRef, void* context, WKWebsiteDataStoreGetAllStorageAccessEntriesFunction callback);
+
 WK_EXPORT void WKWebsiteDataStoreClearAllDeviceOrientationPermissions(WKWebsiteDataStoreRef dataStoreRef);
 
 typedef void (*WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemovalFunction)(void* functionContext);

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (262970 => 262971)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -2324,6 +2324,9 @@
     parameters.perOriginStorageQuota = perOriginStorageQuota();
     parameters.perThirdPartyOriginStorageQuota = perThirdPartyOriginStorageQuota();
 
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+    parameters.networkSessionParameters.resourceLoadStatisticsParameters.enabled = m_resourceLoadStatisticsEnabled;
+#endif
     platformSetNetworkParameters(parameters);
 
     return parameters;

Modified: trunk/Tools/ChangeLog (262970 => 262971)


--- trunk/Tools/ChangeLog	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Tools/ChangeLog	2020-06-12 19:47:15 UTC (rev 262971)
@@ -1,3 +1,19 @@
+2020-06-12  Takashi Komori  <takashi.kom...@sony.com>
+
+        [Curl] Implement functions to use ResourceLoadStatistics.
+        https://bugs.webkit.org/show_bug.cgi?id=207692
+
+        Reviewed by Don Olmstead.
+
+        Implement functions which are required to implement ResourceLoadStatistics for Curl port.
+
+        Tests: http/tests/resourceLoadStatistics/
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::GetAllStorageAccessEntriesCallbackContext::GetAllStorageAccessEntriesCallbackContext):
+        (WTR::getAllStorageAccessEntriesCallback):
+        (WTR::TestController::getAllStorageAccessEntries):
+
 2020-06-12  Jonathan Bedard  <jbed...@apple.com>
 
         Support building test runners for watchOS and tvOS

Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (262970 => 262971)


--- trunk/Tools/WebKitTestRunner/TestController.cpp	2020-06-12 19:38:50 UTC (rev 262970)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp	2020-06-12 19:47:15 UTC (rev 262971)
@@ -3168,8 +3168,47 @@
 {
 }
 
+struct GetAllStorageAccessEntriesCallbackContext {
+    GetAllStorageAccessEntriesCallbackContext(TestController& controller, CompletionHandler<void(Vector<String>&&)>&& handler)
+        : testController(controller)
+        , completionHandler(WTFMove(handler))
+    {
+    }
+
+    TestController& testController;
+    CompletionHandler<void(Vector<String>&&)> completionHandler;
+    bool done { false };
+};
+
+void getAllStorageAccessEntriesCallback(void* userData, WKArrayRef domainList)
+{
+    auto* context = static_cast<GetAllStorageAccessEntriesCallbackContext*>(userData);
+
+    Vector<String> resultDomains;
+    for (int i = 0; i < WKArrayGetSize(domainList); i++) {
+        auto domain =  reinterpret_cast<WKStringRef>(WKArrayGetItemAtIndex(domainList, i));
+        auto buffer = std::vector<char>(WKStringGetMaximumUTF8CStringSize(domain));
+        auto stringLength = WKStringGetUTF8CString(domain, buffer.data(), buffer.size());
+
+        resultDomains.append(String::fromUTF8(buffer.data(), stringLength - 1));
+    }
+
+    if (context->completionHandler)
+        context->completionHandler(WTFMove(resultDomains));
+
+    context->done = true;
+    context->testController.notifyDone();
+}
+
 void TestController::getAllStorageAccessEntries()
 {
+    auto dataStore = WKContextGetWebsiteDataStore(platformContext());
+    GetAllStorageAccessEntriesCallbackContext context(*this, [this] (Vector<String>&& domains) {
+        m_currentInvocation->didReceiveAllStorageAccessEntries(WTFMove(domains));
+    });
+
+    WKWebsiteDataStoreGetAllStorageAccessEntries(dataStore, m_mainWebView->page(), &context, getAllStorageAccessEntriesCallback);
+    runUntil(context.done, noTimeout);
 }
 
 struct LoadedThirdPartyDomainsCallbackContext {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to