Title: [247567] trunk
Revision
247567
Author
achristen...@apple.com
Date
2019-07-18 11:41:31 -0700 (Thu, 18 Jul 2019)

Log Message

Move NetworkCache ownership from NetworkProcess to NetworkSession
https://bugs.webkit.org/show_bug.cgi?id=199817

Reviewed by Geoff Garen.

Source/WebKit:

I also added SPI to set the path of the NetworkCache with an API test.
If this new SPI is not used, it falls back to getting the cache location from the NetworkProcess to maintain compatibility.
We still get options, cache size, and cache model from the NetworkProcess.  Those should be migrated with new SPI later.
Clearing the cache and other operations now iterate the NetworkSessions instead of assuming there is only one cache.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::fetchWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
(WebKit::NetworkProcess::deleteWebsiteDataForRegistrableDomains):
(WebKit::NetworkProcess::registrableDomainsWithWebsiteData):
(WebKit::NetworkProcess::setCacheModel):
* NetworkProcess/NetworkProcess.h:
(WebKit::NetworkProcess::diskCacheDirectory const):
(WebKit::NetworkProcess::cacheOptions const):
(WebKit::NetworkProcess::cache): Deleted.
* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::m_shouldCaptureExtraNetworkLoadMetrics):
* NetworkProcess/NetworkSession.cpp:
(WebKit::NetworkSession::NetworkSession):
* NetworkProcess/NetworkSession.h:
(WebKit::NetworkSession::cache):
* NetworkProcess/NetworkSessionCreationParameters.cpp:
(WebKit::NetworkSessionCreationParameters::encode const):
(WebKit::NetworkSessionCreationParameters::decode):
* NetworkProcess/NetworkSessionCreationParameters.h:
* NetworkProcess/cache/NetworkCache.cpp:
(WebKit::NetworkCache::Cache::open):
(WebKit::NetworkCache::Cache::Cache):
* NetworkProcess/cache/NetworkCache.h:
* NetworkProcess/cocoa/NetworkProcessCocoa.mm:
(WebKit::NetworkProcess::platformInitializeNetworkProcessCocoa):
(WebKit::NetworkProcess::clearDiskCache):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
* NetworkProcess/curl/NetworkSessionCurl.cpp:
(WebKit::NetworkSessionCurl::NetworkSessionCurl):
* NetworkProcess/soup/NetworkSessionSoup.cpp:
(WebKit::NetworkSessionSoup::NetworkSessionSoup):
* UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(-[WKWebsiteDataStore _initWithConfiguration:]):
* UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h:
* UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm:
(-[_WKWebsiteDataStoreConfiguration networkCacheDirectory]):
(-[_WKWebsiteDataStoreConfiguration setNetworkCacheDirectory:]):
* UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
(WebKit::WebsiteDataStore::parameters):
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::resolveDirectoriesIfNecessary):
* UIProcess/WebsiteData/WebsiteDataStore.h:
(WebKit::WebsiteDataStore::resolvedNetworkCacheDirectory const):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
(TEST):
* TestWebKitAPI/cocoa/TestWKWebView.h:
* TestWebKitAPI/cocoa/TestWKWebView.mm:
(-[WKWebView synchronouslyLoadRequest:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (247566 => 247567)


--- trunk/Source/WebKit/ChangeLog	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/ChangeLog	2019-07-18 18:41:31 UTC (rev 247567)
@@ -1,3 +1,61 @@
+2019-07-18  Alex Christensen  <achristen...@webkit.org>
+
+        Move NetworkCache ownership from NetworkProcess to NetworkSession
+        https://bugs.webkit.org/show_bug.cgi?id=199817
+
+        Reviewed by Geoff Garen.
+
+        I also added SPI to set the path of the NetworkCache with an API test.
+        If this new SPI is not used, it falls back to getting the cache location from the NetworkProcess to maintain compatibility.
+        We still get options, cache size, and cache model from the NetworkProcess.  Those should be migrated with new SPI later.
+        Clearing the cache and other operations now iterate the NetworkSessions instead of assuming there is only one cache.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::fetchWebsiteData):
+        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
+        (WebKit::NetworkProcess::deleteWebsiteDataForRegistrableDomains):
+        (WebKit::NetworkProcess::registrableDomainsWithWebsiteData):
+        (WebKit::NetworkProcess::setCacheModel):
+        * NetworkProcess/NetworkProcess.h:
+        (WebKit::NetworkProcess::diskCacheDirectory const):
+        (WebKit::NetworkProcess::cacheOptions const):
+        (WebKit::NetworkProcess::cache): Deleted.
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::m_shouldCaptureExtraNetworkLoadMetrics):
+        * NetworkProcess/NetworkSession.cpp:
+        (WebKit::NetworkSession::NetworkSession):
+        * NetworkProcess/NetworkSession.h:
+        (WebKit::NetworkSession::cache):
+        * NetworkProcess/NetworkSessionCreationParameters.cpp:
+        (WebKit::NetworkSessionCreationParameters::encode const):
+        (WebKit::NetworkSessionCreationParameters::decode):
+        * NetworkProcess/NetworkSessionCreationParameters.h:
+        * NetworkProcess/cache/NetworkCache.cpp:
+        (WebKit::NetworkCache::Cache::open):
+        (WebKit::NetworkCache::Cache::Cache):
+        * NetworkProcess/cache/NetworkCache.h:
+        * NetworkProcess/cocoa/NetworkProcessCocoa.mm:
+        (WebKit::NetworkProcess::platformInitializeNetworkProcessCocoa):
+        (WebKit::NetworkProcess::clearDiskCache):
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
+        * NetworkProcess/curl/NetworkSessionCurl.cpp:
+        (WebKit::NetworkSessionCurl::NetworkSessionCurl):
+        * NetworkProcess/soup/NetworkSessionSoup.cpp:
+        (WebKit::NetworkSessionSoup::NetworkSessionSoup):
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+        (-[WKWebsiteDataStore _initWithConfiguration:]):
+        * UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h:
+        * UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm:
+        (-[_WKWebsiteDataStoreConfiguration networkCacheDirectory]):
+        (-[_WKWebsiteDataStoreConfiguration setNetworkCacheDirectory:]):
+        * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
+        (WebKit::WebsiteDataStore::parameters):
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::resolveDirectoriesIfNecessary):
+        * UIProcess/WebsiteData/WebsiteDataStore.h:
+        (WebKit::WebsiteDataStore::resolvedNetworkCacheDirectory const):
+
 2019-07-18  Chris Dumez  <cdu...@apple.com>
 
         Regression(r247486) Multiple Layout Tests in http/tests/cache/* are crashing on iOS Debug WK2

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -1357,11 +1357,12 @@
         });
     }
 #endif
-
     if (websiteDataTypes.contains(WebsiteDataType::DiskCache)) {
-        fetchDiskCacheEntries(cache(), sessionID, fetchOptions, [callbackAggregator = WTFMove(callbackAggregator)](auto entries) mutable {
-            callbackAggregator->m_websiteData.entries.appendVector(entries);
-        });
+        for (auto& session : networkSessions().values()) {
+            fetchDiskCacheEntries(session->cache(), sessionID, fetchOptions, [callbackAggregator = WTFMove(callbackAggregator)](auto entries) mutable {
+                callbackAggregator->m_websiteData.entries.appendVector(entries);
+            });
+        }
     }
 }
 
@@ -1516,8 +1517,10 @@
     }
 #endif
 
-    if (websiteDataTypes.contains(WebsiteDataType::DiskCache) && !sessionID.isEphemeral())
-        clearDiskCacheEntries(cache(), originDatas, [clearTasksHandler = WTFMove(clearTasksHandler)] { });
+    if (websiteDataTypes.contains(WebsiteDataType::DiskCache) && !sessionID.isEphemeral()) {
+        for (auto& session : networkSessions().values())
+            clearDiskCacheEntries(session->cache(), originDatas, [clearTasksHandler = WTFMove(clearTasksHandler)] { });
+    }
 
     if (websiteDataTypes.contains(WebsiteDataType::Credentials)) {
         if (auto* session = storageSession(sessionID)) {
@@ -1748,19 +1751,21 @@
         });
     }
 #endif
-    
+
     if (websiteDataTypes.contains(WebsiteDataType::DiskCache)) {
-        fetchDiskCacheEntries(cache(), sessionID, fetchOptions, [this, domainsToDeleteAllButCookiesFor, callbackAggregator = callbackAggregator.copyRef()](auto entries) mutable {
+        for (auto& session : networkSessions().values()) {
+            fetchDiskCacheEntries(session->cache(), sessionID, fetchOptions, [domainsToDeleteAllButCookiesFor, callbackAggregator = callbackAggregator.copyRef(), session = session.copyRef()](auto entries) mutable {
 
-            Vector<SecurityOriginData> entriesToDelete;
-            for (auto& entry : entries) {
-                if (!domainsToDeleteAllButCookiesFor.contains(RegistrableDomain::uncheckedCreateFromHost(entry.origin.host)))
-                    continue;
-                entriesToDelete.append(entry.origin);
-                callbackAggregator->m_domains.add(RegistrableDomain::uncheckedCreateFromHost(entry.origin.host));
-            }
-            clearDiskCacheEntries(cache(), entriesToDelete, [callbackAggregator = callbackAggregator.copyRef()] { });
-        });
+                Vector<SecurityOriginData> entriesToDelete;
+                for (auto& entry : entries) {
+                    if (!domainsToDeleteAllButCookiesFor.contains(RegistrableDomain::uncheckedCreateFromHost(entry.origin.host)))
+                        continue;
+                    entriesToDelete.append(entry.origin);
+                    callbackAggregator->m_domains.add(RegistrableDomain::uncheckedCreateFromHost(entry.origin.host));
+                }
+                clearDiskCacheEntries(session->cache(), entriesToDelete, [callbackAggregator = callbackAggregator.copyRef()] { });
+            });
+        }
     }
 
     auto dataTypesForUIProcess = WebsiteData::filter(websiteDataTypes, WebsiteDataProcessType::UI);
@@ -1882,9 +1887,11 @@
 #endif
     
     if (websiteDataTypes.contains(WebsiteDataType::DiskCache)) {
-        fetchDiskCacheEntries(cache(), sessionID, fetchOptions, [callbackAggregator = callbackAggregator.copyRef()](auto entries) mutable {
-            callbackAggregator->m_websiteData.entries.appendVector(entries);
-        });
+        for (auto& session : networkSessions().values()) {
+            fetchDiskCacheEntries(session->cache(), sessionID, fetchOptions, [callbackAggregator = callbackAggregator.copyRef()](auto entries) mutable {
+                callbackAggregator->m_websiteData.entries.appendVector(entries);
+            });
+        }
     }
 }
 #endif // ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -1976,9 +1983,11 @@
         diskFreeSize /= KB * 1000;
         calculateURLCacheSizes(cacheModel, diskFreeSize, urlCacheMemoryCapacity, urlCacheDiskCapacity);
     }
-
-    if (m_cache)
-        m_cache->setCapacity(urlCacheDiskCapacity);
+    
+    for (auto& session : networkSessions().values()) {
+        if (auto* cache = session->cache())
+            cache->setCapacity(urlCacheDiskCapacity);
+    }
 }
 
 void NetworkProcess::setCanHandleHTTPSServerTrustEvaluation(bool value)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -111,14 +111,14 @@
 class WebSWOriginStore;
 #endif
 
+namespace NetworkCache {
+enum class CacheOption : uint8_t;
+}
+
 namespace CacheStorage {
 class Engine;
 }
 
-namespace NetworkCache {
-class Cache;
-}
-
 class NetworkProcess : public AuxiliaryProcess, private DownloadManager::Client, public ThreadSafeRefCounted<NetworkProcess>
 #if ENABLE(INDEXED_DATABASE)
     , public WebCore::IDBServer::IDBBackingStoreTemporaryFileHandler
@@ -161,8 +161,6 @@
     AuthenticationManager& authenticationManager();
     DownloadManager& downloadManager();
 
-    NetworkCache::Cache* cache() { return m_cache.get(); }
-
     void setSession(const PAL::SessionID&, Ref<NetworkSession>&&);
     NetworkSession* networkSession(const PAL::SessionID&) const final;
     NetworkSession* networkSessionByConnection(IPC::Connection&) const;
@@ -343,6 +341,9 @@
     void addKeptAliveLoad(Ref<NetworkResourceLoader>&&);
     void removeKeptAliveLoad(NetworkResourceLoader&);
 
+    const String& diskCacheDirectory() const { return m_diskCacheDirectory; }
+    const OptionSet<NetworkCache::CacheOption>& cacheOptions() const { return m_cacheOptions; }
+    
 private:
     void platformInitializeNetworkProcess(const NetworkProcessCreationParameters&);
     std::unique_ptr<WebCore::NetworkStorageSession> platformCreateDefaultStorageSession() const;
@@ -489,8 +490,6 @@
 
     HashMap<PAL::SessionID, Ref<CacheStorage::Engine>> m_cacheEngines;
 
-    RefPtr<NetworkCache::Cache> m_cache;
-
     typedef HashMap<const char*, std::unique_ptr<NetworkProcessSupplement>, PtrHash<const char*>> NetworkProcessSupplementMap;
     NetworkProcessSupplementMap m_supplements;
 
@@ -566,6 +565,8 @@
     uint32_t m_downloadMonitorSpeedMultiplier { 1 };
 
     HashMap<IPC::Connection::UniqueID, PAL::SessionID> m_sessionByConnection;
+
+    OptionSet<NetworkCache::CacheOption> m_cacheOptions;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -98,10 +98,13 @@
     , m_fileReferences(connection.resolveBlobReferences(m_parameters))
     , m_isAllowedToAskUserForCredentials { m_parameters.clientCredentialPolicy == ClientCredentialPolicy::MayAskClientForCredentials }
     , m_bufferingTimer { *this, &NetworkResourceLoader::bufferingTimerFired }
-    , m_cache { sessionID().isEphemeral() ? nullptr : connection.networkProcess().cache() }
     , m_shouldCaptureExtraNetworkLoadMetrics(m_connection->captureExtraNetworkLoadMetricsEnabled())
 {
     ASSERT(RunLoop::isMain());
+
+    if (auto* session = connection.networkProcess().networkSession(sessionID()))
+        m_cache = session->cache();
+
     // FIXME: This is necessary because of the existence of EmptyFrameLoaderClient in WebCore.
     //        Once bug 116233 is resolved, this ASSERT can just be "m_webPageID && m_webFrameID"
     ASSERT((m_parameters.webPageID && m_parameters.webFrameID) || m_parameters.clientCredentialPolicy == ClientCredentialPolicy::CannotAskClientForCredentials);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -27,6 +27,7 @@
 #include "NetworkSession.h"
 
 #include "AdClickAttributionManager.h"
+#include "Logging.h"
 #include "NetworkProcess.h"
 #include "NetworkProcessProxyMessages.h"
 #include "NetworkResourceLoadParameters.h"
@@ -77,13 +78,25 @@
     return storageSession;
 }
 
-NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID sessionID, String&& localStorageDirectory, SandboxExtension::Handle& handle)
-    : m_sessionID(sessionID)
+NetworkSession::NetworkSession(NetworkProcess& networkProcess, const NetworkSessionCreationParameters& parameters)
+    : m_sessionID(parameters.sessionID)
     , m_networkProcess(networkProcess)
-    , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>(sessionID))
-    , m_storageManager(StorageManager::create(WTFMove(localStorageDirectory)))
+    , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>(parameters.sessionID))
+    , m_storageManager(StorageManager::create(String(parameters.localStorageDirectory)))
 {
-    SandboxExtension::consumePermanently(handle);
+    if (!m_sessionID.isEphemeral()) {
+        String networkCacheDirectory = parameters.networkCacheDirectory;
+        if (networkCacheDirectory.isNull())
+            networkCacheDirectory = networkProcess.diskCacheDirectory();
+        else
+            SandboxExtension::consumePermanently(parameters.networkCacheDirectoryExtensionHandle);
+
+        m_cache = NetworkCache::Cache::open(networkProcess, networkCacheDirectory, networkProcess.cacheOptions());
+        if (!m_cache)
+            RELEASE_LOG_ERROR(NetworkCache, "Failed to initialize the WebKit network disk cache");
+    }
+
+    SandboxExtension::consumePermanently(parameters.localStorageDirectoryExtensionHandle);
     m_adClickAttribution->setPingLoadFunction([this, weakThis = makeWeakPtr(this)](NetworkResourceLoadParameters&& loadParameters, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&& completionHandler) {
         if (!weakThis)
             return;

Modified: trunk/Source/WebKit/NetworkProcess/NetworkSession.h (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkSession.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSession.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -59,7 +59,11 @@
 struct NetworkSessionCreationParameters;
 
 enum class WebsiteDataType;
-    
+
+namespace NetworkCache {
+class Cache;
+}
+
 class NetworkSession : public RefCounted<NetworkSession>, public CanMakeWeakPtr<NetworkSession> {
 public:
     static Ref<NetworkSession> create(NetworkProcess&, NetworkSessionCreationParameters&&);
@@ -100,6 +104,8 @@
     void addKeptAliveLoad(Ref<NetworkResourceLoader>&&);
     void removeKeptAliveLoad(NetworkResourceLoader&);
 
+    NetworkCache::Cache* cache() { return m_cache.get(); }
+
     PrefetchCache& prefetchCache() { return m_prefetchCache; }
     void clearPrefetchCache() { m_prefetchCache.clear(); }
 
@@ -108,7 +114,7 @@
     virtual void addWebSocketTask(WebSocketTask&) { }
 
 protected:
-    NetworkSession(NetworkProcess&, PAL::SessionID, String&& localStorageDirectory, SandboxExtension::Handle&);
+    NetworkSession(NetworkProcess&, const NetworkSessionCreationParameters&);
 
     PAL::SessionID m_sessionID;
     Ref<NetworkProcess> m_networkProcess;
@@ -130,6 +136,7 @@
 #if !ASSERT_DISABLED
     bool m_isInvalidated { false };
 #endif
+    RefPtr<NetworkCache::Cache> m_cache;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -50,7 +50,7 @@
 #if USE(CURL)
         , { }, { }
 #endif
-        , { }, { }, false, { }, { }, { }, { }, { }, { }, { }
+        , { }, { }, false, { }, { }, { }, { }, { }, { }, { }, { }, { }
     };
 }
 
@@ -85,6 +85,7 @@
     encoder << resourceLoadStatisticsManualPrevalentResource;
 
     encoder << localStorageDirectory << localStorageDirectoryExtensionHandle;
+    encoder << networkCacheDirectory << networkCacheDirectoryExtensionHandle;
 
     encoder << deviceManagementRestrictionsEnabled;
     encoder << allLoadsBlockedByDeviceManagementRestrictionsForTesting;
@@ -211,6 +212,16 @@
     if (!localStorageDirectoryExtensionHandle)
         return WTF::nullopt;
 
+    Optional<String> networkCacheDirectory;
+    decoder >> networkCacheDirectory;
+    if (!networkCacheDirectory)
+        return WTF::nullopt;
+    
+    Optional<SandboxExtension::Handle> networkCacheDirectoryExtensionHandle;
+    decoder >> networkCacheDirectoryExtensionHandle;
+    if (!networkCacheDirectoryExtensionHandle)
+        return WTF::nullopt;
+
     Optional<bool> deviceManagementRestrictionsEnabled;
     decoder >> deviceManagementRestrictionsEnabled;
     if (!deviceManagementRestrictionsEnabled)
@@ -253,6 +264,8 @@
         , WTFMove(*resourceLoadStatisticsManualPrevalentResource)
         , WTFMove(*localStorageDirectory)
         , WTFMove(*localStorageDirectoryExtensionHandle)
+        , WTFMove(*networkCacheDirectory)
+        , WTFMove(*networkCacheDirectoryExtensionHandle)
     }};
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -92,6 +92,8 @@
 
     String localStorageDirectory;
     SandboxExtension::Handle localStorageDirectoryExtensionHandle;
+    String networkCacheDirectory;
+    SandboxExtension::Handle networkCacheDirectoryExtensionHandle;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -59,9 +59,9 @@
     return resource;
 }
 
-RefPtr<Cache> Cache::open(NetworkProcess& networkProcess, const String& cachePath, OptionSet<Option> options)
+RefPtr<Cache> Cache::open(NetworkProcess& networkProcess, const String& cachePath, OptionSet<CacheOption> options)
 {
-    auto storage = Storage::open(cachePath, options.contains(Option::TestingMode) ? Storage::Mode::AvoidRandomness : Storage::Mode::Normal);
+    auto storage = Storage::open(cachePath, options.contains(CacheOption::TestingMode) ? Storage::Mode::AvoidRandomness : Storage::Mode::Normal);
 
     LOG(NetworkCache, "(NetworkProcess) opened cache storage, success %d", !!storage);
 
@@ -78,12 +78,12 @@
 }
 #endif
 
-Cache::Cache(NetworkProcess& networkProcess, Ref<Storage>&& storage, OptionSet<Option> options)
+Cache::Cache(NetworkProcess& networkProcess, Ref<Storage>&& storage, OptionSet<CacheOption> options)
     : m_storage(WTFMove(storage))
     , m_networkProcess(networkProcess)
 {
 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
-    if (options.contains(Option::SpeculativeRevalidation)) {
+    if (options.contains(CacheOption::SpeculativeRevalidation)) {
         m_lowPowerModeNotifier = std::make_unique<WebCore::LowPowerModeNotifier>([this](bool isLowPowerModeEnabled) {
             ASSERT(WTF::RunLoop::isMain());
             if (isLowPowerModeEnabled)
@@ -98,7 +98,7 @@
     }
 #endif
 
-    if (options.contains(Option::RegisterNotify)) {
+    if (options.contains(CacheOption::RegisterNotify)) {
 #if PLATFORM(COCOA)
         // Triggers with "notifyutil -p com.apple.WebKit.Cache.dump".
         int token;

Modified: trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.h (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/cache/NetworkCache.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -87,18 +87,19 @@
 
 using GlobalFrameID = std::pair<WebCore::PageIdentifier, uint64_t /*webFrameID*/>;
 
