Title: [237060] trunk
Revision
237060
Author
[email protected]
Date
2018-10-11 18:33:26 -0700 (Thu, 11 Oct 2018)

Log Message

IOS 12 - Service worker cache not shared when added to homescreen
https://bugs.webkit.org/show_bug.cgi?id=190269
<rdar://problem/45009961>

Reviewed by Alex Christensen.

Source/WebCore:

Expose Cache Storage API when Service Worker API is exposed.
This is used for API tests.

* dom/ScriptExecutionContext.h: Make hasServiceWorkerScheme
available outside SERVICE_WORKER compilation flag since used by DOMWindowCaches.
* dom/ScriptExecutionContext.cpp: Ditto.
* Modules/cache/DOMWindowCaches.idl:

Source/WebKit:

NetworkProcessProxy does not always have all its stores in its hash map.
Make sure to check for the default web process pool store when grabbing cache storage parameters from a given session ID.

Add a way to remove the default website data for testing.
This is used in the new API test.

* UIProcess/API/APIWebsiteDataStore.cpp:
(API::WebsiteDataStore::deleteDefaultDataStoreForTesting):
* UIProcess/API/APIWebsiteDataStore.h:
* UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(+[WKWebsiteDataStore _deleteDefaultDataStoreForTesting]):
* UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::retrieveCacheStorageParameters):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
Add test to ensure that CacheStorage use the default website data store parameters.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (237059 => 237060)


--- trunk/Source/WebCore/ChangeLog	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebCore/ChangeLog	2018-10-12 01:33:26 UTC (rev 237060)
@@ -1,3 +1,19 @@
+2018-10-11  Youenn Fablet  <[email protected]>
+
+        IOS 12 - Service worker cache not shared when added to homescreen
+        https://bugs.webkit.org/show_bug.cgi?id=190269
+        <rdar://problem/45009961>
+
+        Reviewed by Alex Christensen.
+
+        Expose Cache Storage API when Service Worker API is exposed.
+        This is used for API tests.
+
+        * dom/ScriptExecutionContext.h: Make hasServiceWorkerScheme
+        available outside SERVICE_WORKER compilation flag since used by DOMWindowCaches.
+        * dom/ScriptExecutionContext.cpp: Ditto.
+        * Modules/cache/DOMWindowCaches.idl:
+
 2018-10-10  Simon Fraser  <[email protected]>
 
         Hide RenderLayer z-order and normal flow lists behind iterators

Modified: trunk/Source/WebCore/Modules/cache/DOMWindowCaches.idl (237059 => 237060)


--- trunk/Source/WebCore/Modules/cache/DOMWindowCaches.idl	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebCore/Modules/cache/DOMWindowCaches.idl	2018-10-12 01:33:26 UTC (rev 237060)
@@ -26,5 +26,5 @@
 [
     EnabledAtRuntime=CacheAPI,
 ] partial interface DOMWindow {
-    [CallWith=ScriptExecutionContext, MayThrowException, SecureContext, SameObject] readonly attribute DOMCacheStorage caches;
+    [CallWith=ScriptExecutionContext, MayThrowException, SecureContext, ContextHasServiceWorkerScheme, SameObject] readonly attribute DOMCacheStorage caches;
 };

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (237059 => 237060)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp	2018-10-12 01:33:26 UTC (rev 237060)
@@ -528,8 +528,6 @@
     return m_domainForCachePartition.isNull() ? topOrigin().domainForCachePartition() : m_domainForCachePartition;
 }
 
-#if ENABLE(SERVICE_WORKER)
-
 bool ScriptExecutionContext::hasServiceWorkerScheme()
 {
     ASSERT(securityOrigin());
@@ -536,6 +534,8 @@
     return SchemeRegistry::isServiceWorkerContainerCustomScheme(securityOrigin()->protocol());
 }
 
