Title: [271291] trunk
Revision
271291
Author
[email protected]
Date
2021-01-08 05:18:52 -0800 (Fri, 08 Jan 2021)

Log Message

Make sure that if NetworkProcess clears DOMCache, it also clears service worker registrations
https://bugs.webkit.org/show_bug.cgi?id=220408
<rdar://problem/72360003>

Reviewed by Alex Christensen.

It is expected that clearing DOM cache mandates clearing service worker registrations
as service workers expect cache entries added at install time to stay.
It is hard for clients to enforce this so it is best to handle it in Network Process.
When DOMCache is cleared, service worker registrations will also be cleared.
The reverse is not guaranteed.
Covered by API test.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::deleteWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
(WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (271290 => 271291)


--- trunk/Source/WebKit/ChangeLog	2021-01-08 13:16:25 UTC (rev 271290)
+++ trunk/Source/WebKit/ChangeLog	2021-01-08 13:18:52 UTC (rev 271291)
@@ -1,3 +1,23 @@
+2021-01-08  Youenn Fablet  <[email protected]>
+
+        Make sure that if NetworkProcess clears DOMCache, it also clears service worker registrations
+        https://bugs.webkit.org/show_bug.cgi?id=220408
+        <rdar://problem/72360003>
+
+        Reviewed by Alex Christensen.
+
+        It is expected that clearing DOM cache mandates clearing service worker registrations
+        as service workers expect cache entries added at install time to stay.
+        It is hard for clients to enforce this so it is best to handle it in Network Process.
+        When DOMCache is cleared, service worker registrations will also be cleared.
+        The reverse is not guaranteed.
+        Covered by API test.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::deleteWebsiteData):
+        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
+        (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
+
 2021-01-07  Alex Christensen  <[email protected]>
 
         Use WeakHashSet instead of HashSet<T*>

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (271290 => 271291)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2021-01-08 13:16:25 UTC (rev 271290)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2021-01-08 13:18:52 UTC (rev 271291)
@@ -1575,7 +1575,8 @@
 #endif
 
 #if ENABLE(SERVICE_WORKER)
-    if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && !sessionID.isEphemeral())
+    bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
+    if (clearServiceWorkers && !sessionID.isEphemeral())
         swServerForSession(sessionID).clearAll([clearTasksHandler] { });
 #endif
 
@@ -1688,7 +1689,8 @@
 #endif
 
 #if ENABLE(SERVICE_WORKER)
-    if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && !sessionID.isEphemeral()) {
+    bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
+    if (clearServiceWorkers && !sessionID.isEphemeral()) {
         auto& server = swServerForSession(sessionID);
         for (auto& originData : originDatas)
             server.clear(originData, [clearTasksHandler] { });
@@ -1898,7 +1900,8 @@
     
 #if ENABLE(SERVICE_WORKER)
     path = m_serviceWorkerInfo.get(sessionID).databasePath;
-    if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations)) {
+    bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
+    if (clearServiceWorkers && !path.isEmpty()) {
         swServerForSession(sessionID).getOriginsWithRegistrations([this, sessionID, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
             for (auto& securityOrigin : securityOrigins) {
                 if (!domainsToDeleteAllNonCookieWebsiteDataFor.contains(RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host)))

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm (271290 => 271291)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2021-01-08 13:16:25 UTC (rev 271290)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2021-01-08 13:18:52 UTC (rev 271291)
@@ -2300,3 +2300,56 @@
 }
 
 #endif // HAVE(TLS_PROTOCOL_VERSION_T)
+
+TEST(ServiceWorkers, ClearDOMCacheAlsoIncludesServiceWorkerRegistrations)
+{
+    [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;
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+
+    auto messageHandler = adoptNS([[SWMessageHandler alloc] init]);
+    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
+
+    ServiceWorkerTCPServer server({
+        { "text/html", mainBytes },
+        { "application/_javascript_", scriptBytes },
+    });
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView loadRequest:server.request()];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    // Fetch SW records
+    auto websiteDataTypes = adoptNS([[NSSet alloc] initWithArray:@[WKWebsiteDataTypeServiceWorkerRegistrations]]);
+    static bool readyToContinue;
+    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+        EXPECT_EQ(1U, dataRecords.count);
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+    readyToContinue = false;
+
+    // Clear DOM Cache
+    auto typesToRemove = adoptNS([[NSSet alloc] initWithArray:@[WKWebsiteDataTypeFetchCache]]);
+    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:typesToRemove.get() modifiedSince:[NSDate distantPast] completionHandler:^() {
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+    done = false;
+
+    // Fetch SW records again
+    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
+        EXPECT_EQ(0U, dataRecords.count);
+        readyToContinue = true;
+    }];
+    TestWebKitAPI::Util::run(&readyToContinue);
+    readyToContinue = false;
+}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to