-class Cache : public RefCounted<Cache> {
-public:
-    enum class Option {
-        // In testing mode we try to eliminate sources of randomness. Cache does not shrink and there are no read timeouts.
-        TestingMode = 1 << 0,
-        RegisterNotify = 1 << 1,
+enum class CacheOption : uint8_t {
+    // In testing mode we try to eliminate sources of randomness. Cache does not shrink and there are no read timeouts.
+    TestingMode = 1 << 0,
+    RegisterNotify = 1 << 1,
 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
-        SpeculativeRevalidation = 1 << 2,
+    SpeculativeRevalidation = 1 << 2,
 #endif
-    };
-    static RefPtr<Cache> open(NetworkProcess&, const String& cachePath, OptionSet<Option>);
+};
 
+class Cache : public RefCounted<Cache> {
+public:
+    static RefPtr<Cache> open(NetworkProcess&, const String& cachePath, OptionSet<CacheOption>);
+
     void setCapacity(size_t);
 
     // Completion handler may get called back synchronously on failure.
@@ -148,7 +149,7 @@
     ~Cache();
 
 private:
-    Cache(NetworkProcess&, Ref<Storage>&&, OptionSet<Option> options);
+    Cache(NetworkProcess&, Ref<Storage>&&, OptionSet<CacheOption>);
 
     Key makeCacheKey(const WebCore::ResourceRequest&);
 

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkProcessCocoa.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -117,18 +117,14 @@
         return;
 
     SandboxExtension::consumePermanently(parameters.diskCacheDirectoryExtensionHandle);
-    OptionSet<NetworkCache::Cache::Option> cacheOptions { NetworkCache::Cache::Option::RegisterNotify };
+    m_cacheOptions = { NetworkCache::CacheOption::RegisterNotify };
     if (parameters.shouldUseTestingNetworkSession)
-        cacheOptions.add(NetworkCache::Cache::Option::TestingMode);
+        m_cacheOptions.add(NetworkCache::CacheOption::TestingMode);
 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
     if (parameters.shouldEnableNetworkCacheSpeculativeRevalidation)
-        cacheOptions.add(NetworkCache::Cache::Option::SpeculativeRevalidation);
+        m_cacheOptions.add(NetworkCache::CacheOption::SpeculativeRevalidation);
 #endif
 
-    m_cache = NetworkCache::Cache::open(*this, m_diskCacheDirectory, cacheOptions);
-    if (!m_cache)
-        RELEASE_LOG_ERROR(NetworkCache, "Failed to initialize the WebKit network disk cache");
-
     // Disable NSURLCache.
     auto urlCache(adoptNS([[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]));
     [NSURLCache setSharedURLCache:urlCache.get()];
@@ -200,15 +196,13 @@
     if (!m_clearCacheDispatchGroup)
         m_clearCacheDispatchGroup = dispatch_group_create();
 
-    auto* cache = this->cache();
-    if (!cache) {
-        completionHandler();
-        return;
-    }
-
     auto group = m_clearCacheDispatchGroup;
-    dispatch_group_async(group, dispatch_get_main_queue(), makeBlockPtr([cache, modifiedSince, completionHandler = WTFMove(completionHandler)] () mutable {
-        cache->clear(modifiedSince, WTFMove(completionHandler));
+    dispatch_group_async(group, dispatch_get_main_queue(), makeBlockPtr([this, protectedThis = makeRef(*this), modifiedSince, completionHandler = WTFMove(completionHandler)] () mutable {
+        auto aggregator = CallbackAggregator::create(WTFMove(completionHandler));
+        for (auto& session : networkSessions().values()) {
+            if (auto* cache = session->cache())
+                cache->clear(modifiedSince, [aggregator = aggregator.copyRef()] () { });
+        }
     }).get());
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -924,7 +924,7 @@
 }
 
 NetworkSessionCocoa::NetworkSessionCocoa(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters)
-    : NetworkSession(networkProcess, parameters.sessionID, WTFMove(parameters.localStorageDirectory), parameters.localStorageDirectoryExtensionHandle)
+    : NetworkSession(networkProcess, parameters)
     , m_boundInterfaceIdentifier(parameters.boundInterfaceIdentifier)
     , m_sourceApplicationBundleIdentifier(parameters.sourceApplicationBundleIdentifier)
     , m_sourceApplicationSecondaryIdentifier(parameters.sourceApplicationSecondaryIdentifier)

Modified: trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -38,7 +38,7 @@
 using namespace WebCore;
 
 NetworkSessionCurl::NetworkSessionCurl(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters)
-    : NetworkSession(networkProcess, parameters.sessionID, WTFMove(parameters.localStorageDirectory), parameters.localStorageDirectoryExtensionHandle)
+    : NetworkSession(networkProcess, parameters)
 {
     if (!parameters.cookiePersistentStorageFile.isEmpty())
         networkStorageSession()->setCookieDatabase(makeUniqueRef<CookieJarDB>(parameters.cookiePersistentStorageFile));

Modified: trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -78,8 +78,10 @@
     ResourceCachesToClear resourceCachesToClear = static_cast<ResourceCachesToClear>(cachesToClear);
     if (resourceCachesToClear == InMemoryResourceCachesOnly)
         return;
-    if (m_cache)
-        m_cache->clear();
+    for (auto& session : networkSessions().values()) {
+        if (auto* cache = session->cache())
+            cache->clear();
+    }
 }
 
 void NetworkProcess::platformInitializeNetworkProcess(const NetworkProcessCreationParameters& parameters)

Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkProcessSoup.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/soup/NetworkProcessSoup.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkProcessSoup.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -29,6 +29,7 @@
 
 #include "NetworkCache.h"
 #include "NetworkProcessCreationParameters.h"
+#include "NetworkSession.h"
 #include "ResourceCachesToClear.h"
 #include "WebCookieManager.h"
 #include "WebKitCachedResolver.h"
@@ -38,6 +39,7 @@
 #include <WebCore/ResourceHandle.h>
 #include <WebCore/SoupNetworkSession.h>
 #include <libsoup/soup.h>
+#include <wtf/CallbackAggregator.h>
 #include <wtf/FileSystem.h>
 #include <wtf/RAMSize.h>
 #include <wtf/glib/GRefPtr.h>
@@ -115,14 +117,12 @@
 
     SoupNetworkSession::clearOldSoupCache(FileSystem::directoryName(m_diskCacheDirectory));
 
-    OptionSet<NetworkCache::Cache::Option> cacheOptions { NetworkCache::Cache::Option::RegisterNotify };
+    OptionSet<NetworkCache::CacheOption> cacheOptions { NetworkCache::CacheOption::RegisterNotify };
 #if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
     if (parameters.shouldEnableNetworkCacheSpeculativeRevalidation)
-        cacheOptions.add(NetworkCache::Cache::Option::SpeculativeRevalidation);
+        cacheOptions.add(NetworkCache::CacheOption::SpeculativeRevalidation);
 #endif
 
-    m_cache = NetworkCache::Cache::open(*this, m_diskCacheDirectory, cacheOptions);
-
     supplement<WebCookieManager>()->setHTTPCookieAcceptPolicy(parameters.cookieAcceptPolicy, OptionalCallbackID());
 
     if (!parameters.languages.isEmpty())
@@ -156,11 +156,11 @@
 
 void NetworkProcess::clearDiskCache(WallTime modifiedSince, CompletionHandler<void()>&& completionHandler)
 {
-    if (!m_cache) {
-        completionHandler();
-        return;
+    auto aggregator = CallbackAggregator::create(WTFMove(completionHandler));
+    for (auto& session : networkSessions().values()) {
+        if (auto* cache = session->cache())
+            cache->clear(modifiedSince, [aggregator = aggregator.copyRef()] () { });
     }
-    m_cache->clear(modifiedSince, WTFMove(completionHandler));
 }
 
 void NetworkProcess::platformTerminate()

Modified: trunk/Source/WebKit/NetworkProcess/soup/NetworkSessionSoup.cpp (247566 => 247567)


--- trunk/Source/WebKit/NetworkProcess/soup/NetworkSessionSoup.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/NetworkProcess/soup/NetworkSessionSoup.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -40,7 +40,7 @@
 using namespace WebCore;
 
 NetworkSessionSoup::NetworkSessionSoup(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters)
-    : NetworkSession(networkProcess, parameters.sessionID, WTFMove(parameters.localStorageDirectory), parameters.localStorageDirectoryExtensionHandle)
+    : NetworkSession(networkProcess, parameters)
 {
     networkStorageSession()->setCookieObserverHandler([this] {
         this->networkProcess().supplement<WebCookieManager>()->notifyCookiesDidChange(m_sessionID);

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm (247566 => 247567)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -248,6 +248,8 @@
             config->setCacheStorageDirectory(configuration._cacheStorageDirectory.path);
         if (configuration._serviceWorkerRegistrationDirectory)
             config->setServiceWorkerRegistrationDirectory(configuration._serviceWorkerRegistrationDirectory.path);
+        if (configuration.networkCacheDirectory)
+            config->setNetworkCacheDirectory(configuration.networkCacheDirectory.path);
     } else {
         RELEASE_ASSERT(!configuration._webStorageDirectory);
         RELEASE_ASSERT(!configuration._webSQLDatabaseDirectory);
@@ -256,6 +258,7 @@
         RELEASE_ASSERT(!configuration._resourceLoadStatisticsDirectory);
         RELEASE_ASSERT(!configuration._cacheStorageDirectory);
         RELEASE_ASSERT(!configuration._serviceWorkerRegistrationDirectory);
+        RELEASE_ASSERT(!configuration.networkCacheDirectory);
     }
 
     if (configuration.sourceApplicationBundleIdentifier)

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h (247566 => 247567)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -53,6 +53,7 @@
 @property (nonatomic, copy, setter=_setResourceLoadStatisticsDirectory:) NSURL *_resourceLoadStatisticsDirectory WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
 @property (nonatomic, copy, setter=_setCacheStorageDirectory:) NSURL *_cacheStorageDirectory WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
 @property (nonatomic, copy, setter=_setServiceWorkerRegistrationDirectory:) NSURL *_serviceWorkerRegistrationDirectory WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
+@property (nonatomic, nullable, copy) NSURL *networkCacheDirectory WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 // Testing only.
 @property (nonatomic) BOOL allLoadsBlockedByDeviceManagementRestrictionsForTesting WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm (247566 => 247567)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsiteDataStoreConfiguration.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -89,6 +89,19 @@
     _configuration->setIndexedDBDatabaseDirectory(url.path);
 }
 
+- (NSURL *)networkCacheDirectory
+{
+    return [NSURL fileURLWithPath:_configuration->networkCacheDirectory() isDirectory:YES];
+}
+
+- (void)setNetworkCacheDirectory:(NSURL *)url
+{
+    if (!_configuration->isPersistent())
+        [NSException raise:NSInvalidArgumentException format:@"Cannot set networkCacheDirectory on a non-persistent _WKWebsiteDataStoreConfiguration."];
+    checkURLArgument(url);
+    _configuration->setNetworkCacheDirectory(url.path);
+}
+
 - (NSURL *)_webSQLDatabaseDirectory
 {
     return [NSURL fileURLWithPath:_configuration->webSQLDatabaseDirectory() isDirectory:YES];

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm (247566 => 247567)


--- trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -112,6 +112,11 @@
     if (!localStorageDirectory.isEmpty())
         SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory, localStorageDirectoryExtensionHandle);
 
+    auto networkCacheDirectory = resolvedNetworkCacheDirectory();
+    SandboxExtension::Handle networkCacheDirectoryExtensionHandle;
+    if (!networkCacheDirectory.isEmpty())
+        SandboxExtension::createHandleForReadWriteDirectory(networkCacheDirectory, networkCacheDirectoryExtensionHandle);
+
     bool shouldIncludeLocalhostInResourceLoadStatistics = isSafari;
     WebsiteDataStoreParameters parameters;
     parameters.networkSessionParameters = {
@@ -135,7 +140,9 @@
         m_configuration->allLoadsBlockedByDeviceManagementRestrictionsForTesting(),
         WTFMove(resourceLoadStatisticsManualPrevalentResource),
         WTFMove(localStorageDirectory),
-        WTFMove(localStorageDirectoryExtensionHandle)
+        WTFMove(localStorageDirectoryExtensionHandle),
+        WTFMove(networkCacheDirectory),
+        WTFMove(networkCacheDirectoryExtensionHandle),
     };
     networkingHasBegun();
 

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (247566 => 247567)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2019-07-18 18:41:31 UTC (rev 247567)
@@ -206,6 +206,8 @@
         m_resolvedConfiguration->setIndexedDBDatabaseDirectory(resolveAndCreateReadWriteDirectoryForSandboxExtension(m_configuration->indexedDBDatabaseDirectory()));
     if (!m_configuration->deviceIdHashSaltsStorageDirectory().isEmpty())
         m_resolvedConfiguration->setDeviceIdHashSaltsStorageDirectory(resolveAndCreateReadWriteDirectoryForSandboxExtension(m_configuration->deviceIdHashSaltsStorageDirectory()));
+    if (!m_configuration->networkCacheDirectory().isEmpty())
+        m_resolvedConfiguration->setNetworkCacheDirectory(resolveAndCreateReadWriteDirectoryForSandboxExtension(m_configuration->networkCacheDirectory()));
     if (!m_configuration->resourceLoadStatisticsDirectory().isEmpty())
         m_resolvedConfiguration->setResourceLoadStatisticsDirectory(resolveAndCreateReadWriteDirectoryForSandboxExtension(m_configuration->resourceLoadStatisticsDirectory()));
     if (!m_configuration->serviceWorkerRegistrationDirectory().isEmpty() && m_resolvedConfiguration->serviceWorkerRegistrationDirectory().isEmpty())

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (247566 => 247567)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -184,6 +184,7 @@
     void resolveDirectoriesIfNecessary();
     const String& resolvedApplicationCacheDirectory() const { return m_resolvedConfiguration->applicationCacheDirectory(); }
     const String& resolvedLocalStorageDirectory() const { return m_resolvedConfiguration->localStorageDirectory(); }
+    const String& resolvedNetworkCacheDirectory() const { return m_resolvedConfiguration->networkCacheDirectory(); }
     const String& resolvedMediaCacheDirectory() const { return m_resolvedConfiguration->mediaCacheDirectory(); }
     const String& resolvedMediaKeysDirectory() const { return m_resolvedConfiguration->mediaKeysStorageDirectory(); }
     const String& resolvedDatabaseDirectory() const { return m_resolvedConfiguration->webSQLDatabaseDirectory(); }

Modified: trunk/Tools/ChangeLog (247566 => 247567)


--- trunk/Tools/ChangeLog	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Tools/ChangeLog	2019-07-18 18:41:31 UTC (rev 247567)
@@ -1,3 +1,16 @@
+2019-07-18  Alex Christensen  <achristen...@webkit.org>
+
+        Move NetworkCache ownership from NetworkProcess to NetworkSession
+        https://bugs.webkit.org/show_bug.cgi?id=199817
+
+        Reviewed by Geoff Garen.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
+        (TEST):
+        * TestWebKitAPI/cocoa/TestWKWebView.h:
+        * TestWebKitAPI/cocoa/TestWKWebView.mm:
+        (-[WKWebView synchronouslyLoadRequest:]):
+
 2019-07-18  Youenn Fablet  <you...@apple.com>
 
         Make sure to set kCTFontFallbackOptionAttribute to kCTFontFallbackOptionSystem for system fonts

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm (247566 => 247567)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -26,6 +26,7 @@
 #import "config.h"
 
 #import "PlatformUtilities.h"
+#import "TCPServer.h"
 #import "Test.h"
 #import "TestNavigationDelegate.h"
 #import "TestWKWebView.h"
@@ -521,3 +522,35 @@
     EXPECT_TRUE([websiteDataStore._sourceApplicationBundleIdentifier isEqualToString:@"otheridentifier"]);
     EXPECT_TRUE([[websiteDataStoreConfiguration sourceApplicationBundleIdentifier] isEqualToString:@"testidentifier"]);
 }
+
+TEST(WebKit, NetworkCacheDirectory)
+{
+    using namespace TestWebKitAPI;
+    TCPServer server([] (int socket) {
+        TCPServer::read(socket);
+        const char* response =
+        "HTTP/1.1 200 OK\r\n"
+        "Cache-Control: max-age=1000000\r\n"
+        "Content-Length: 6\r\n\r\n"
+        "Hello!";
+        TCPServer::write(socket, response, strlen(response));
+    });
+    
+    NSURL *tempDir = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"CustomPathsTest"] isDirectory:YES];
+    
+    auto websiteDataStoreConfiguration = adoptNS([[_WKWebsiteDataStoreConfiguration alloc] init]);
+    [websiteDataStoreConfiguration setNetworkCacheDirectory:tempDir];
+
+    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [webViewConfiguration setWebsiteDataStore:[[[WKWebsiteDataStore alloc] _initWithConfiguration:websiteDataStoreConfiguration.get()] autorelease]];
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
+    [webView synchronouslyLoadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d/", server.port()]]]];
+    NSString *path = tempDir.path;
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    while (![fileManager fileExistsAtPath:path])
+        Util::spinRunLoop();
+    NSError *error = nil;
+    [fileManager removeItemAtPath:path error:&error];
+    EXPECT_FALSE(error);
+}

Modified: trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h (247566 => 247567)


--- trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h	2019-07-18 18:41:31 UTC (rev 247567)
@@ -52,6 +52,7 @@
 - (void)loadTestPageNamed:(NSString *)pageName;
 - (void)synchronouslyLoadHTMLString:(NSString *)html;
 - (void)synchronouslyLoadHTMLString:(NSString *)html baseURL:(NSURL *)url;
+- (void)synchronouslyLoadRequest:(NSURLRequest *)request;
 - (void)synchronouslyLoadTestPageNamed:(NSString *)pageName;
 - (BOOL)_synchronouslyExecuteEditCommand:(NSString *)command argument:(NSString *)argument;
 - (void)expectElementTagsInOrder:(NSArray<NSString *> *)tagNames;

Modified: trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm (247566 => 247567)


--- trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm	2019-07-18 18:34:29 UTC (rev 247566)
+++ trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm	2019-07-18 18:41:31 UTC (rev 247567)
@@ -71,6 +71,12 @@
     [self loadRequest:request];
 }
 
+- (void)synchronouslyLoadRequest:(NSURLRequest *)request
+{
+    [self loadRequest:request];
+    [self _test_waitForDidFinishNavigation];
+}
+
 - (void)synchronouslyLoadHTMLString:(NSString *)html baseURL:(NSURL *)url
 {
     [self loadHTMLString:html baseURL:url];
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to