+#if ENABLE(SERVICE_WORKER)
+
 ServiceWorker* ScriptExecutionContext::activeServiceWorker() const
 {
     return m_activeServiceWorker.get();

Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (237059 => 237060)


--- trunk/Source/WebCore/dom/ScriptExecutionContext.h	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h	2018-10-12 01:33:26 UTC (rev 237060)
@@ -244,8 +244,8 @@
     WEBCORE_EXPORT String domainForCachePartition() const;
     void setDomainForCachePartition(String&& domain) { m_domainForCachePartition = WTFMove(domain); }
 
+    bool hasServiceWorkerScheme();
 #if ENABLE(SERVICE_WORKER)
-    bool hasServiceWorkerScheme();
     ServiceWorker* activeServiceWorker() const;
     void setActiveServiceWorker(RefPtr<ServiceWorker>&&);
 

Modified: trunk/Source/WebKit/ChangeLog (237059 => 237060)


--- trunk/Source/WebKit/ChangeLog	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/ChangeLog	2018-10-12 01:33:26 UTC (rev 237060)
@@ -1,3 +1,26 @@
+2018-10-11  Youenn Fablet  <[email protected]>
+
+        IOS 12 - Service worker cache not shared when added to homescreen
+        https://bugs.webkit.org/show_bug.cgi?id=190269
+        <rdar://problem/45009961>
+
+        Reviewed by Alex Christensen.
+
+        NetworkProcessProxy does not always have all its stores in its hash map.
+        Make sure to check for the default web process pool store when grabbing cache storage parameters from a given session ID.
+
+        Add a way to remove the default website data for testing.
+        This is used in the new API test.
+
+        * UIProcess/API/APIWebsiteDataStore.cpp:
+        (API::WebsiteDataStore::deleteDefaultDataStoreForTesting):
+        * UIProcess/API/APIWebsiteDataStore.h:
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+        (+[WKWebsiteDataStore _deleteDefaultDataStoreForTesting]):
+        * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::retrieveCacheStorageParameters):
+
 2018-10-10  Simon Fraser  <[email protected]>
 
         Hide RenderLayer z-order and normal flow lists behind iterators

Modified: trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp (237059 => 237060)


--- trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp	2018-10-12 01:33:26 UTC (rev 237060)
@@ -31,21 +31,32 @@
 
 namespace API {
 
-static WebsiteDataStore* globalDefaultDataStore;
+static RefPtr<WebsiteDataStore>& globalDefaultDataStore()
+{
+    static NeverDestroyed<RefPtr<WebsiteDataStore>> globalDefaultDataStore;
+    return globalDefaultDataStore.get();
+}
 
+
 Ref<WebsiteDataStore> WebsiteDataStore::defaultDataStore()
 {
     WebKit::InitializeWebKit2();
 
-    if (!globalDefaultDataStore)
-        globalDefaultDataStore = adoptRef(new WebsiteDataStore(defaultDataStoreConfiguration(), PAL::SessionID::defaultSessionID())).leakRef();
+    auto& store = globalDefaultDataStore();
+    if (!store)
+        store = adoptRef(new WebsiteDataStore(defaultDataStoreConfiguration(), PAL::SessionID::defaultSessionID()));
 
-    return *globalDefaultDataStore;
+    return *store;
 }
 
+void WebsiteDataStore::deleteDefaultDataStoreForTesting()
+{
+    globalDefaultDataStore() = nullptr;
+}
+
 bool WebsiteDataStore::defaultDataStoreExists()
 {
-    return globalDefaultDataStore;
+    return !!globalDefaultDataStore();
 }
 
 Ref<WebsiteDataStore> WebsiteDataStore::createNonPersistentDataStore()

Modified: trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h (237059 => 237060)


--- trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h	2018-10-12 01:33:26 UTC (rev 237060)
@@ -36,6 +36,7 @@
 public:
     static Ref<WebsiteDataStore> defaultDataStore();
     static bool defaultDataStoreExists();
+    static void deleteDefaultDataStoreForTesting();
 
     static Ref<WebsiteDataStore> createNonPersistentDataStore();
     static Ref<WebsiteDataStore> createLegacy(WebKit::WebsiteDataStore::Configuration);

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2018-10-12 01:33:26 UTC (rev 237060)
@@ -184,6 +184,11 @@
     return API::WebsiteDataStore::defaultDataStoreExists();
 }
 
