⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 271291 in webkit


Ignore:
Timestamp:
Jan 8, 2021, 5:18:52 AM (6 years ago)
Author:
youenn@apple.com
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):

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r271287 r271291  
     12021-01-08  Youenn Fablet  <youenn@apple.com>
     2
     3        Make sure that if NetworkProcess clears DOMCache, it also clears service worker registrations
     4        https://bugs.webkit.org/show_bug.cgi?id=220408
     5        <rdar://problem/72360003>
     6
     7        Reviewed by Alex Christensen.
     8
     9        It is expected that clearing DOM cache mandates clearing service worker registrations
     10        as service workers expect cache entries added at install time to stay.
     11        It is hard for clients to enforce this so it is best to handle it in Network Process.
     12        When DOMCache is cleared, service worker registrations will also be cleared.
     13        The reverse is not guaranteed.
     14        Covered by API test.
     15
     16        * NetworkProcess/NetworkProcess.cpp:
     17        (WebKit::NetworkProcess::deleteWebsiteData):
     18        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
     19        (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
     20
    1212021-01-07  Alex Christensen  <achristensen@webkit.org>
    222
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r271184 r271291  
    15761576
    15771577#if ENABLE(SERVICE_WORKER)
    1578     if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && !sessionID.isEphemeral())
     1578    bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
     1579    if (clearServiceWorkers && !sessionID.isEphemeral())
    15791580        swServerForSession(sessionID).clearAll([clearTasksHandler] { });
    15801581#endif
     
    16891690
    16901691#if ENABLE(SERVICE_WORKER)
    1691     if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && !sessionID.isEphemeral()) {
     1692    bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
     1693    if (clearServiceWorkers && !sessionID.isEphemeral()) {
    16921694        auto& server = swServerForSession(sessionID);
    16931695        for (auto& originData : originDatas)
     
    18991901#if ENABLE(SERVICE_WORKER)
    19001902    path = m_serviceWorkerInfo.get(sessionID).databasePath;
    1901     if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations)) {
     1903    bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations);
     1904    if (clearServiceWorkers && !path.isEmpty()) {
    19021905        swServerForSession(sessionID).getOriginsWithRegistrations([this, sessionID, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator](const HashSet<SecurityOriginData>& securityOrigins) mutable {
    19031906            for (auto& securityOrigin : securityOrigins) {
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm

    r267763 r271291  
    23012301
    23022302#endif // HAVE(TLS_PROTOCOL_VERSION_T)
     2303
     2304TEST(ServiceWorkers, ClearDOMCacheAlsoIncludesServiceWorkerRegistrations)
     2305{
     2306    [WKWebsiteDataStore _allowWebsiteDataRecordsForAllOrigins];
     2307
     2308    // Start with a clean slate data store
     2309    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() {
     2310        done = true;
     2311    }];
     2312    TestWebKitAPI::Util::run(&done);
     2313    done = false;
     2314
     2315    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     2316
     2317    auto messageHandler = adoptNS([[SWMessageHandler alloc] init]);
     2318    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
     2319
     2320    ServiceWorkerTCPServer server({
     2321        { "text/html", mainBytes },
     2322        { "application/javascript", scriptBytes },
     2323    });
     2324
     2325    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     2326    [webView loadRequest:server.request()];
     2327    TestWebKitAPI::Util::run(&done);
     2328    done = false;
     2329
     2330    // Fetch SW records
     2331    auto websiteDataTypes = adoptNS([[NSSet alloc] initWithArray:@[WKWebsiteDataTypeServiceWorkerRegistrations]]);
     2332    static bool readyToContinue;
     2333    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
     2334        EXPECT_EQ(1U, dataRecords.count);
     2335        readyToContinue = true;
     2336    }];
     2337    TestWebKitAPI::Util::run(&readyToContinue);
     2338    readyToContinue = false;
     2339
     2340    // Clear DOM Cache
     2341    auto typesToRemove = adoptNS([[NSSet alloc] initWithArray:@[WKWebsiteDataTypeFetchCache]]);
     2342    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:typesToRemove.get() modifiedSince:[NSDate distantPast] completionHandler:^() {
     2343        done = true;
     2344    }];
     2345    TestWebKitAPI::Util::run(&done);
     2346    done = false;
     2347
     2348    // Fetch SW records again
     2349    [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) {
     2350        EXPECT_EQ(0U, dataRecords.count);
     2351        readyToContinue = true;
     2352    }];
     2353    TestWebKitAPI::Util::run(&readyToContinue);
     2354    readyToContinue = false;
     2355}
Note: See TracChangeset for help on using the changeset viewer.