Changeset 228025 in webkit


Ignore:
Timestamp:
Feb 2, 2018 1:08:58 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

Clearing all service worker registrations should wait for importing service worker registration to finish
https://bugs.webkit.org/show_bug.cgi?id=182407

Patch by Youenn Fablet <youenn@apple.com> on 2018-02-02
Reviewed by Chris Dumez.

Source/WebCore:

Covered by existing tests and the service worker API test being no longer flaky.

  • workers/service/server/SWServer.cpp:

(WebCore::SWServer::registrationStoreImportComplete):
(WebCore::SWServer::clearAll):
(WebCore::SWServer::clear):
(WebCore::SWServer::getOriginsWithRegistrations):

  • workers/service/server/SWServer.h:

Source/WebKit:

Updating API to take a completion handler.

  • UIProcess/API/C/WKWebsiteDataStoreRef.cpp:

(WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations):

  • UIProcess/API/C/WKWebsiteDataStoreRef.h:

Tools:

Make sure we finish clearing service worker registrations before running tests.

  • WebKitTestRunner/TestController.cpp:

(WTR::TestController::resetStateToConsistentValues):
(WTR::ClearServiceWorkerRegistrationsCallbackContext::ClearServiceWorkerRegistrationsCallbackContext):
(WTR::clearServiceWorkerRegistrationsCallback):
(WTR::TestController::clearServiceWorkerRegistrations):

  • WebKitTestRunner/TestController.h:
Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r228015 r228025  
     12018-02-02  Youenn Fablet  <youenn@apple.com>
     2
     3        Clearing all service worker registrations should wait for importing service worker registration to finish
     4        https://bugs.webkit.org/show_bug.cgi?id=182407
     5
     6        Reviewed by Chris Dumez.
     7
     8        Covered by existing tests and the service worker API test being no longer flaky.
     9
     10        * workers/service/server/SWServer.cpp:
     11        (WebCore::SWServer::registrationStoreImportComplete):
     12        (WebCore::SWServer::clearAll):
     13        (WebCore::SWServer::clear):
     14        (WebCore::SWServer::getOriginsWithRegistrations):
     15        * workers/service/server/SWServer.h:
     16
    1172018-02-02  Chris Dumez  <cdumez@apple.com>
    218
  • trunk/Source/WebCore/workers/service/server/SWServer.cpp

    r227989 r228025  
    115115    m_importCompleted = true;
    116116    m_originStore->importComplete();
     117
     118    auto clearCallbacks = WTFMove(m_clearCompletionCallbacks);
     119    for (auto& callback : clearCallbacks)
     120        callback();
     121
    117122    performGetOriginsWithRegistrationsCallbacks();
    118123}
     
    183188}
    184189
    185 void SWServer::clearAll(WTF::CompletionHandler<void()>&& completionHandler)
    186 {
     190void SWServer::clearAll(CompletionHandler<void()>&& completionHandler)
     191{
     192    if (!m_importCompleted) {
     193        m_clearCompletionCallbacks.append([this, completionHandler = WTFMove(completionHandler)] () mutable {
     194            ASSERT(m_importCompleted);
     195            clearAll(WTFMove(completionHandler));
     196        });
     197        return;
     198    }
     199
    187200    m_jobQueues.clear();
    188201    while (!m_registrations.isEmpty())
     
    194207}
    195208
    196 void SWServer::clear(const SecurityOrigin& origin, WTF::CompletionHandler<void()>&& completionHandler)
    197 {
     209void SWServer::clear(const SecurityOrigin& origin, CompletionHandler<void()>&& completionHandler)
     210{
     211    if (!m_importCompleted) {
     212        m_clearCompletionCallbacks.append([this, origin = makeRef(origin), completionHandler = WTFMove(completionHandler)] () mutable {
     213            ASSERT(m_importCompleted);
     214            clear(origin, WTFMove(completionHandler));
     215        });
     216        return;
     217    }
     218
    198219    m_jobQueues.removeIf([&](auto& keyAndValue) {
    199220        return keyAndValue.key.relatesToOrigin(origin);
     
    209230        return contextData.registration.key.relatesToOrigin(origin);
    210231    });
     232
     233    if (registrationsToRemove.isEmpty())
     234        return;
    211235
    212236    // Calling SWServerRegistration::clear() takes care of updating m_registrations, m_originStore and m_registrationStore.
     
    772796}
    773797
    774 void SWServer::getOriginsWithRegistrations(WTF::Function<void(const HashSet<SecurityOriginData>&)> callback)
     798void SWServer::getOriginsWithRegistrations(Function<void(const HashSet<SecurityOriginData>&)>&& callback)
    775799{
    776800    m_getOriginsWithRegistrationsCallbacks.append(WTFMove(callback));
  • trunk/Source/WebCore/workers/service/server/SWServer.h

    r227989 r228025  
    175175    void registrationStoreDatabaseFailedToOpen();
    176176
    177     WEBCORE_EXPORT void getOriginsWithRegistrations(WTF::Function<void(const HashSet<SecurityOriginData>&)>);
     177    WEBCORE_EXPORT void getOriginsWithRegistrations(Function<void(const HashSet<SecurityOriginData>&)>&&);
    178178
    179179    PAL::SessionID sessionID() const { return m_sessionID; }
     
    228228    PAL::SessionID m_sessionID;
    229229    bool m_importCompleted { false };
    230     Vector<WTF::Function<void(const HashSet<SecurityOriginData>&)>> m_getOriginsWithRegistrationsCallbacks;
     230    Vector<CompletionHandler<void()>> m_clearCompletionCallbacks;
     231    Vector<Function<void(const HashSet<SecurityOriginData>&)>> m_getOriginsWithRegistrationsCallbacks;
    231232};
    232233
  • trunk/Source/WebKit/ChangeLog

    r228021 r228025  
     12018-02-02  Youenn Fablet  <youenn@apple.com>
     2
     3        Clearing all service worker registrations should wait for importing service worker registration to finish
     4        https://bugs.webkit.org/show_bug.cgi?id=182407
     5
     6        Reviewed by Chris Dumez.
     7
     8        Updating API to take a completion handler.
     9
     10        * UIProcess/API/C/WKWebsiteDataStoreRef.cpp:
     11        (WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations):
     12        * UIProcess/API/C/WKWebsiteDataStoreRef.h:
     13
    1142018-02-02  Fujii Hironori  <Hironori.Fujii@sony.com>
    215
  • trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp

    r227943 r228025  
    394394}
    395395
    396 void WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(WKWebsiteDataStoreRef dataStoreRef)
     396void WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreRemoveAllServiceWorkerRegistrationsCallback callback)
    397397{
    398398#if ENABLE(SERVICE_WORKER)
    399399    OptionSet<WebKit::WebsiteDataType> dataTypes = WebKit::WebsiteDataType::ServiceWorkerRegistrations;
    400     WebKit::toImpl(dataStoreRef)->websiteDataStore().removeData(dataTypes, -WallTime::infinity(), [] { });
     400    WebKit::toImpl(dataStoreRef)->websiteDataStore().removeData(dataTypes, -WallTime::infinity(), [context, callback] {
     401        callback(context);
     402    });
    401403#else
    402404    UNUSED_PARAM(dataStoreRef);
  • trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h

    r227933 r228025  
    8484WK_EXPORT void WKWebsiteDataStoreRemoveAllFetchCaches(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreRemoveFetchCacheRemovalFunction callback);
    8585
     86typedef void (*WKWebsiteDataStoreRemoveAllServiceWorkerRegistrationsCallback)(void* functionContext);
     87WK_EXPORT void WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreRemoveAllServiceWorkerRegistrationsCallback callback);
     88
    8689WK_EXPORT void WKWebsiteDataStoreRemoveAllIndexedDatabases(WKWebsiteDataStoreRef dataStoreRef);
    87 WK_EXPORT void WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(WKWebsiteDataStoreRef dataStoreRef);
    8890
    8991typedef void (*WKWebsiteDataStoreGetFetchCacheOriginsFunction)(WKArrayRef, void*);
  • trunk/Tools/ChangeLog

    r228019 r228025  
     12018-02-02  Youenn Fablet  <youenn@apple.com>
     2
     3        Clearing all service worker registrations should wait for importing service worker registration to finish
     4        https://bugs.webkit.org/show_bug.cgi?id=182407
     5
     6        Reviewed by Chris Dumez.
     7
     8        Make sure we finish clearing service worker registrations before running tests.
     9
     10        * WebKitTestRunner/TestController.cpp:
     11        (WTR::TestController::resetStateToConsistentValues):
     12        (WTR::ClearServiceWorkerRegistrationsCallbackContext::ClearServiceWorkerRegistrationsCallbackContext):
     13        (WTR::clearServiceWorkerRegistrationsCallback):
     14        (WTR::TestController::clearServiceWorkerRegistrations):
     15        * WebKitTestRunner/TestController.h:
     16
    1172018-02-02  Youenn Fablet  <youenn@apple.com>
    218
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r228019 r228025  
    783783    WKContextClearCachedCredentials(TestController::singleton().context());
    784784
    785     WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(WKContextGetWebsiteDataStore(platformContext()));
    786 
     785    clearServiceWorkerRegistrations();
    787786    clearDOMCaches();
    788787
     
    23302329
    23312330#if PLATFORM(COCOA) && WK_API_ENABLED
     2331struct ClearServiceWorkerRegistrationsCallbackContext {
     2332    explicit ClearServiceWorkerRegistrationsCallbackContext(TestController& controller)
     2333        : testController(controller)
     2334    {
     2335    }
     2336
     2337    TestController& testController;
     2338    bool done { false };
     2339};
     2340
     2341static void clearServiceWorkerRegistrationsCallback(void* userData)
     2342{
     2343    auto* context = static_cast<ClearServiceWorkerRegistrationsCallbackContext*>(userData);
     2344    context->done = true;
     2345    context->testController.notifyDone();
     2346}
     2347#endif
     2348
     2349void TestController::clearServiceWorkerRegistrations()
     2350{
     2351#if PLATFORM(COCOA) && WK_API_ENABLED
     2352    auto websiteDataStore = WKContextGetWebsiteDataStore(platformContext());
     2353    ClearServiceWorkerRegistrationsCallbackContext context(*this);
     2354
     2355    WKWebsiteDataStoreRemoveAllServiceWorkerRegistrations(websiteDataStore, &context, clearServiceWorkerRegistrationsCallback);
     2356
     2357    if (!context.done)
     2358        runUntil(context.done, m_currentInvocation->shortTimeout());
     2359#endif
     2360}
     2361
     2362#if PLATFORM(COCOA) && WK_API_ENABLED
    23322363struct ClearDOMCacheCallbackContext {
    23332364    explicit ClearDOMCacheCallbackContext(TestController& controller)
  • trunk/Tools/WebKitTestRunner/TestController.h

    r225622 r228025  
    193193    void removeAllSessionCredentials();
    194194
     195    void clearServiceWorkerRegistrations();
     196
    195197    void clearDOMCache(WKStringRef origin);
    196198    void clearDOMCaches();
Note: See TracChangeset for help on using the changeset viewer.