++ (void)_deleteDefaultDataStoreForTesting
+{
+    return API::WebsiteDataStore::deleteDefaultDataStoreForTesting();
+}
+
 - (instancetype)_initWithConfiguration:(_WKWebsiteDataStoreConfiguration *)configuration
 {
     if (!(self = [super init]))

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h (237059 => 237060)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2018-10-12 01:33:26 UTC (rev 237060)
@@ -40,6 +40,7 @@
 
 + (NSSet<NSString *> *)_allWebsiteDataTypesIncludingPrivate;
 + (BOOL)_defaultDataStoreExists;
++ (void)_deleteDefaultDataStoreForTesting;
 
 - (instancetype)_initWithConfiguration:(_WKWebsiteDataStoreConfiguration *)configuration WK_API_AVAILABLE(macosx(10.13), ios(11.0));
 

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (237059 => 237060)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2018-10-12 01:33:26 UTC (rev 237060)
@@ -622,22 +622,40 @@
         m_websiteDataStores.remove(sessionID);
 }
 
+WebsiteDataStore* NetworkProcessProxy::websiteDataStoreFromSessionID(PAL::SessionID sessionID)
+{
+    auto iterator = m_websiteDataStores.find(sessionID);
+    if (iterator != m_websiteDataStores.end())
+        return iterator->value.get();
+
+    if (auto* websiteDataStore = m_processPool.websiteDataStore()) {
+        if (sessionID == websiteDataStore->websiteDataStore().sessionID())
+            return &websiteDataStore->websiteDataStore();
+    }
+
+    if (sessionID != PAL::SessionID::defaultSessionID())
+        return nullptr;
+
+    return &API::WebsiteDataStore::defaultDataStore()->websiteDataStore();
+}
+
 void NetworkProcessProxy::retrieveCacheStorageParameters(PAL::SessionID sessionID)
 {
-    auto iterator = m_websiteDataStores.find(sessionID);
-    if (iterator == m_websiteDataStores.end()) {
+    auto* store = websiteDataStoreFromSessionID(sessionID);
+
+    if (!store) {
+        RELEASE_LOG_ERROR(CacheStorage, "%p - NetworkProcessProxy is unable to retrieve CacheStorage parameters from the given session ID %" PRIu64, this, sessionID.sessionID());
         auto quota = m_processPool.websiteDataStore() ? m_processPool.websiteDataStore()->websiteDataStore().cacheStoragePerOriginQuota() : WebsiteDataStore::defaultCacheStoragePerOriginQuota;
         send(Messages::NetworkProcess::SetCacheStorageParameters { sessionID, quota, { }, { } }, 0);
         return;
     }
 
-    auto& store = *iterator->value;
-    auto& cacheStorageDirectory = store.cacheStorageDirectory();
+    auto& cacheStorageDirectory = store->cacheStorageDirectory();
     SandboxExtension::Handle cacheStorageDirectoryExtensionHandle;
     if (!cacheStorageDirectory.isEmpty())
         SandboxExtension::createHandleForReadWriteDirectory(cacheStorageDirectory, cacheStorageDirectoryExtensionHandle);
 
-    send(Messages::NetworkProcess::SetCacheStorageParameters { sessionID, store.cacheStoragePerOriginQuota(), cacheStorageDirectory, cacheStorageDirectoryExtensionHandle }, 0);
+    send(Messages::NetworkProcess::SetCacheStorageParameters { sessionID, store->cacheStoragePerOriginQuota(), cacheStorageDirectory, cacheStorageDirectoryExtensionHandle }, 0);
 }
 
 #if ENABLE(CONTENT_EXTENSIONS)

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (237059 => 237060)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2018-10-12 01:33:26 UTC (rev 237060)
@@ -165,6 +165,8 @@
     void establishWorkerContextConnectionToNetworkProcessForExplicitSession(WebCore::SecurityOriginData&&, PAL::SessionID);
 #endif
 
+    WebsiteDataStore* websiteDataStoreFromSessionID(PAL::SessionID);
+
     // ProcessLauncher::Client
     void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;
 

Modified: trunk/Tools/ChangeLog (237059 => 237060)


--- trunk/Tools/ChangeLog	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Tools/ChangeLog	2018-10-12 01:33:26 UTC (rev 237060)
@@ -1,3 +1,14 @@
+2018-10-11  Youenn Fablet  <[email protected]>
+
+        IOS 12 - Service worker cache not shared when added to homescreen
+        https://bugs.webkit.org/show_bug.cgi?id=190269
+        <rdar://problem/45009961>
+
+        Reviewed by Alex Christensen.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
+        Add test to ensure that CacheStorage use the default website data store parameters.
+
 2018-10-11  Tim Horton  <[email protected]>
 
         Clicking on bookmarklet crashes at NavigationState::willRecordNavigationSnapshot

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm (237059 => 237060)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2018-10-12 01:32:19 UTC (rev 237059)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2018-10-12 01:33:26 UTC (rev 237060)
@@ -194,7 +194,33 @@
 }
 @end
 
