Diff
Modified: trunk/Source/WebCore/PAL/ChangeLog (234395 => 234396)
--- trunk/Source/WebCore/PAL/ChangeLog 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebCore/PAL/ChangeLog 2018-07-30 23:23:40 UTC (rev 234396)
@@ -1,3 +1,13 @@
+2018-07-30 Sihui Liu <[email protected]>
+
+ Add support for fetching and remove type _WKWebsiteDataTypeHSTSCache
+ https://bugs.webkit.org/show_bug.cgi?id=187379
+ <rdar://problem/41879559>
+
+ Reviewed by Geoffrey Garen.
+
+ * pal/spi/cf/CFNetworkSPI.h:
+
2018-07-30 Devin Rousso <[email protected]>
Add missing CoreGraphics SPI
Modified: trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h (234395 => 234396)
--- trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h 2018-07-30 23:23:40 UTC (rev 234396)
@@ -197,11 +197,6 @@
void CFURLCacheSetDiskCapacity(CFURLCacheRef, CFIndex);
CFCachedURLResponseRef CFURLCacheCopyResponseForRequest(CFURLCacheRef, CFURLRequestRef);
-#if PLATFORM(COCOA)
-Boolean _CFNetworkIsKnownHSTSHostWithSession(CFURLRef, CFURLStorageSessionRef);
-void _CFNetworkResetHSTSHostsWithSession(CFURLStorageSessionRef);
-#endif
-
void CFHTTPCookieStorageDeleteAllCookies(CFHTTPCookieStorageRef);
void _CFHTTPCookieStorageFlushCookieStores();
@@ -301,7 +296,12 @@
Boolean _CFNetworkSetATSContext(CFDataRef);
#if PLATFORM(COCOA)
+extern const CFStringRef _kCFNetworkHSTSPreloaded;
+CFDictionaryRef _CFNetworkCopyHSTSPolicies(CFURLStorageSessionRef);
+void _CFNetworkResetHSTS(CFURLRef, CFURLStorageSessionRef);
void _CFNetworkResetHSTSHostsSinceDate(CFURLStorageSessionRef, CFDateRef);
+Boolean _CFNetworkIsKnownHSTSHostWithSession(CFURLRef, CFURLStorageSessionRef);
+void _CFNetworkResetHSTSHostsWithSession(CFURLStorageSessionRef);
#endif
CFDataRef CFHTTPCookieStorageCreateIdentifyingData(CFAllocatorRef inAllocator, CFHTTPCookieStorageRef inStorage);
Modified: trunk/Source/WebKit/ChangeLog (234395 => 234396)
--- trunk/Source/WebKit/ChangeLog 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/ChangeLog 2018-07-30 23:23:40 UTC (rev 234396)
@@ -1,3 +1,40 @@
+2018-07-30 Sihui Liu <[email protected]>
+
+ Add support for fetching and remove type _WKWebsiteDataTypeHSTSCache
+ https://bugs.webkit.org/show_bug.cgi?id=187379
+ <rdar://problem/41879559>
+
+ WKWebsiteDataStore should support _WKWebsiteDataTypeHSTSCache so Safari could list HSTS cache entries
+ and be able to remove them on a per-domain basis.
+
+ Reviewed by Geoffrey Garen.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::fetchWebsiteData):
+ (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
+ * NetworkProcess/NetworkProcess.h:
+ * NetworkProcess/NetworkProcess.messages.in:
+ * NetworkProcess/cocoa/NetworkProcessCocoa.mm:
+ (WebKit::filterPreloadHSTSEntry):
+ (WebKit::NetworkProcess::getHostNamesWithHSTSCache):
+ (WebKit::NetworkProcess::deleteHSTSCacheForHostNames):
+ * Shared/WebsiteData/WebsiteData.cpp:
+ (WebKit::WebsiteData::encode const):
+ (WebKit::WebsiteData::decode):
+ * Shared/WebsiteData/WebsiteData.h:
+ * UIProcess/Network/NetworkProcessProxy.cpp:
+ (WebKit::NetworkProcessProxy::deleteWebsiteDataForOrigins):
+ * UIProcess/Network/NetworkProcessProxy.h:
+ * UIProcess/WebsiteData/WebsiteDataRecord.cpp:
+ (WebKit::WebsiteDataRecord::displayNameForCookieHostName):
+ (WebKit::WebsiteDataRecord::displayNameForHostName):
+ (WebKit::WebsiteDataRecord::addHSTSCacheHostname):
+ (WebKit::WebsiteDataRecord::displayNameForPluginDataHostName): Deleted.
+ * UIProcess/WebsiteData/WebsiteDataRecord.h:
+ * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+ (WebKit::WebsiteDataStore::fetchDataAndApply):
+ (WebKit::WebsiteDataStore::removeData):
+
2018-07-30 Simon Fraser <[email protected]>
Shrink GraphicsLayerCA
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (234395 => 234396)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2018-07-30 23:23:40 UTC (rev 234396)
@@ -551,6 +551,13 @@
callbackAggregator->m_websiteData.entries.appendVector(entries);
});
}
+
+#if PLATFORM(COCOA)
+ if (websiteDataTypes.contains(WebsiteDataType::HSTSCache)) {
+ if (auto* networkStorageSession = NetworkStorageSession::storageSession(sessionID))
+ getHostNamesWithHSTSCache(*networkStorageSession, callbackAggregator->m_websiteData.hostNamesWithHSTSCache);
+ }
+#endif
}
void NetworkProcess::deleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, WallTime modifiedSince, uint64_t callbackID)
@@ -608,7 +615,7 @@
RunLoop::main().dispatch(WTFMove(completionHandler));
}
-void NetworkProcess::deleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, const Vector<SecurityOriginData>& originDatas, const Vector<String>& cookieHostNames, uint64_t callbackID)
+void NetworkProcess::deleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebsiteDataType> websiteDataTypes, const Vector<SecurityOriginData>& originDatas, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, uint64_t callbackID)
{
if (websiteDataTypes.contains(WebsiteDataType::Cookies)) {
if (auto* networkStorageSession = NetworkStorageSession::storageSession(sessionID))
@@ -615,6 +622,13 @@
networkStorageSession->deleteCookiesForHostnames(cookieHostNames);
}
+#if PLATFORM(COCOA)
+ if (websiteDataTypes.contains(WebsiteDataType::HSTSCache)) {
+ if (auto* networkStorageSession = NetworkStorageSession::storageSession(sessionID))
+ deleteHSTSCacheForHostNames(*networkStorageSession, HSTSCacheHostNames);
+ }
+#endif
+
auto clearTasksHandler = WTF::CallbackAggregator::create([this, callbackID] {
parentProcessConnection()->send(Messages::NetworkProcessProxy::DidDeleteWebsiteDataForOrigins(callbackID), 0);
});
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (234395 => 234396)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2018-07-30 23:23:40 UTC (rev 234396)
@@ -114,6 +114,8 @@
#if PLATFORM(COCOA)
RetainPtr<CFDataRef> sourceApplicationAuditData() const;
+ void getHostNamesWithHSTSCache(WebCore::NetworkStorageSession&, HashSet<String>&);
+ void deleteHSTSCacheForHostNames(WebCore::NetworkStorageSession&, const Vector<String>&);
void clearHSTSCache(WebCore::NetworkStorageSession&, WallTime modifiedSince);
bool suppressesConnectionTerminationOnSystemChange() const { return m_suppressesConnectionTerminationOnSystemChange; }
#endif
@@ -208,7 +210,7 @@
void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, uint64_t callbackID);
void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, uint64_t callbackID);
- void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, uint64_t callbackID);
+ void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostnames, uint64_t callbackID);
void clearCachedCredentials();
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (234395 => 234396)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in 2018-07-30 23:23:40 UTC (rev 234396)
@@ -40,7 +40,7 @@
FetchWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, OptionSet<WebKit::WebsiteDataFetchOption> fetchOptions, uint64_t callbackID)
DeleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, WallTime modifiedSince, uint64_t callbackID)
- DeleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, Vector<WebCore::SecurityOriginData> origins, Vector<String> cookieHostNames, uint64_t callbackID)
+ DeleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, Vector<WebCore::SecurityOriginData> origins, Vector<String> cookieHostNames, Vector<String> HSTSCacheHostNames, uint64_t callbackID)
DownloadRequest(PAL::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, String suggestedFilename)
ResumeDownload(PAL::SessionID sessionID, WebKit::DownloadID downloadID, IPC::DataReference resumeData, String path, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm (234395 => 234396)
--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm 2018-07-30 23:23:40 UTC (rev 234396)
@@ -150,6 +150,26 @@
#endif
}
+static void filterPreloadHSTSEntry(const void* key, const void* value, void* context)
+{
+ HashSet<String>* hostnames = static_cast<HashSet<String>*>(context);
+ auto val = static_cast<CFDictionaryRef>(value);
+ if (CFDictionaryGetValue(val, _kCFNetworkHSTSPreloaded) != kCFBooleanTrue)
+ hostnames->add((CFStringRef)key);
+}
+
+void NetworkProcess::getHostNamesWithHSTSCache(WebCore::NetworkStorageSession& session, HashSet<String>& hostNames)
+{
+ auto HSTSPolicies = adoptCF(_CFNetworkCopyHSTSPolicies(session.platformSession()));
+ CFDictionaryApplyFunction(HSTSPolicies.get(), filterPreloadHSTSEntry, &hostNames);
+}
+
+void NetworkProcess::deleteHSTSCacheForHostNames(WebCore::NetworkStorageSession& session, const Vector<String>& hostNames)
+{
+ for (auto& hostName : hostNames)
+ _CFNetworkResetHSTS(CFURLCreateWithString(kCFAllocatorDefault, hostName.createCFString().get(), NULL), session.platformSession());
+}
+
void NetworkProcess::clearHSTSCache(WebCore::NetworkStorageSession& session, WallTime modifiedSince)
{
NSTimeInterval timeInterval = modifiedSince.secondsSinceEpoch().seconds();
Modified: trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.cpp (234395 => 234396)
--- trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.cpp 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.cpp 2018-07-30 23:23:40 UTC (rev 234396)
@@ -66,6 +66,7 @@
encoder << hostNamesWithPluginData;
#endif
encoder << originsWithCredentials;
+ encoder << hostNamesWithHSTSCache;
}
bool WebsiteData::decode(IPC::Decoder& decoder, WebsiteData& result)
@@ -80,6 +81,8 @@
#endif
if (!decoder.decode(result.originsWithCredentials))
return false;
+ if (!decoder.decode(result.hostNamesWithHSTSCache))
+ return false;
return true;
}
Modified: trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.h (234395 => 234396)
--- trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.h 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.h 2018-07-30 23:23:40 UTC (rev 234396)
@@ -58,6 +58,8 @@
HashSet<String> originsWithCredentials;
+ HashSet<String> hostNamesWithHSTSCache;
+
void encode(IPC::Encoder&) const;
static bool decode(IPC::Decoder&, WebsiteData&);
};
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (234395 => 234396)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp 2018-07-30 23:23:40 UTC (rev 234396)
@@ -178,7 +178,7 @@
send(Messages::NetworkProcess::DeleteWebsiteData(sessionID, dataTypes, modifiedSince, callbackID), 0);
}
-void NetworkProcessProxy::deleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebsiteDataType> dataTypes, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, CompletionHandler<void()>&& completionHandler)
+void NetworkProcessProxy::deleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebsiteDataType> dataTypes, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, CompletionHandler<void()>&& completionHandler)
{
ASSERT(canSendMessage());
@@ -194,7 +194,7 @@
RELEASE_LOG_IF(sessionID.isAlwaysOnLoggingAllowed(), ProcessSuspension, "%p - NetworkProcessProxy is releasing a background assertion because the Network process is done deleting Website data for several origins", this);
});
- send(Messages::NetworkProcess::DeleteWebsiteDataForOrigins(sessionID, dataTypes, origins, cookieHostNames, callbackID), 0);
+ send(Messages::NetworkProcess::DeleteWebsiteDataForOrigins(sessionID, dataTypes, origins, cookieHostNames, HSTSCacheHostNames, callbackID), 0);
}
void NetworkProcessProxy::networkProcessCrashed()
Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (234395 => 234396)
--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h 2018-07-30 23:23:40 UTC (rev 234396)
@@ -75,7 +75,7 @@
void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, CompletionHandler<void(WebsiteData)>&&);
void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler);
- void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebKit::WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, CompletionHandler<void()>&&);
+ void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebKit::WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, CompletionHandler<void()>&&);
#if HAVE(CFNETWORK_STORAGE_PARTITIONING)
void updatePrevalentDomainsToPartitionOrBlockCookies(PAL::SessionID, const Vector<String>& domainsToPartition, const Vector<String>& domainsToBlock, const Vector<String>& domainsToNeitherPartitionNorBlock, ShouldClearFirst, CompletionHandler<void()>&&);
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataRecord.cpp (234395 => 234396)
--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataRecord.cpp 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataRecord.cpp 2018-07-30 23:23:40 UTC (rev 234396)
@@ -46,20 +46,11 @@
#if PLATFORM(COCOA)
if (hostName == String(kCFHTTPCookieLocalFileDomain))
return displayNameForLocalFiles();
-#else
- if (hostName == "localhost")
- return hostName;
#endif
-
-#if ENABLE(PUBLIC_SUFFIX_LIST)
- return WebCore::topPrivatelyControlledDomain(hostName.startsWith('.') ? hostName.substring(1) : hostName);
-#endif
-
- return String();
+ return displayNameForHostName(hostName);
}
-#if ENABLE(NETSCAPE_PLUGIN_API)
-String WebsiteDataRecord::displayNameForPluginDataHostName(const String& hostName)
+String WebsiteDataRecord::displayNameForHostName(const String& hostName)
{
#if ENABLE(PUBLIC_SUFFIX_LIST)
return WebCore::topPrivatelyControlledDomain(hostName);
@@ -67,7 +58,6 @@
return String();
}
-#endif
String WebsiteDataRecord::displayNameForOrigin(const WebCore::SecurityOriginData& securityOrigin)
{
@@ -107,6 +97,12 @@
}
#endif
+void WebsiteDataRecord::addHSTSCacheHostname(const String& hostName)
+{
+ types |= WebsiteDataType::HSTSCache;
+ HSTSCacheHostNames.add(hostName);
+}
+
static inline bool hostIsInDomain(StringView host, StringView domain)
{
if (!host.endsWithIgnoringASCIICase(domain))
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataRecord.h (234395 => 234396)
--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataRecord.h 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataRecord.h 2018-07-30 23:23:40 UTC (rev 234396)
@@ -43,9 +43,8 @@
struct WebsiteDataRecord {
static String displayNameForCookieHostName(const String& hostName);
-#if ENABLE(NETSCAPE_PLUGIN_API)
- static String displayNameForPluginDataHostName(const String& hostName);
-#endif
+ static String displayNameForHostName(const String& hostName);
+
static String displayNameForOrigin(const WebCore::SecurityOriginData&);
void add(WebsiteDataType, const WebCore::SecurityOriginData&);
@@ -54,6 +53,7 @@
void addPluginDataHostName(const String& hostName);
#endif
void addOriginWithCredential(const String&);
+ void addHSTSCacheHostname(const String& hostName);
String displayName;
OptionSet<WebsiteDataType> types;
@@ -70,6 +70,7 @@
HashSet<String> pluginDataHostNames;
#endif
HashSet<String> originsWithCredentials;
+ HashSet<String> HSTSCacheHostNames;
bool matchesTopPrivatelyControlledDomain(const String&) const;
String topPrivatelyControlledDomain();
Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (234395 => 234396)
--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp 2018-07-30 23:22:22 UTC (rev 234395)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp 2018-07-30 23:23:40 UTC (rev 234396)
@@ -312,7 +312,7 @@
#if ENABLE(NETSCAPE_PLUGIN_API)
for (auto& hostName : websiteData.hostNamesWithPluginData) {
- auto displayName = WebsiteDataRecord::displayNameForPluginDataHostName(hostName);
+ auto displayName = WebsiteDataRecord::displayNameForHostName(hostName);
if (!displayName)
continue;
@@ -330,6 +330,18 @@
record.addOriginWithCredential(origin);
}
+ for (auto& hostName : websiteData.hostNamesWithHSTSCache) {
+ auto displayName = WebsiteDataRecord::displayNameForHostName(hostName);
+ if (!displayName)
+ continue;
+
+ auto& record = m_websiteDataRecords.add(displayName, WebsiteDataRecord { }).iterator->value;
+ if (!record.displayName)
+ record.displayName = WTFMove(displayName);
+
+ record.addHSTSCacheHostname(hostName);
+ }
+
callIfNeeded();
}
@@ -1014,13 +1026,16 @@
}
Vector<String> cookieHostNames;
+ Vector<String> HSTSCacheHostNames;
for (const auto& dataRecord : dataRecords) {
for (auto& hostName : dataRecord.cookieHostNames)
cookieHostNames.append(hostName);
+ for (auto& hostName : dataRecord.HSTSCacheHostNames)
+ HSTSCacheHostNames.append(hostName);
}
callbackAggregator->addPendingCallback();
- processPool->networkProcess()->deleteWebsiteDataForOrigins(m_sessionID, dataTypes, origins, cookieHostNames, [callbackAggregator, processPool] {
+ processPool->networkProcess()->deleteWebsiteDataForOrigins(m_sessionID, dataTypes, origins, cookieHostNames, HSTSCacheHostNames, [callbackAggregator, processPool] {
callbackAggregator->removePendingCallback();
});
}