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);