+static const char* mainCacheStorageBytes = R"SWRESOURCE(
+<script>
 
+function log(msg)
+{
+    window.webkit.messageHandlers.sw.postMessage(msg);
+}
+
+async function doTest()
+{
+    const keys = await window.caches.keys();
+    if (!keys.length) {
+        const cache = await window.caches.open("my cache");
+        log("No cache storage data");
+        return;
+    }
+    if (keys.length !== 1) {
+        log("Unexpected cache number");
+        return;
+    }
+    log("Some cache storage data: " + keys[0]);
+}
+doTest();
+
+</script>
+)SWRESOURCE";
+
 static const char* mainBytes = R"SWRESOURCE(
 <script>
 
@@ -541,6 +567,63 @@
     done = false;
 }
 
+TEST(ServiceWorkers, CacheStorageRestoreFromDisk)
+{
+    ASSERT(mainCacheStorageBytes);
+    [WKWebsiteDataStore _allowWebsiteDataRecordsForAllOrigins];
+
+    // Start with a clean slate data store
+    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() {
+        done = true;
+    }];
+
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    [WKWebsiteDataStore _deleteDefaultDataStoreForTesting];
+
+    auto handler = adoptNS([[SWSchemes alloc] init]);
+    handler->resources.set("sw://host/main.html", ResourceInfo { @"text/html", mainCacheStorageBytes });
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto messageHandler = adoptNS([[SWMessageHandlerForRestoreFromDiskTest alloc] initWithExpectedMessage:@"No cache storage data"]);
+
+    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
+    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"SW"];
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView.get().configuration.processPool _registerURLSchemeServiceWorkersCanHandle:@"sw"];
+
+    // Trigger creation of network process.
+    [webView.get().configuration.processPool _syncNetworkProcessCookies];
+
+    auto *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/main.html"]];
+    [webView loadRequest:request];
+
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    webView = nullptr;
+    configuration = nullptr;
+    messageHandler = nullptr;
+
+    configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    messageHandler = adoptNS([[SWMessageHandlerForRestoreFromDiskTest alloc] initWithExpectedMessage:@"Some cache storage data: my cache"]);
+
+    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
+    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"SW"];
+
+    webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView.get().configuration.processPool _registerURLSchemeServiceWorkersCanHandle:@"sw"];
+
+    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/main.html"]];
+    [webView loadRequest:request];
+
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+}
+
+
 TEST(ServiceWorkers, FetchAfterRestoreFromDisk)
 {
     ASSERT(mainForFetchTestBytes);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to