Diff
Modified: trunk/Source/WebCore/ChangeLog (254555 => 254556)
--- trunk/Source/WebCore/ChangeLog 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/ChangeLog 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1,3 +1,49 @@
+2020-01-14 Chris Dumez <[email protected]>
+
+ document.cookie should not do a sync IPC to the network process for iframes that do not have storage access
+ https://bugs.webkit.org/show_bug.cgi?id=206108
+
+ Reviewed by Geoff Garen and John Wilander.
+
+ When ITP is enabled and ThirdPartyCookieBlockingMode::All mode is used (default in Safari), we can now detect
+ that a third-party iframe does not have cookie access completely on the WebContent process side, instead of
+ doing the check on the Network process side. The benefit is that this avoids doing a synchronous IPC every
+ time a third-party iframe which does not have storage access tries to access document.cookie in _javascript_.
+ Given that this should apply to a lot of iframes, this change is very beneficial to performance.
+
+ No new tests, covered by existing tests that are still passing.
+
+ * loader/CookieJar.cpp:
+ (WebCore::CookieJar::cookies const):
+ (WebCore::CookieJar::setCookies):
+ (WebCore::CookieJar::cookieRequestHeaderFieldValue const):
+ (WebCore::CookieJar::getRawCookies const):
+ * platform/network/CacheValidation.cpp:
+ (WebCore::cookieRequestHeaderFieldValue):
+ * platform/network/NetworkStorageSession.h:
+ * platform/network/cf/NetworkStorageSessionCFNetWin.cpp:
+ (WebCore::NetworkStorageSession::setCookiesFromDOM const):
+ (WebCore::NetworkStorageSession::cookiesForDOM const):
+ (WebCore::NetworkStorageSession::cookieRequestHeaderFieldValue const):
+ (WebCore::NetworkStorageSession::getRawCookies const):
+ * platform/network/cocoa/NetworkStorageSessionCocoa.mm:
+ (WebCore::cookiesForURL):
+ (WebCore::cookiesForSession):
+ (WebCore::NetworkStorageSession::cookiesForDOM const):
+ (WebCore::NetworkStorageSession::cookieRequestHeaderFieldValue const):
+ (WebCore::NetworkStorageSession::setCookiesFromDOM const):
+ (WebCore::NetworkStorageSession::getRawCookies const):
+ * platform/network/curl/NetworkStorageSessionCurl.cpp:
+ (WebCore::NetworkStorageSession::setCookiesFromDOM const):
+ (WebCore::NetworkStorageSession::cookiesForDOM const):
+ (WebCore::NetworkStorageSession::getRawCookies const):
+ (WebCore::NetworkStorageSession::cookieRequestHeaderFieldValue const):
+ * platform/network/soup/NetworkStorageSessionSoup.cpp:
+ (WebCore::NetworkStorageSession::setCookiesFromDOM const):
+ (WebCore::NetworkStorageSession::getRawCookies const):
+ (WebCore::NetworkStorageSession::cookiesForDOM const):
+ (WebCore::NetworkStorageSession::cookieRequestHeaderFieldValue const):
+
2020-01-14 Peng Liu <[email protected]>
[Media in GPU process] Implement the remote video layer support
Modified: trunk/Source/WebCore/loader/CookieJar.cpp (254555 => 254556)
--- trunk/Source/WebCore/loader/CookieJar.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/loader/CookieJar.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -80,7 +80,7 @@
std::pair<String, bool> result;
if (auto* session = m_storageSessionProvider->storageSession())
- result = session->cookiesForDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, includeSecureCookies);
+ result = session->cookiesForDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, includeSecureCookies, ShouldAskITP::Yes);
else
ASSERT_NOT_REACHED();
@@ -114,7 +114,7 @@
}
if (auto* session = m_storageSessionProvider->storageSession())
- session->setCookiesFromDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, cookieString);
+ session->setCookiesFromDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, ShouldAskITP::Yes, cookieString);
else
ASSERT_NOT_REACHED();
}
@@ -131,7 +131,7 @@
std::pair<String, SecureCookiesAccessed> CookieJar::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
{
if (auto* session = m_storageSessionProvider->storageSession()) {
- std::pair<String, bool> result = session->cookieRequestHeaderFieldValue(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies);
+ std::pair<String, bool> result = session->cookieRequestHeaderFieldValue(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies, ShouldAskITP::Yes);
return { result.first, result.second ? SecureCookiesAccessed::Yes : SecureCookiesAccessed::No };
}
@@ -164,7 +164,7 @@
}
if (auto* session = m_storageSessionProvider->storageSession())
- return session->getRawCookies(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, cookies);
+ return session->getRawCookies(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, ShouldAskITP::Yes, cookies);
ASSERT_NOT_REACHED();
return false;
Modified: trunk/Source/WebCore/platform/network/CacheValidation.cpp (254555 => 254556)
--- trunk/Source/WebCore/platform/network/CacheValidation.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/platform/network/CacheValidation.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -340,7 +340,7 @@
static String cookieRequestHeaderFieldValue(const NetworkStorageSession& session, const ResourceRequest& request)
{
- return session.cookieRequestHeaderFieldValue(request.firstPartyForCookies(), SameSiteInfo::create(request), request.url(), WTF::nullopt, WTF::nullopt, request.url().protocolIs("https") ? IncludeSecureCookies::Yes : IncludeSecureCookies::No).first;
+ return session.cookieRequestHeaderFieldValue(request.firstPartyForCookies(), SameSiteInfo::create(request), request.url(), WTF::nullopt, WTF::nullopt, request.url().protocolIs("https") ? IncludeSecureCookies::Yes : IncludeSecureCookies::No, ShouldAskITP::Yes).first;
}
static String cookieRequestHeaderFieldValue(const CookieJar* cookieJar, const ResourceRequest& request)
Modified: trunk/Source/WebCore/platform/network/NetworkStorageSession.h (254555 => 254556)
--- trunk/Source/WebCore/platform/network/NetworkStorageSession.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/platform/network/NetworkStorageSession.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -76,6 +76,7 @@
enum class IncludeHttpOnlyCookies : bool;
enum class ThirdPartyCookieBlockingMode : uint8_t { All, AllOnSitesWithoutUserInteraction, OnlyAccordingToPerDomainPolicy };
enum class FirstPartyWebsiteDataRemovalMode : uint8_t { AllButCookies, None, AllButCookiesLiveOnTestingTimeout, AllButCookiesReproTestingTimeout };
+enum class ShouldAskITP : bool { No, Yes };
class NetworkStorageSession {
WTF_MAKE_NONCOPYABLE(NetworkStorageSession); WTF_MAKE_FAST_ALLOCATED;
@@ -127,7 +128,7 @@
WEBCORE_EXPORT bool cookiesEnabled() const;
WEBCORE_EXPORT void setCookie(const Cookie&);
WEBCORE_EXPORT void setCookies(const Vector<Cookie>&, const URL&, const URL& mainDocumentURL);
- WEBCORE_EXPORT void setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, const String&) const;
+ WEBCORE_EXPORT void setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, ShouldAskITP, const String&) const;
WEBCORE_EXPORT void deleteCookie(const Cookie&);
WEBCORE_EXPORT void deleteCookie(const URL&, const String&) const;
WEBCORE_EXPORT void deleteAllCookies();
@@ -137,11 +138,11 @@
WEBCORE_EXPORT Vector<Cookie> getAllCookies();
WEBCORE_EXPORT Vector<Cookie> getCookies(const URL&);
WEBCORE_EXPORT void hasCookies(const RegistrableDomain&, CompletionHandler<void(bool)>&&) const;
- WEBCORE_EXPORT bool getRawCookies(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, Vector<Cookie>&) const;
+ WEBCORE_EXPORT bool getRawCookies(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, ShouldAskITP, Vector<Cookie>&) const;
WEBCORE_EXPORT void flushCookieStore();
WEBCORE_EXPORT void getHostnamesWithCookies(HashSet<String>& hostnames);
- WEBCORE_EXPORT std::pair<String, bool> cookiesForDOM(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, IncludeSecureCookies) const;
- WEBCORE_EXPORT std::pair<String, bool> cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, IncludeSecureCookies) const;
+ WEBCORE_EXPORT std::pair<String, bool> cookiesForDOM(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, IncludeSecureCookies, ShouldAskITP) const;
+ WEBCORE_EXPORT std::pair<String, bool> cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL&, Optional<FrameIdentifier>, Optional<PageIdentifier>, IncludeSecureCookies, ShouldAskITP) const;
WEBCORE_EXPORT std::pair<String, bool> cookieRequestHeaderFieldValue(const CookieRequestHeaderFieldProxy&) const;
#if ENABLE(RESOURCE_LOAD_STATISTICS)
Modified: trunk/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNetWin.cpp (254555 => 254556)
--- trunk/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNetWin.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNetWin.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -189,7 +189,7 @@
return parsedCookies;
}
-void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, const String& value) const
+void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, const String& value) const
{
UNUSED_PARAM(frameID);
UNUSED_PARAM(pageID);
@@ -225,7 +225,7 @@
return false;
}
-std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP) const
{
UNUSED_PARAM(frameID);
UNUSED_PARAM(pageID);
@@ -240,7 +240,7 @@
return { cookieString, didAccessSecureCookies };
}
-std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP) const
{
UNUSED_PARAM(frameID);
UNUSED_PARAM(pageID);
@@ -255,7 +255,7 @@
std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const CookieRequestHeaderFieldProxy& headerFieldProxy) const
{
- return cookieRequestHeaderFieldValue(headerFieldProxy.firstParty, headerFieldProxy.sameSiteInfo, headerFieldProxy.url, headerFieldProxy.frameID, headerFieldProxy.pageID, headerFieldProxy.includeSecureCookies);
+ return cookieRequestHeaderFieldValue(headerFieldProxy.firstParty, headerFieldProxy.sameSiteInfo, headerFieldProxy.url, headerFieldProxy.frameID, headerFieldProxy.pageID, headerFieldProxy.includeSecureCookies, ShouldAskITP::Yes);
}
bool NetworkStorageSession::cookiesEnabled() const
@@ -264,7 +264,7 @@
return policy == CFHTTPCookieStorageAcceptPolicyOnlyFromMainDocumentDomain || policy == CFHTTPCookieStorageAcceptPolicyExclusivelyFromMainDocumentDomain || policy == CFHTTPCookieStorageAcceptPolicyAlways;
}
-bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, Vector<Cookie>& rawCookies) const
+bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, Vector<Cookie>& rawCookies) const
{
UNUSED_PARAM(frameID);
UNUSED_PARAM(pageID);
Modified: trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm (254555 => 254556)
--- trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm 2020-01-15 03:10:56 UTC (rev 254556)
@@ -308,26 +308,27 @@
return filteredCookies;
}
-static NSArray *cookiesForURL(const NetworkStorageSession& session, const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID)
+static NSArray *cookiesForURL(const NetworkStorageSession& session, const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP shouldAskITP)
{
#if ENABLE(RESOURCE_LOAD_STATISTICS)
- if (session.shouldBlockCookies(firstParty, url, frameID, pageID))
+ if (shouldAskITP == ShouldAskITP::Yes && session.shouldBlockCookies(firstParty, url, frameID, pageID))
return nil;
#else
UNUSED_PARAM(frameID);
UNUSED_PARAM(pageID);
+ UNUSED_PARAM(shouldAskITP);
#endif
return httpCookiesForURL(session.cookieStorage().get(), firstParty, sameSiteInfo, url);
}
enum IncludeHTTPOnlyOrNot { DoNotIncludeHTTPOnly, IncludeHTTPOnly };
-static std::pair<String, bool> cookiesForSession(const NetworkStorageSession& session, const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeHTTPOnlyOrNot includeHTTPOnly, IncludeSecureCookies includeSecureCookies)
+static std::pair<String, bool> cookiesForSession(const NetworkStorageSession& session, const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeHTTPOnlyOrNot includeHTTPOnly, IncludeSecureCookies includeSecureCookies, ShouldAskITP shouldAskITP = ShouldAskITP::Yes)
{
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
BEGIN_BLOCK_OBJC_EXCEPTIONS;
- NSArray *cookies = cookiesForURL(session, firstParty, sameSiteInfo, url, frameID, pageID);
+ NSArray *cookies = cookiesForURL(session, firstParty, sameSiteInfo, url, frameID, pageID, shouldAskITP);
if (![cookies count])
return { String(), false }; // Return a null string, not an empty one that StringBuilder would create below.
@@ -377,14 +378,14 @@
CFHTTPCookieStorageDeleteAllCookies(cookieStorage);
}
-std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP shouldAskITP) const
{
- return cookiesForSession(*this, firstParty, sameSiteInfo, url, frameID, pageID, DoNotIncludeHTTPOnly, includeSecureCookies);
+ return cookiesForSession(*this, firstParty, sameSiteInfo, url, frameID, pageID, DoNotIncludeHTTPOnly, includeSecureCookies, shouldAskITP);
}
-std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP shouldAskITP) const
{
- return cookiesForSession(*this, firstParty, sameSiteInfo, url, frameID, pageID, IncludeHTTPOnly, includeSecureCookies);
+ return cookiesForSession(*this, firstParty, sameSiteInfo, url, frameID, pageID, IncludeHTTPOnly, includeSecureCookies, shouldAskITP);
}
std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const CookieRequestHeaderFieldProxy& headerFieldProxy) const
@@ -392,12 +393,21 @@
return cookiesForSession(*this, headerFieldProxy.firstParty, headerFieldProxy.sameSiteInfo, headerFieldProxy.url, headerFieldProxy.frameID, headerFieldProxy.pageID, IncludeHTTPOnly, headerFieldProxy.includeSecureCookies);
}
-void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, const String& cookieStr) const
+void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP shouldAskITP, const String& cookieStr) const
{
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
BEGIN_BLOCK_OBJC_EXCEPTIONS;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ if (shouldAskITP == ShouldAskITP::Yes && shouldBlockCookies(firstParty, url, frameID, pageID))
+ return;
+#else
+ UNUSED_PARAM(frameID);
+ UNUSED_PARAM(pageID);
+ UNUSED_PARAM(shouldAskITP);
+#endif
+
// <rdar://problem/5632883> On 10.5, NSHTTPCookieStorage would store an empty cookie,
// which would be sent as "Cookie: =".
if (cookieStr.isEmpty())
@@ -423,14 +433,6 @@
#endif
ASSERT([filteredCookies.get() count] <= 1);
-#if ENABLE(RESOURCE_LOAD_STATISTICS)
- if (shouldBlockCookies(firstParty, url, frameID, pageID))
- return;
-#else
- UNUSED_PARAM(frameID);
- UNUSED_PARAM(pageID);
-#endif
-
setHTTPCookiesForURL(cookieStorage().get(), filteredCookies.get(), cookieURL, firstParty, sameSiteInfo);
END_BLOCK_OBJC_EXCEPTIONS;
@@ -457,12 +459,12 @@
return false;
}
-bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, Vector<Cookie>& rawCookies) const
+bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP shouldAskITP, Vector<Cookie>& rawCookies) const
{
rawCookies.clear();
BEGIN_BLOCK_OBJC_EXCEPTIONS;
- NSArray *cookies = cookiesForURL(*this, firstParty, sameSiteInfo, url, frameID, pageID);
+ NSArray *cookies = cookiesForURL(*this, firstParty, sameSiteInfo, url, frameID, pageID, shouldAskITP);
NSUInteger count = [cookies count];
rawCookies.reserveCapacity(count);
for (NSUInteger i = 0; i < count; ++i) {
Modified: trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp (254555 => 254556)
--- trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/platform/network/curl/NetworkStorageSessionCurl.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -80,7 +80,7 @@
return m_cookieDatabase;
}
-void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, const String& value) const
+void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, const String& value) const
{
cookieStorage().setCookiesFromDOM(*this, firstParty, sameSiteInfo, url, frameID, pageID, value);
}
@@ -90,7 +90,7 @@
return cookieStorage().cookiesEnabled(*this);
}
-std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP) const
{
return cookieStorage().cookiesForDOM(*this, firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies);
}
@@ -160,7 +160,7 @@
completionHandler(false);
}
-bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, Vector<Cookie>& rawCookies) const
+bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, Vector<Cookie>& rawCookies) const
{
return cookieStorage().getRawCookies(*this, firstParty, sameSiteInfo, url, frameID, pageID, rawCookies);
}
@@ -170,7 +170,7 @@
// FIXME: Implement for WebKit to use.
}
-std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP) const
{
return cookieStorage().cookieRequestHeaderFieldValue(*this, firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies);
}
Modified: trunk/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp (254555 => 254556)
--- trunk/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -261,7 +261,7 @@
return false;
}
-void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, const String& value) const
+void NetworkStorageSession::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, const String& value) const
{
UNUSED_PARAM(frameID);
UNUSED_PARAM(pageID);
@@ -432,7 +432,7 @@
completionHandler(false);
}
-bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, Vector<Cookie>& rawCookies) const
+bool NetworkStorageSession::getRawCookies(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP, Vector<Cookie>& rawCookies) const
{
UNUSED_PARAM(firstParty);
UNUSED_PARAM(frameID);
@@ -502,7 +502,7 @@
return { String::fromUTF8(cookieHeader.get()), didAccessSecureCookies };
}
-std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookiesForDOM(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP) const
{
UNUSED_PARAM(firstParty);
UNUSED_PARAM(frameID);
@@ -510,7 +510,7 @@
return cookiesForSession(*this, url, false, includeSecureCookies);
}
-std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies) const
+std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo&, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP) const
{
UNUSED_PARAM(firstParty);
UNUSED_PARAM(frameID);
@@ -521,7 +521,7 @@
std::pair<String, bool> NetworkStorageSession::cookieRequestHeaderFieldValue(const CookieRequestHeaderFieldProxy& headerFieldProxy) const
{
- return cookieRequestHeaderFieldValue(headerFieldProxy.firstParty, headerFieldProxy.sameSiteInfo, headerFieldProxy.url, headerFieldProxy.frameID, headerFieldProxy.pageID, headerFieldProxy.includeSecureCookies);
+ return cookieRequestHeaderFieldValue(headerFieldProxy.firstParty, headerFieldProxy.sameSiteInfo, headerFieldProxy.url, headerFieldProxy.frameID, headerFieldProxy.pageID, headerFieldProxy.includeSecureCookies, ShouldAskITP::Yes);
}
void NetworkStorageSession::flushCookieStore()
Modified: trunk/Source/WebKit/ChangeLog (254555 => 254556)
--- trunk/Source/WebKit/ChangeLog 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/ChangeLog 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1,3 +1,69 @@
+2020-01-14 Chris Dumez <[email protected]>
+
+ document.cookie should not do a sync IPC to the network process for iframes that do not have storage access
+ https://bugs.webkit.org/show_bug.cgi?id=206108
+
+ Reviewed by Geoff Garen and John Wilander.
+
+ When ITP is enabled and ThirdPartyCookieBlockingMode::All mode is used (default in Safari), we can now detect
+ that a third-party iframe does not have cookie access completely on the WebContent process side, instead of
+ doing the check on the Network process side. The benefit is that this avoids doing a synchronous IPC every
+ time a third-party iframe which does not have storage access tries to access document.cookie in _javascript_.
+ Given that this should apply to a lot of iframes, this change is very beneficial to performance.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::cookiesForDOM):
+ (WebKit::NetworkConnectionToWebProcess::setCookiesFromDOM):
+ (WebKit::NetworkConnectionToWebProcess::cookieRequestHeaderFieldValue):
+ (WebKit::NetworkConnectionToWebProcess::getRawCookies):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ * NetworkProcess/NetworkResourceLoader.cpp:
+ (WebKit::logCookieInformationInternal):
+ * NetworkProcess/NetworkSessionCreationParameters.cpp:
+ (WebKit::NetworkSessionCreationParameters::encode const):
+ (WebKit::NetworkSessionCreationParameters::decode):
+ * NetworkProcess/NetworkSessionCreationParameters.h:
+ * Scripts/webkit/messages.py:
+ * Shared/WebProcessDataStoreParameters.h:
+ (WebKit::WebProcessDataStoreParameters::encode const):
+ (WebKit::WebProcessDataStoreParameters::decode):
+ * UIProcess/Network/NetworkProcessProxy.cpp:
+ (WebKit::NetworkProcessProxy::setShouldBlockThirdPartyCookiesForTesting):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::ensureNetworkProcess):
+ (WebKit::WebProcessPool::webProcessDataStoreParameters):
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::setShouldBlockThirdPartyCookiesForTesting):
+ * UIProcess/WebProcessProxy.h:
+ * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
+ (WebKit::WebsiteDataStore::thirdPartyCookieBlockingMode const):
+ (WebKit::WebsiteDataStore::parameters):
+ * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+ (WebKit::WebsiteDataStore::thirdPartyCookieBlockingMode const):
+ (WebKit::WebsiteDataStore::setResourceLoadStatisticsShouldBlockThirdPartyCookiesForTesting):
+ * UIProcess/WebsiteData/WebsiteDataStore.h:
+ * WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp:
+ (WebKit::WebResourceLoadObserver::requestStorageAccessUnderOpener):
+ (WebKit::WebResourceLoadObserver::logUserInteractionWithReducedTimeResolution):
+ * WebProcess/WebCoreSupport/WebResourceLoadObserver.h:
+ * WebProcess/WebPage/WebCookieJar.cpp:
+ (WebKit::shouldBlockCookies):
+ (WebKit::WebCookieJar::cookies const):
+ (WebKit::WebCookieJar::setCookies):
+ (WebKit::WebCookieJar::cookieRequestHeaderFieldValue const):
+ (WebKit::WebCookieJar::getRawCookies const):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::addDomainWithPageLevelStorageAccess):
+ (WebKit::WebPage::hasPageLevelStorageAccess const):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::setWebsiteDataStoreParameters):
+ (WebKit::WebProcess::setShouldBlockThirdPartyCookiesForTesting):
+ * WebProcess/WebProcess.h:
+ (WebKit::WebProcess::thirdPartyCookieBlockingMode const):
+ * WebProcess/WebProcess.messages.in:
+
2020-01-14 Peng Liu <[email protected]>
[Media in GPU process] Implement the remote video layer support
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (254555 => 254556)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -564,12 +564,12 @@
m_schemeRegistry->registerURLSchemeAsCORSEnabled(WTFMove(scheme));
}
-void NetworkConnectionToWebProcess::cookiesForDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, CompletionHandler<void(String cookieString, bool secureCookiesAccessed)>&& completionHandler)
+void NetworkConnectionToWebProcess::cookiesForDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, FrameIdentifier frameID, PageIdentifier pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP shouldAskITP, CompletionHandler<void(String cookieString, bool secureCookiesAccessed)>&& completionHandler)
{
auto* networkStorageSession = storageSession();
if (!networkStorageSession)
return completionHandler({ }, false);
- auto result = networkStorageSession->cookiesForDOM(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies);
+ auto result = networkStorageSession->cookiesForDOM(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies, shouldAskITP);
#if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
if (auto* session = networkSession()) {
if (session->shouldLogCookieInformation())
@@ -579,12 +579,12 @@
completionHandler(WTFMove(result.first), result.second);
}
-void NetworkConnectionToWebProcess::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<WebCore::FrameIdentifier> frameID, Optional<PageIdentifier> pageID, const String& cookieString)
+void NetworkConnectionToWebProcess::setCookiesFromDOM(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, WebCore::FrameIdentifier frameID, PageIdentifier pageID, ShouldAskITP shouldAskITP, const String& cookieString)
{
auto* networkStorageSession = storageSession();
if (!networkStorageSession)
return;
- networkStorageSession->setCookiesFromDOM(firstParty, sameSiteInfo, url, frameID, pageID, cookieString);
+ networkStorageSession->setCookiesFromDOM(firstParty, sameSiteInfo, url, frameID, pageID, shouldAskITP, cookieString);
#if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
if (auto* session = networkSession()) {
if (session->shouldLogCookieInformation())
@@ -601,22 +601,22 @@
completionHandler(networkStorageSession->cookiesEnabled());
}
-void NetworkConnectionToWebProcess::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, CompletionHandler<void(String, bool)>&& completionHandler)
+void NetworkConnectionToWebProcess::cookieRequestHeaderFieldValue(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, IncludeSecureCookies includeSecureCookies, ShouldAskITP shouldAskITP, CompletionHandler<void(String, bool)>&& completionHandler)
{
auto* networkStorageSession = storageSession();
if (!networkStorageSession)
return completionHandler({ }, false);
- auto result = networkStorageSession->cookieRequestHeaderFieldValue(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies);
+ auto result = networkStorageSession->cookieRequestHeaderFieldValue(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies, shouldAskITP);
completionHandler(WTFMove(result.first), result.second);
}
-void NetworkConnectionToWebProcess::getRawCookies(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, CompletionHandler<void(Vector<WebCore::Cookie>&&)>&& completionHandler)
+void NetworkConnectionToWebProcess::getRawCookies(const URL& firstParty, const SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, ShouldAskITP shouldAskITP, CompletionHandler<void(Vector<WebCore::Cookie>&&)>&& completionHandler)
{
auto* networkStorageSession = storageSession();
if (!networkStorageSession)
return completionHandler({ });
Vector<WebCore::Cookie> result;
- networkStorageSession->getRawCookies(firstParty, sameSiteInfo, url, frameID, pageID, result);
+ networkStorageSession->getRawCookies(firstParty, sameSiteInfo, url, frameID, pageID, shouldAskITP, result);
completionHandler(WTFMove(result));
}
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (254555 => 254556)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -58,6 +58,7 @@
class ResourceRequest;
enum class StorageAccessPromptWasShown : bool;
enum class StorageAccessWasGranted : bool;
+enum class ShouldAskITP : bool;
struct SameSiteInfo;
enum class IncludeSecureCookies : bool;
@@ -197,11 +198,11 @@
void registerURLSchemesAsCORSEnabled(Vector<String>&& schemes);
- void cookiesForDOM(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, Optional<WebCore::FrameIdentifier>, Optional<WebCore::PageIdentifier>, WebCore::IncludeSecureCookies, CompletionHandler<void(String cookieString, bool secureCookiesAccessed)>&&);
- void setCookiesFromDOM(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, Optional<WebCore::FrameIdentifier>, Optional<WebCore::PageIdentifier>, const String&);
+ void cookiesForDOM(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, WebCore::FrameIdentifier, WebCore::PageIdentifier, WebCore::IncludeSecureCookies, WebCore::ShouldAskITP, CompletionHandler<void(String cookieString, bool secureCookiesAccessed)>&&);
+ void setCookiesFromDOM(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, WebCore::FrameIdentifier, WebCore::PageIdentifier, WebCore::ShouldAskITP, const String&);
void cookiesEnabled(CompletionHandler<void(bool)>&&);
- void cookieRequestHeaderFieldValue(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, Optional<WebCore::FrameIdentifier>, Optional<WebCore::PageIdentifier>, WebCore::IncludeSecureCookies, CompletionHandler<void(String cookieString, bool secureCookiesAccessed)>&&);
- void getRawCookies(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, Optional<WebCore::FrameIdentifier>, Optional<WebCore::PageIdentifier>, CompletionHandler<void(Vector<WebCore::Cookie>&&)>&&);
+ void cookieRequestHeaderFieldValue(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, Optional<WebCore::FrameIdentifier>, Optional<WebCore::PageIdentifier>, WebCore::IncludeSecureCookies, WebCore::ShouldAskITP, CompletionHandler<void(String cookieString, bool secureCookiesAccessed)>&&);
+ void getRawCookies(const URL& firstParty, const WebCore::SameSiteInfo&, const URL&, Optional<WebCore::FrameIdentifier>, Optional<WebCore::PageIdentifier>, WebCore::ShouldAskITP, CompletionHandler<void(Vector<WebCore::Cookie>&&)>&&);
void deleteCookie(const URL&, const String& cookieName);
void registerFileBlobURL(const URL&, const String& path, SandboxExtension::Handle&&, const String& contentType);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (254555 => 254556)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2020-01-15 03:10:56 UTC (rev 254556)
@@ -34,11 +34,11 @@
StartDownload(WebKit::DownloadID downloadID, WebCore::ResourceRequest request, String suggestedName)
ConvertMainResourceLoadToDownload(uint64_t mainResourceLoadIdentifier, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, WebCore::ResourceResponse response)
- CookiesForDOM(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, Optional<WebCore::FrameIdentifier> frameID, Optional<WebCore::PageIdentifier> pageID, enum:bool WebCore::IncludeSecureCookies includeSecureCookies) -> (String cookieString, bool didAccessSecureCookies) Synchronous
- SetCookiesFromDOM(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, Optional<WebCore::FrameIdentifier> frameID, Optional<WebCore::PageIdentifier> pageID, String cookieString)
+ CookiesForDOM(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, enum:bool WebCore::IncludeSecureCookies includeSecureCookies, enum:bool WebCore::ShouldAskITP shouldAskITP) -> (String cookieString, bool didAccessSecureCookies) Synchronous
+ SetCookiesFromDOM(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID, enum:bool WebCore::ShouldAskITP shouldAskITP, String cookieString)
CookiesEnabled() -> (bool enabled) Synchronous
- CookieRequestHeaderFieldValue(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, Optional<WebCore::FrameIdentifier> frameID, Optional<WebCore::PageIdentifier> pageID, enum:bool WebCore::IncludeSecureCookies includeSecureCookies) -> (String cookieString, bool didAccessSecureCookies) Synchronous
- GetRawCookies(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, Optional<WebCore::FrameIdentifier> frameID, Optional<WebCore::PageIdentifier> pageID) -> (Vector<WebCore::Cookie> cookies) Synchronous
+ CookieRequestHeaderFieldValue(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, Optional<WebCore::FrameIdentifier> frameID, Optional<WebCore::PageIdentifier> pageID, enum:bool WebCore::IncludeSecureCookies includeSecureCookies, enum:bool WebCore::ShouldAskITP shouldAskITP) -> (String cookieString, bool didAccessSecureCookies) Synchronous
+ GetRawCookies(URL firstParty, struct WebCore::SameSiteInfo sameSiteInfo, URL url, Optional<WebCore::FrameIdentifier> frameID, Optional<WebCore::PageIdentifier> pageID, enum:bool WebCore::ShouldAskITP shouldAskITP) -> (Vector<WebCore::Cookie> cookies) Synchronous
DeleteCookie(URL url, String cookieName)
RegisterFileBlobURL(URL url, String path, WebKit::SandboxExtension::Handle extensionHandle, String contentType)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (254555 => 254556)
--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1225,7 +1225,7 @@
ASSERT(NetworkResourceLoader::shouldLogCookieInformation(connection, networkStorageSession.sessionID()));
Vector<WebCore::Cookie> cookies;
- if (!networkStorageSession.getRawCookies(firstParty, sameSiteInfo, url, frameID, pageID, cookies))
+ if (!networkStorageSession.getRawCookies(firstParty, sameSiteInfo, url, frameID, pageID, ShouldAskITP::Yes, cookies))
return;
auto escapedURL = escapeForJSON(url.string());
Modified: trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp (254555 => 254556)
--- trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -68,7 +68,9 @@
encoder << shouldIncludeLocalhostInResourceLoadStatistics;
encoder << enableResourceLoadStatisticsDebugMode;
encoder << resourceLoadStatisticsManualPrevalentResource;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
encoder << thirdPartyCookieBlockingMode;
+#endif
encoder << firstPartyWebsiteDataRemovalMode;
encoder << networkCacheDirectory << networkCacheDirectoryExtensionHandle;
@@ -202,10 +204,12 @@
if (!resourceLoadStatisticsManualPrevalentResource)
return WTF::nullopt;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
Optional<WebCore::ThirdPartyCookieBlockingMode> thirdPartyCookieBlockingMode;
decoder >> thirdPartyCookieBlockingMode;
if (!thirdPartyCookieBlockingMode)
return WTF::nullopt;
+#endif
Optional<WebCore::FirstPartyWebsiteDataRemovalMode> firstPartyWebsiteDataRemovalMode;
decoder >> firstPartyWebsiteDataRemovalMode;
@@ -300,7 +304,9 @@
, WTFMove(*enableResourceLoadStatisticsLogTestingEvent)
, WTFMove(*shouldIncludeLocalhostInResourceLoadStatistics)
, WTFMove(*enableResourceLoadStatisticsDebugMode)
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
, WTFMove(*thirdPartyCookieBlockingMode)
+#endif
, WTFMove(*firstPartyWebsiteDataRemovalMode)
, WTFMove(*deviceManagementRestrictionsEnabled)
, WTFMove(*allLoadsBlockedByDeviceManagementRestrictionsForTesting)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h (254555 => 254556)
--- trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -86,7 +86,9 @@
bool enableResourceLoadStatisticsLogTestingEvent { false };
bool shouldIncludeLocalhostInResourceLoadStatistics { true };
bool enableResourceLoadStatisticsDebugMode { false };
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
WebCore::ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode { WebCore::ThirdPartyCookieBlockingMode::All };
+#endif
WebCore::FirstPartyWebsiteDataRemovalMode firstPartyWebsiteDataRemovalMode { WebCore::FirstPartyWebsiteDataRemovalMode::AllButCookies };
bool deviceManagementRestrictionsEnabled { false };
bool allLoadsBlockedByDeviceManagementRestrictionsForTesting { false };
Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (254555 => 254556)
--- trunk/Source/WebKit/Scripts/webkit/messages.py 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py 2020-01-15 03:10:56 UTC (rev 254556)
@@ -585,6 +585,7 @@
'WebCore::ServiceWorkerState': ['<WebCore/ServiceWorkerTypes.h>'],
'WebCore::ShippingContactUpdate': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
'WebCore::ShippingMethodUpdate': ['<WebCore/ApplePaySessionPaymentRequest.h>'],
+ 'WebCore::ShouldAskITP': ['<WebCore/NetworkStorageSession.h>'],
'WebCore::ShouldNotifyWhenResolved': ['<WebCore/ServiceWorkerTypes.h>'],
'WebCore::ShouldSample': ['<WebCore/DiagnosticLoggingClient.h>'],
'WebCore::StorageAccessPromptWasShown': ['<WebCore/DocumentStorageAccess.h>'],
Modified: trunk/Source/WebKit/Shared/WebProcessDataStoreParameters.h (254555 => 254556)
--- trunk/Source/WebKit/Shared/WebProcessDataStoreParameters.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/Shared/WebProcessDataStoreParameters.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -26,6 +26,7 @@
#pragma once
#include "SandboxExtension.h"
+#include <WebCore/NetworkStorageSession.h>
#include <pal/SessionID.h>
#include <wtf/HashMap.h>
@@ -45,6 +46,9 @@
String _javascript_ConfigurationDirectory;
SandboxExtension::Handle _javascript_ConfigurationDirectoryExtensionHandle;
HashMap<unsigned, WallTime> plugInAutoStartOriginHashes;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ WebCore::ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode { WebCore::ThirdPartyCookieBlockingMode::All };
+#endif
bool resourceLoadStatisticsEnabled { false };
template<class Encoder> void encode(Encoder&) const;
@@ -67,6 +71,9 @@
encoder << _javascript_ConfigurationDirectory;
encoder << _javascript_ConfigurationDirectoryExtensionHandle;
encoder << plugInAutoStartOriginHashes;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ encoder << thirdPartyCookieBlockingMode;
+#endif
encoder << resourceLoadStatisticsEnabled;
}
@@ -132,6 +139,13 @@
if (!plugInAutoStartOriginHashes)
return WTF::nullopt;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ Optional<WebCore::ThirdPartyCookieBlockingMode> thirdPartyCookieBlockingMode;
+ decoder >> thirdPartyCookieBlockingMode;
+ if (!thirdPartyCookieBlockingMode)
+ return WTF::nullopt;
+#endif
+
bool resourceLoadStatisticsEnabled = false;
if (!decoder.decode(resourceLoadStatisticsEnabled))
return WTF::nullopt;
@@ -150,6 +164,9 @@
WTFMove(_javascript_ConfigurationDirectory),
WTFMove(*_javascript_ConfigurationDirectoryExtensionHandle),
WTFMove(*plugInAutoStartOriginHashes),
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ *thirdPartyCookieBlockingMode,
+#endif
resourceLoadStatisticsEnabled
};
}
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1115,11 +1115,6 @@
void NetworkProcessProxy::setShouldBlockThirdPartyCookiesForTesting(PAL::SessionID sessionID, ThirdPartyCookieBlockingMode blockingMode, CompletionHandler<void()>&& completionHandler)
{
- if (!canSendMessage()) {
- completionHandler();
- return;
- }
-
sendWithAsyncReply(Messages::NetworkProcess::SetShouldBlockThirdPartyCookiesForTesting(sessionID, blockingMode), WTFMove(completionHandler));
}
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -580,7 +580,9 @@
bool enableResourceLoadStatisticsLogTestingEvent = false;
bool shouldIncludeLocalhost = true;
bool enableResourceLoadStatisticsDebugMode = false;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
WebCore::ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::All;
+#endif
WebCore::FirstPartyWebsiteDataRemovalMode firstPartyWebsiteDataRemovalMode = WebCore::FirstPartyWebsiteDataRemovalMode::AllButCookies;
WebCore::RegistrableDomain manualPrevalentResource { };
if (withWebsiteDataStore) {
@@ -592,7 +594,9 @@
auto networkSessionParameters = withWebsiteDataStore->parameters().networkSessionParameters;
shouldIncludeLocalhost = networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics;
enableResourceLoadStatisticsDebugMode = networkSessionParameters.enableResourceLoadStatisticsDebugMode;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
thirdPartyCookieBlockingMode = networkSessionParameters.thirdPartyCookieBlockingMode;
+#endif
firstPartyWebsiteDataRemovalMode = networkSessionParameters.firstPartyWebsiteDataRemovalMode;
manualPrevalentResource = networkSessionParameters.resourceLoadStatisticsManualPrevalentResource;
}
@@ -614,7 +618,9 @@
auto networkSessionParameters = m_websiteDataStore->parameters().networkSessionParameters;
shouldIncludeLocalhost = networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics;
enableResourceLoadStatisticsDebugMode = networkSessionParameters.enableResourceLoadStatisticsDebugMode;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
thirdPartyCookieBlockingMode = networkSessionParameters.thirdPartyCookieBlockingMode;
+#endif
firstPartyWebsiteDataRemovalMode = networkSessionParameters.firstPartyWebsiteDataRemovalMode;
manualPrevalentResource = networkSessionParameters.resourceLoadStatisticsManualPrevalentResource;
}
@@ -639,7 +645,9 @@
parameters.defaultDataStoreParameters.networkSessionParameters.enableResourceLoadStatisticsLogTestingEvent = enableResourceLoadStatisticsLogTestingEvent;
parameters.defaultDataStoreParameters.networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics = shouldIncludeLocalhost;
parameters.defaultDataStoreParameters.networkSessionParameters.enableResourceLoadStatisticsDebugMode = enableResourceLoadStatisticsDebugMode;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
parameters.defaultDataStoreParameters.networkSessionParameters.thirdPartyCookieBlockingMode = thirdPartyCookieBlockingMode;
+#endif
parameters.defaultDataStoreParameters.networkSessionParameters.firstPartyWebsiteDataRemovalMode = firstPartyWebsiteDataRemovalMode;
parameters.defaultDataStoreParameters.networkSessionParameters.resourceLoadStatisticsManualPrevalentResource = manualPrevalentResource;
@@ -945,6 +953,9 @@
WTFMove(_javascript_ConfigurationDirectory),
WTFMove(_javascript_ConfigurationDirectoryExtensionHandle),
WTFMove(plugInAutoStartOriginHashes),
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ websiteDataStore.thirdPartyCookieBlockingMode(),
+#endif
websiteDataStore.resourceLoadStatisticsEnabled()
};
}
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -433,6 +433,11 @@
for (auto& page : globalPageMap())
page.value->postMessageToInjectedBundle("ResourceLoadStatisticsTelemetryFinished", messageBody);
}
+
+void WebProcessProxy::setShouldBlockThirdPartyCookiesForTesting(ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode, CompletionHandler<void()>&& completionHandler)
+{
+ sendWithAsyncReply(Messages::WebProcess::SetShouldBlockThirdPartyCookiesForTesting(thirdPartyCookieBlockingMode), WTFMove(completionHandler));
+}
#endif
Ref<WebPageProxy> WebProcessProxy::createWebPage(PageClient& pageClient, Ref<API::PageConfiguration>&& pageConfiguration)
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -66,6 +66,7 @@
struct PluginInfo;
struct PrewarmInformation;
struct SecurityOriginData;
+enum class ThirdPartyCookieBlockingMode : uint8_t;
}
namespace WebKit {
@@ -206,6 +207,8 @@
static void notifyWebsiteDataDeletionForRegistrableDomainsFinished();
static void notifyWebsiteDataScanForRegistrableDomainsFinished();
+
+ void setShouldBlockThirdPartyCookiesForTesting(WebCore::ThirdPartyCookieBlockingMode, CompletionHandler<void()>&&);
#endif
void enableSuddenTermination();
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm 2020-01-15 03:10:56 UTC (rev 254556)
@@ -61,6 +61,20 @@
static NSString * const WebKitNetworkLoadThrottleLatencyMillisecondsDefaultsKey = @"WebKitNetworkLoadThrottleLatencyMilliseconds";
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+WebCore::ThirdPartyCookieBlockingMode WebsiteDataStore::thirdPartyCookieBlockingMode() const
+{
+ if (!m_thirdPartyCookieBlockingMode) {
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ if ([defaults boolForKey:[NSString stringWithFormat:@"Experimental%@", WebPreferencesKey::isThirdPartyCookieBlockingDisabledKey().createCFString().get()]])
+ m_thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::AllOnSitesWithoutUserInteraction;
+ else
+ m_thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::All;
+ }
+ return *m_thirdPartyCookieBlockingMode;
+}
+#endif
+
WebsiteDataStoreParameters WebsiteDataStore::parameters()
{
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
@@ -70,7 +84,6 @@
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
bool shouldLogCookieInformation = false;
bool enableResourceLoadStatisticsDebugMode = false;
- auto thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::All;
auto firstPartyWebsiteDataRemovalMode = WebCore::FirstPartyWebsiteDataRemovalMode::AllButCookies;
bool enableLegacyTLS = configuration().legacyTLSEnabled();
if (id value = [defaults objectForKey:@"WebKitEnableLegacyTLS"])
@@ -85,10 +98,6 @@
WebCore::RegistrableDomain resourceLoadStatisticsManualPrevalentResource { };
#if ENABLE(RESOURCE_LOAD_STATISTICS)
enableResourceLoadStatisticsDebugMode = [defaults boolForKey:@"ITPDebugMode"];
- if ([defaults boolForKey:[NSString stringWithFormat:@"Experimental%@", WebPreferencesKey::isThirdPartyCookieBlockingDisabledKey().createCFString().get()]])
- thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::AllOnSitesWithoutUserInteraction;
- else
- thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::All;
if ([defaults boolForKey:[NSString stringWithFormat:@"Experimental%@", WebPreferencesKey::isFirstPartyWebsiteDataRemovalDisabledKey().createCFString().get()]])
firstPartyWebsiteDataRemovalMode = WebCore::FirstPartyWebsiteDataRemovalMode::None;
else {
@@ -162,7 +171,7 @@
hasStatisticsTestingCallback(),
shouldIncludeLocalhostInResourceLoadStatistics,
enableResourceLoadStatisticsDebugMode,
- thirdPartyCookieBlockingMode,
+ thirdPartyCookieBlockingMode(),
firstPartyWebsiteDataRemovalMode,
m_configuration->deviceManagementRestrictionsEnabled(),
m_configuration->allLoadsBlockedByDeviceManagementRestrictionsForTesting(),
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1799,6 +1799,15 @@
ASSERT(!completionHandler);
}
+#if !PLATFORM(COCOA)
+WebCore::ThirdPartyCookieBlockingMode WebsiteDataStore::thirdPartyCookieBlockingMode() const
+{
+ if (!m_thirdPartyCookieBlockingMode)
+ m_thirdPartyCookieBlockingMode = WebCore::ThirdPartyCookieBlockingMode::All;
+ return *m_thirdPartyCookieBlockingMode;
+}
+#endif
+
void WebsiteDataStore::setResourceLoadStatisticsShouldBlockThirdPartyCookiesForTesting(bool enabled, bool onlyOnSitesWithoutUserInteraction, CompletionHandler<void()>&& completionHandler)
{
auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler));
@@ -1806,6 +1815,12 @@
if (enabled)
blockingMode = onlyOnSitesWithoutUserInteraction ? WebCore::ThirdPartyCookieBlockingMode::AllOnSitesWithoutUserInteraction : WebCore::ThirdPartyCookieBlockingMode::All;
+ if (thirdPartyCookieBlockingMode() != blockingMode) {
+ m_thirdPartyCookieBlockingMode = blockingMode;
+ for (auto& webProcess : processes())
+ webProcess.setShouldBlockThirdPartyCookiesForTesting(blockingMode, [callbackAggregator = callbackAggregator.copyRef()] { });
+ }
+
for (auto& processPool : processPools()) {
if (auto* networkProcess = processPool->networkProcess()) {
networkProcess->setShouldBlockThirdPartyCookiesForTesting(m_sessionID, blockingMode, [callbackAggregator = callbackAggregator.copyRef()] { });
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (254555 => 254556)
--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -194,6 +194,7 @@
void setResourceLoadStatisticsShouldDowngradeReferrerForTesting(bool, CompletionHandler<void()>&&);
void setResourceLoadStatisticsShouldBlockThirdPartyCookiesForTesting(bool enabled, bool onlyOnSitesWithoutUserInteraction, CompletionHandler<void()>&&);
void setResourceLoadStatisticsFirstPartyWebsiteDataRemovalModeForTesting(bool enabled, CompletionHandler<void()>&&);
+ WebCore::ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode() const;
#endif
void setCacheMaxAgeCapForPrevalentResources(Seconds, CompletionHandler<void()>&&);
void resetCacheMaxAgeCapForPrevalentResources(CompletionHandler<void()>&&);
@@ -373,6 +374,9 @@
#if HAVE(APP_SSO)
UniqueRef<SOAuthorizationCoordinator> m_soAuthorizationCoordinator;
#endif
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ mutable Optional<WebCore::ThirdPartyCookieBlockingMode> m_thirdPartyCookieBlockingMode; // Lazily computed.
+#endif
};
}
Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -71,7 +71,7 @@
updateCentralStatisticsStore();
}
-void WebResourceLoadObserver::requestStorageAccessUnderOpener(const RegistrableDomain& domainInNeedOfStorageAccess, PageIdentifier openerPageID, Document& openerDocument)
+void WebResourceLoadObserver::requestStorageAccessUnderOpener(const RegistrableDomain& domainInNeedOfStorageAccess, WebPage& openerPage, Document& openerDocument)
{
auto openerUrl = openerDocument.url();
RegistrableDomain openerDomain { openerUrl };
@@ -78,8 +78,10 @@
if (domainInNeedOfStorageAccess != openerDomain
&& !openerDocument.hasRequestedPageSpecificStorageAccessWithUserInteraction(domainInNeedOfStorageAccess)
&& !equalIgnoringASCIICase(openerUrl.string(), WTF::blankURL())) {
- WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RequestStorageAccessUnderOpener(domainInNeedOfStorageAccess, openerPageID, openerDomain), 0);
+ WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RequestStorageAccessUnderOpener(domainInNeedOfStorageAccess, openerPage.identifier(), openerDomain), 0);
+ openerPage.addDomainWithPageLevelStorageAccess(openerDomain, domainInNeedOfStorageAccess);
+
// Remember user interaction-based requests since they don't need to be repeated.
openerDocument.setHasRequestedPageSpecificStorageAccessWithUserInteraction(domainInNeedOfStorageAccess);
}
@@ -335,10 +337,8 @@
if (auto* frame = document.frame()) {
if (auto* opener = frame->loader().opener()) {
if (auto* openerDocument = opener->document()) {
- if (auto* openerFrame = openerDocument->frame()) {
- if (auto openerPageID = openerFrame->loader().client().pageID())
- requestStorageAccessUnderOpener(topFrameDomain, openerPageID.value(), *openerDocument);
- }
+ if (auto* openerPage = openerDocument->page())
+ requestStorageAccessUnderOpener(topFrameDomain, WebPage::fromCorePage(*openerPage), *openerDocument);
}
}
}
Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.h (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebResourceLoadObserver.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -34,6 +34,8 @@
namespace WebKit {
+class WebPage;
+
class WebResourceLoadObserver final : public WebCore::ResourceLoadObserver {
public:
WebResourceLoadObserver();
@@ -64,7 +66,7 @@
void scheduleNotificationIfNeeded();
Vector<WebCore::ResourceLoadStatistics> takeStatistics();
- void requestStorageAccessUnderOpener(const WebCore::RegistrableDomain& domainInNeedOfStorageAccess, WebCore::PageIdentifier openerPageID, WebCore::Document& openerDocument);
+ void requestStorageAccessUnderOpener(const WebCore::RegistrableDomain& domainInNeedOfStorageAccess, WebPage& openerPage, WebCore::Document& openerDocument);
HashMap<WebCore::RegistrableDomain, WebCore::ResourceLoadStatistics> m_resourceStatisticsMap;
HashMap<WebCore::RegistrableDomain, WTF::WallTime> m_lastReportedUserInteractionMap;
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebCookieJar.cpp (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebPage/WebCookieJar.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebCookieJar.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -28,8 +28,11 @@
#include "NetworkConnectionToWebProcessMessages.h"
#include "NetworkProcessConnection.h"
+#include "WebFrame.h"
+#include "WebPage.h"
#include "WebProcess.h"
#include <WebCore/CookieRequestHeaderFieldProxy.h>
+#include <WebCore/DeprecatedGlobalSettings.h>
#include <WebCore/Document.h>
#include <WebCore/Frame.h>
#include <WebCore/FrameLoader.h>
@@ -48,18 +51,61 @@
WebCookieJar::WebCookieJar()
: WebCore::CookieJar(adoptRef(*new WebStorageSessionProvider)) { }
-String WebCookieJar::cookies(WebCore::Document& document, const URL& url) const
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+static bool shouldBlockCookies(WebFrame* frame, const URL& firstPartyForCookies, const URL& resourceURL, ShouldAskITP& shouldAskITPInNetworkProcess)
{
- Optional<FrameIdentifier> frameID;
- Optional<PageIdentifier> pageID;
- if (auto* frame = document.frame()) {
- frameID = frame->loader().client().frameID();
- pageID = frame->loader().client().pageID();
+ if (!WebCore::DeprecatedGlobalSettings::resourceLoadStatisticsEnabled())
+ return false;
+
+ if (frame && frame->isMainFrame())
+ return false;
+
+ RegistrableDomain firstPartyDomain { firstPartyForCookies };
+ if (firstPartyDomain.isEmpty())
+ return false;
+
+ RegistrableDomain resourceDomain { resourceURL };
+ if (resourceDomain.isEmpty())
+ return false;
+
+ if (firstPartyDomain == resourceDomain)
+ return false;
+
+ if (frame && frame->frameLoaderClient()->hasFrameSpecificStorageAccess())
+ return false;
+
+ if (frame && frame->page() && frame->page()->hasPageLevelStorageAccess(firstPartyDomain, resourceDomain))
+ return false;
+
+ // The WebContent process does not have enough information to deal with other policies than ThirdPartyCookieBlockingMode::All so we have to go to the NetworkProcess for all
+ // other policies and the request may end up getting blocked on NetworkProcess side.
+ if (WebProcess::singleton().thirdPartyCookieBlockingMode() != ThirdPartyCookieBlockingMode::All) {
+ shouldAskITPInNetworkProcess = ShouldAskITP::Yes;
+ return false;
}
+ return true;
+}
+#endif
+
+String WebCookieJar::cookies(WebCore::Document& document, const URL& url) const
+{
+ auto* webFrame = document.frame() ? WebFrame::fromCoreFrame(*document.frame()) : nullptr;
+ if (!webFrame || !webFrame->page())
+ return { };
+
+ ShouldAskITP shouldAskITPInNetworkProcess = ShouldAskITP::No;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ if (shouldBlockCookies(webFrame, document.firstPartyForCookies(), url, shouldAskITPInNetworkProcess))
+ return { };
+#endif
+
+ auto frameID = webFrame->frameID();
+ auto pageID = webFrame->page()->identifier();
+
String cookieString;
bool secureCookiesAccessed = false;
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookiesForDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, shouldIncludeSecureCookies(document, url)), Messages::NetworkConnectionToWebProcess::CookiesForDOM::Reply(cookieString, secureCookiesAccessed), 0))
+ if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookiesForDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, shouldIncludeSecureCookies(document, url), shouldAskITPInNetworkProcess), Messages::NetworkConnectionToWebProcess::CookiesForDOM::Reply(cookieString, secureCookiesAccessed), 0))
return { };
return cookieString;
@@ -67,14 +113,20 @@
void WebCookieJar::setCookies(WebCore::Document& document, const URL& url, const String& cookieString)
{
- Optional<FrameIdentifier> frameID;
- Optional<PageIdentifier> pageID;
- if (auto* frame = document.frame()) {
- frameID = frame->loader().client().frameID();
- pageID = frame->loader().client().pageID();
- }
+ auto* webFrame = document.frame() ? WebFrame::fromCoreFrame(*document.frame()) : nullptr;
+ if (!webFrame || !webFrame->page())
+ return;
- WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::SetCookiesFromDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, cookieString), 0);
+ ShouldAskITP shouldAskITPInNetworkProcess = ShouldAskITP::No;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ if (shouldBlockCookies(webFrame, document.firstPartyForCookies(), url, shouldAskITPInNetworkProcess))
+ return;
+#endif
+
+ auto frameID = webFrame->frameID();
+ auto pageID = webFrame->page()->identifier();
+
+ WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::SetCookiesFromDOM(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, shouldAskITPInNetworkProcess, cookieString), 0);
}
bool WebCookieJar::cookiesEnabled(const WebCore::Document& document) const
@@ -87,9 +139,16 @@
std::pair<String, WebCore::SecureCookiesAccessed> WebCookieJar::cookieRequestHeaderFieldValue(const URL& firstParty, const WebCore::SameSiteInfo& sameSiteInfo, const URL& url, Optional<FrameIdentifier> frameID, Optional<PageIdentifier> pageID, WebCore::IncludeSecureCookies includeSecureCookies) const
{
+ ShouldAskITP shouldAskITPInNetworkProcess = ShouldAskITP::No;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ auto* webFrame = frameID ? WebProcess::singleton().webFrame(*frameID) : nullptr;
+ if (shouldBlockCookies(webFrame, firstParty, url, shouldAskITPInNetworkProcess))
+ return { };
+#endif
+
String cookieString;
bool secureCookiesAccessed = false;
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookieRequestHeaderFieldValue(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies), Messages::NetworkConnectionToWebProcess::CookieRequestHeaderFieldValue::Reply(cookieString, secureCookiesAccessed), 0))
+ if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookieRequestHeaderFieldValue(firstParty, sameSiteInfo, url, frameID, pageID, includeSecureCookies, shouldAskITPInNetworkProcess), Messages::NetworkConnectionToWebProcess::CookieRequestHeaderFieldValue::Reply(cookieString, secureCookiesAccessed), 0))
return { };
return { cookieString, secureCookiesAccessed ? WebCore::SecureCookiesAccessed::Yes : WebCore::SecureCookiesAccessed::No };
}
@@ -96,14 +155,16 @@
bool WebCookieJar::getRawCookies(const WebCore::Document& document, const URL& url, Vector<WebCore::Cookie>& rawCookies) const
{
- Optional<FrameIdentifier> frameID;
- Optional<PageIdentifier> pageID;
- if (auto* frame = document.frame()) {
- frameID = frame->loader().client().frameID();
- pageID = frame->loader().client().pageID();
- }
+ auto* webFrame = document.frame() ? WebFrame::fromCoreFrame(*document.frame()) : nullptr;
+ ShouldAskITP shouldAskITPInNetworkProcess = ShouldAskITP::No;
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ if (shouldBlockCookies(webFrame, document.firstPartyForCookies(), url, shouldAskITPInNetworkProcess))
+ return { };
+#endif
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::GetRawCookies(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID), Messages::NetworkConnectionToWebProcess::GetRawCookies::Reply(rawCookies), 0))
+ Optional<FrameIdentifier> frameID = webFrame ? makeOptional(webFrame->frameID()) : WTF::nullopt;
+ Optional<PageIdentifier> pageID = webFrame && webFrame->page() ? makeOptional(webFrame->page()->identifier()) : WTF::nullopt;
+ if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::GetRawCookies(document.firstPartyForCookies(), sameSiteInfo(document), url, frameID, pageID, shouldAskITPInNetworkProcess), Messages::NetworkConnectionToWebProcess::GetRawCookies::Reply(rawCookies), 0))
return false;
return true;
}
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -6605,6 +6605,17 @@
});
}
+void WebPage::addDomainWithPageLevelStorageAccess(const RegistrableDomain& topLevelDomain, const RegistrableDomain& resourceDomain)
+{
+ m_domainsWithPageLevelStorageAccess.add(topLevelDomain, resourceDomain);
+}
+
+bool WebPage::hasPageLevelStorageAccess(const RegistrableDomain& topLevelDomain, const RegistrableDomain& resourceDomain) const
+{
+ auto it = m_domainsWithPageLevelStorageAccess.find(topLevelDomain);
+ return it != m_domainsWithPageLevelStorageAccess.end() && it->value == resourceDomain;
+}
+
void WebPage::wasLoadedWithDataTransferFromPrevalentResource()
{
auto* frame = mainFrame();
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1168,6 +1168,8 @@
#if ENABLE(RESOURCE_LOAD_STATISTICS)
void hasStorageAccess(WebCore::RegistrableDomain&& subFrameDomain, WebCore::RegistrableDomain&& topFrameDomain, WebFrame&, CompletionHandler<void(bool)>&&);
void requestStorageAccess(WebCore::RegistrableDomain&& subFrameDomain, WebCore::RegistrableDomain&& topFrameDomain, WebFrame&, CompletionHandler<void(WebCore::StorageAccessWasGranted, WebCore::StorageAccessPromptWasShown)>&&);
+ bool hasPageLevelStorageAccess(const WebCore::RegistrableDomain& topLevelDomain, const WebCore::RegistrableDomain& resourceDomain) const;
+ void addDomainWithPageLevelStorageAccess(const WebCore::RegistrableDomain& topLevelDomain, const WebCore::RegistrableDomain& resourceDomain);
void wasLoadedWithDataTransferFromPrevalentResource();
#endif
@@ -2036,6 +2038,10 @@
WebCore::Timer m_textAutoSizingAdjustmentTimer;
#endif
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ HashMap<WebCore::RegistrableDomain, WebCore::RegistrableDomain> m_domainsWithPageLevelStorageAccess;
+#endif
+
String m_overriddenMediaType;
};
Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebProcess.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -477,6 +477,7 @@
setResourceLoadStatisticsEnabled(parameters.resourceLoadStatisticsEnabled);
#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ m_thirdPartyCookieBlockingMode = parameters.thirdPartyCookieBlockingMode;
if (parameters.resourceLoadStatisticsEnabled && !parameters.sessionID.isEphemeral() && !ResourceLoadObserver::sharedIfExists())
ResourceLoadObserver::setShared(*new WebResourceLoadObserver);
#endif
@@ -1977,6 +1978,14 @@
});
}
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+void WebProcess::setShouldBlockThirdPartyCookiesForTesting(ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode, CompletionHandler<void()>&& completionHandler)
+{
+ m_thirdPartyCookieBlockingMode = thirdPartyCookieBlockingMode;
+ completionHandler();
+}
+#endif
+
} // namespace WebKit
#undef RELEASE_LOG_SESSION_ID
Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebProcess.h 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h 2020-01-15 03:10:56 UTC (rev 254556)
@@ -44,6 +44,7 @@
#include "WebSocketChannelManager.h"
#include <WebCore/ActivityState.h>
#include <WebCore/FrameIdentifier.h>
+#include <WebCore/NetworkStorageSession.h>
#include <WebCore/PageIdentifier.h>
#include <WebCore/RegistrableDomain.h>
#if PLATFORM(MAC)
@@ -165,6 +166,10 @@
PAL::SessionID sessionID() const { ASSERT(m_sessionID); return *m_sessionID; }
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ WebCore::ThirdPartyCookieBlockingMode thirdPartyCookieBlockingMode() const { return m_thirdPartyCookieBlockingMode; }
+#endif
+
#if PLATFORM(COCOA)
const WTF::MachSendRight& compositingRenderServerPort() const { return m_compositingRenderServerPort; }
#endif
@@ -437,6 +442,10 @@
#endif
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ void setShouldBlockThirdPartyCookiesForTesting(WebCore::ThirdPartyCookieBlockingMode, CompletionHandler<void()>&&);
+#endif
+
void platformInitializeProcess(const AuxiliaryProcessInitializationParameters&);
// IPC::Connection::Client
@@ -604,6 +613,10 @@
// Prewarmed WebProcesses do not have an associated sessionID yet, which is why this is an optional.
// By the time the WebProcess gets a WebPage, it is guaranteed to have a sessionID.
Optional<PAL::SessionID> m_sessionID;
+
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ WebCore::ThirdPartyCookieBlockingMode m_thirdPartyCookieBlockingMode { WebCore::ThirdPartyCookieBlockingMode::All };
+#endif
};
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/WebProcess.messages.in (254555 => 254556)
--- trunk/Source/WebKit/WebProcess/WebProcess.messages.in 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Source/WebKit/WebProcess/WebProcess.messages.in 2020-01-15 03:10:56 UTC (rev 254556)
@@ -162,5 +162,6 @@
#if ENABLE(RESOURCE_LOAD_STATISTICS)
SeedResourceLoadStatisticsForTesting(WebCore::RegistrableDomain firstPartyDomain, WebCore::RegistrableDomain thirdPartyDomain, bool shouldScheduleNotification) -> () Async
+ SetShouldBlockThirdPartyCookiesForTesting(enum:uint8_t WebCore::ThirdPartyCookieBlockingMode blockingMode) -> () Async
#endif
}
Modified: trunk/Tools/ChangeLog (254555 => 254556)
--- trunk/Tools/ChangeLog 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Tools/ChangeLog 2020-01-15 03:10:56 UTC (rev 254556)
@@ -1,3 +1,19 @@
+2020-01-14 Chris Dumez <[email protected]>
+
+ document.cookie should not do a sync IPC to the network process for iframes that do not have storage access
+ https://bugs.webkit.org/show_bug.cgi?id=206108
+
+ Reviewed by Geoff Garen and John Wilander.
+
+ Make setStatisticsShouldBlockThirdPartyCookies IPC from the WebProcess to the UIProcess asynchronous
+ since this ends up sending an IPC back to the WebProcess now (which would deadlock).
+
+ * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+ (WTR::TestRunner::setStatisticsShouldBlockThirdPartyCookies):
+ * WebKitTestRunner/TestInvocation.cpp:
+ (WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
+ (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
+
2020-01-10 Jiewen Tan <[email protected]>
[WebAuthn] Implement SPI to tell UI clients to select assertion responses
Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (254555 => 254556)
--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -2235,7 +2235,7 @@
if (onlyOnSitesWithoutUserInteraction)
messageName = adoptWK(WKStringCreateWithUTF8CString("SetStatisticsShouldBlockThirdPartyCookiesOnSitesWithoutUserInteraction"));
WKRetainPtr<WKBooleanRef> messageBody = adoptWK(WKBooleanCreate(value));
- WKBundlePostSynchronousMessage(InjectedBundle::singleton().bundle(), messageName.get(), messageBody.get(), nullptr);
+ WKBundlePostMessage(InjectedBundle::singleton().bundle(), messageName.get(), messageBody.get());
m_hasSetBlockThirdPartyCookiesCallback = true;
}
Modified: trunk/Tools/WebKitTestRunner/TestInvocation.cpp (254555 => 254556)
--- trunk/Tools/WebKitTestRunner/TestInvocation.cpp 2020-01-15 02:51:21 UTC (rev 254555)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.cpp 2020-01-15 03:10:56 UTC (rev 254556)
@@ -747,6 +747,20 @@
return;
}
+ if (WKStringIsEqualToUTF8CString(messageName, "SetStatisticsShouldBlockThirdPartyCookiesOnSitesWithoutUserInteraction")) {
+ ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
+ WKBooleanRef value = static_cast<WKBooleanRef>(messageBody);
+ TestController::singleton().setStatisticsShouldBlockThirdPartyCookies(WKBooleanGetValue(value), true);
+ return;
+ }
+
+ if (WKStringIsEqualToUTF8CString(messageName, "SetStatisticsShouldBlockThirdPartyCookies")) {
+ ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
+ WKBooleanRef value = static_cast<WKBooleanRef>(messageBody);
+ TestController::singleton().setStatisticsShouldBlockThirdPartyCookies(WKBooleanGetValue(value), false);
+ return;
+ }
+
if (WKStringIsEqualToUTF8CString(messageName, "RunUIProcessScript")) {
WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
WKRetainPtr<WKStringRef> scriptKey = adoptWK(WKStringCreateWithUTF8CString("Script"));
@@ -1559,20 +1573,6 @@
return nullptr;
}
- if (WKStringIsEqualToUTF8CString(messageName, "SetStatisticsShouldBlockThirdPartyCookiesOnSitesWithoutUserInteraction")) {
- ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
- WKBooleanRef value = static_cast<WKBooleanRef>(messageBody);
- TestController::singleton().setStatisticsShouldBlockThirdPartyCookies(WKBooleanGetValue(value), true);
- return nullptr;
- }
-
- if (WKStringIsEqualToUTF8CString(messageName, "SetStatisticsShouldBlockThirdPartyCookies")) {
- ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
- WKBooleanRef value = static_cast<WKBooleanRef>(messageBody);
- TestController::singleton().setStatisticsShouldBlockThirdPartyCookies(WKBooleanGetValue(value), false);
- return nullptr;
- }
-
if (WKStringIsEqualToUTF8CString(messageName, "SetStatisticsFirstPartyWebsiteDataRemovalMode")) {
ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
WKBooleanRef value = static_cast<WKBooleanRef>(messageBody);