Changeset 221834 in webkit


Ignore:
Timestamp:
Sep 10, 2017 9:36:52 AM (7 years ago)
Author:
beidson@apple.com
Message:

Try to avoid creating the default WKWebsiteDataStore until its actually needed.
<rdar://problem/33164453> and https://bugs.webkit.org/show_bug.cgi?id=176551

Reviewed by Tim Horton.

Source/WebKit:

  • UIProcess/API/APIHTTPCookieStore.cpp:

(API::HTTPCookieStore::cookies):
(API::HTTPCookieStore::setCookie):
(API::HTTPCookieStore::deleteCookie):

  • UIProcess/API/APIWebsiteDataStore.cpp:

(API::WebsiteDataStore::defaultDataStore):
(API::WebsiteDataStore::defaultDataStoreExists):

  • UIProcess/API/APIWebsiteDataStore.h:
  • UIProcess/API/C/WKContext.cpp:

(WKContextGetWebsiteDataStore):

  • UIProcess/API/Cocoa/WKWebsiteDataStore.mm:

(+[WKWebsiteDataStore _defaultDataStoreExists]):

  • UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::WebProcessPool):
(WebKit::m_hiddenPageThrottlingTimer):
(WebKit::WebProcessPool::ensureNetworkProcess):
(WebKit::WebProcessPool::ensureStorageProcessAndWebsiteDataStore):
(WebKit::WebProcessPool::warmInitialProcess):
(WebKit::WebProcessPool::createNewWebProcessRespectingProcessCountLimit):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::pageAddedToProcess):

  • UIProcess/WebProcessPool.h:
  • UIProcess/WebsiteData/WebsiteDataStore.cpp:

(WebKit::WebsiteDataStore::isAssociatedProcessPool const):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:

(TEST):

Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r221822 r221834  
     12017-09-10  Brady Eidson  <beidson@apple.com>
     2
     3        Try to avoid creating the default WKWebsiteDataStore until its actually needed.
     4        <rdar://problem/33164453> and https://bugs.webkit.org/show_bug.cgi?id=176551
     5
     6        Reviewed by Tim Horton.
     7
     8        * UIProcess/API/APIHTTPCookieStore.cpp:
     9        (API::HTTPCookieStore::cookies):
     10        (API::HTTPCookieStore::setCookie):
     11        (API::HTTPCookieStore::deleteCookie):
     12
     13        * UIProcess/API/APIWebsiteDataStore.cpp:
     14        (API::WebsiteDataStore::defaultDataStore):
     15        (API::WebsiteDataStore::defaultDataStoreExists):
     16        * UIProcess/API/APIWebsiteDataStore.h:
     17
     18        * UIProcess/API/C/WKContext.cpp:
     19        (WKContextGetWebsiteDataStore):
     20
     21        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
     22        (+[WKWebsiteDataStore _defaultDataStoreExists]):
     23        * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
     24
     25        * UIProcess/WebProcessPool.cpp:
     26        (WebKit::WebProcessPool::WebProcessPool):
     27        (WebKit::m_hiddenPageThrottlingTimer):
     28        (WebKit::WebProcessPool::ensureNetworkProcess):
     29        (WebKit::WebProcessPool::ensureStorageProcessAndWebsiteDataStore):
     30        (WebKit::WebProcessPool::warmInitialProcess):
     31        (WebKit::WebProcessPool::createNewWebProcessRespectingProcessCountLimit):
     32        (WebKit::WebProcessPool::createWebPage):
     33        (WebKit::WebProcessPool::pageAddedToProcess):
     34        * UIProcess/WebProcessPool.h:
     35
     36        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     37        (WebKit::WebsiteDataStore::isAssociatedProcessPool const):
     38
    1392017-09-09  Mark Lam  <mark.lam@apple.com>
    240
  • trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp

    r219550 r221834  
    5757    auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
    5858    if (!pool) {
    59         callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies = m_owningDataStore->pendingCookies()]() {
     59        Vector<WebCore::Cookie> allCookies;
     60        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
     61            allCookies = WebCore::NetworkStorageSession::defaultStorageSession().getAllCookies();
     62        else
     63            allCookies = m_owningDataStore->pendingCookies();
     64
     65        callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies]() {
    6066            completionHandler(allCookies);
    6167        });
     
    7379    auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
    7480    if (!pool) {
    75         m_owningDataStore->addPendingCookie(cookie);
     81        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
     82            WebCore::NetworkStorageSession::defaultStorageSession().setCookie(cookie);
     83        else
     84            m_owningDataStore->addPendingCookie(cookie);
     85
    7686        callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
    7787            completionHandler();
     
    90100    auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
    91101    if (!pool) {
    92         m_owningDataStore->removePendingCookie(cookie);
     102        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
     103            WebCore::NetworkStorageSession::defaultStorageSession().deleteCookie(cookie);
     104        else
     105            m_owningDataStore->removePendingCookie(cookie);
    93106        callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
    94107            completionHandler();
  • trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp

    r220857 r221834  
    3232namespace API {
    3333
     34static WebsiteDataStore* globalDefaultDataStore;
     35
    3436Ref<WebsiteDataStore> WebsiteDataStore::defaultDataStore()
    3537{
    3638    WebKit::InitializeWebKit2();
    3739
    38     static WebsiteDataStore* defaultDataStore = adoptRef(new WebsiteDataStore(defaultDataStoreConfiguration(), PAL::SessionID::defaultSessionID())).leakRef();
     40    if (!globalDefaultDataStore)
     41        globalDefaultDataStore = adoptRef(new WebsiteDataStore(defaultDataStoreConfiguration(), PAL::SessionID::defaultSessionID())).leakRef();
    3942
    40     return *defaultDataStore;
     43    return *globalDefaultDataStore;
     44}
     45
     46bool WebsiteDataStore::defaultDataStoreExists()
     47{
     48    return globalDefaultDataStore;
    4149}
    4250
  • trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h

    r221175 r221834  
    3737public:
    3838    static Ref<WebsiteDataStore> defaultDataStore();
     39    static bool defaultDataStoreExists();
     40
    3941    static Ref<WebsiteDataStore> createNonPersistentDataStore();
    4042    static Ref<WebsiteDataStore> createLegacy(WebKit::WebsiteDataStore::Configuration);
  • trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp

    r221749 r221834  
    415415WKWebsiteDataStoreRef WKContextGetWebsiteDataStore(WKContextRef context)
    416416{
    417     return toAPI(&toImpl(context)->websiteDataStore());
     417    auto* dataStore = toImpl(context)->websiteDataStore();
     418    if (!dataStore) {
     419        auto defaultDataStore = API::WebsiteDataStore::defaultDataStore();
     420        toImpl(context)->setPrimaryDataStore(defaultDataStore.get());
     421        dataStore = defaultDataStore.ptr();
     422    }
     423
     424    return toAPI(dataStore);
    418425}
    419426
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm

    r221683 r221834  
    175175}
    176176
     177+ (BOOL)_defaultDataStoreExists
     178{
     179    return API::WebsiteDataStore::defaultDataStoreExists();
     180}
     181
    177182- (instancetype)_initWithConfiguration:(_WKWebsiteDataStoreConfiguration *)configuration
    178183{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h

    r219904 r221834  
    3939
    4040+ (NSSet<NSString *> *)_allWebsiteDataTypesIncludingPrivate;
     41+ (BOOL)_defaultDataStoreExists;
    4142
    4243- (instancetype)_initWithConfiguration:(_WKWebsiteDataStoreConfiguration *)configuration WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r221768 r221834  
    228228    , m_memorySamplerEnabled(false)
    229229    , m_memorySamplerInterval(1400.0)
    230     , m_websiteDataStore(m_configuration->shouldHaveLegacyDataStore() ? API::WebsiteDataStore::createLegacy(legacyWebsiteDataStoreConfiguration(m_configuration)) : API::WebsiteDataStore::defaultDataStore())
    231230#if PLATFORM(MAC)
    232231    , m_highPerformanceGraphicsUsageSampler(std::make_unique<HighPerformanceGraphicsUsageSampler>(*this))
     
    245244    , m_hiddenPageThrottlingTimer(RunLoop::main(), this, &WebProcessPool::updateHiddenPageThrottlingAutoIncreaseLimit)
    246245{
     246    if (m_configuration->shouldHaveLegacyDataStore())
     247        m_websiteDataStore = API::WebsiteDataStore::createLegacy(legacyWebsiteDataStoreConfiguration(m_configuration));
     248
     249    if (!m_websiteDataStore && API::WebsiteDataStore::defaultDataStoreExists())
     250        m_websiteDataStore = API::WebsiteDataStore::defaultDataStore();
     251
    247252    for (auto& scheme : m_configuration->alwaysRevalidatedURLSchemes())
    248253        m_schemesToRegisterAsAlwaysRevalidated.add(scheme);
     
    477482        for (auto& process : m_processes)
    478483            process->reinstateNetworkProcessAssertionState(*m_networkProcess);
    479         websiteDataStore().websiteDataStore().networkProcessDidCrash();
     484        if (m_websiteDataStore)
     485            m_websiteDataStore->websiteDataStore().networkProcessDidCrash();
    480486    }
    481487
     
    527533
    528534    if (!m_storageProcess) {
     535        auto parameters = m_websiteDataStore ? m_websiteDataStore->websiteDataStore().storageProcessParameters() : (relevantDataStore ? relevantDataStore->storageProcessParameters() : API::WebsiteDataStore::defaultDataStore()->websiteDataStore().storageProcessParameters());
     536
     537        ASSERT(parameters.sessionID.isValid());
     538
     539#if ENABLE(INDEXED_DATABASE)
     540        if (parameters.indexedDatabaseDirectory.isEmpty()) {
     541            parameters.indexedDatabaseDirectory = m_configuration->indexedDBDatabaseDirectory();
     542            SandboxExtension::createHandleForReadWriteDirectory(parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle);
     543        }
     544#endif
     545
    529546        m_storageProcess = StorageProcessProxy::create(this);
    530 
    531         StorageProcessCreationParameters parameters;
    532 #if ENABLE(INDEXED_DATABASE)
    533         ASSERT(!m_configuration->indexedDBDatabaseDirectory().isEmpty());
    534 
    535         parameters.sessionID = websiteDataStore().websiteDataStore().sessionID();
    536         parameters.indexedDatabaseDirectory = m_configuration->indexedDBDatabaseDirectory();
    537         SandboxExtension::createHandleForReadWriteDirectory(parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle);
    538 #endif
    539 
    540         ASSERT(!parameters.indexedDatabaseDirectory.isEmpty());
    541547        m_storageProcess->send(Messages::StorageProcess::InitializeWebsiteDataStore(parameters), 0);
    542548    }
    543549
    544     if (!relevantDataStore || relevantDataStore == &websiteDataStore().websiteDataStore())
     550    if (!relevantDataStore || !m_websiteDataStore || relevantDataStore == &m_websiteDataStore->websiteDataStore())
    545551        return;
    546552
     
    807813        return;
    808814
     815    if (!m_websiteDataStore)
     816        m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
    809817    createNewWebProcess(m_websiteDataStore->websiteDataStore());
     818
    810819    m_haveInitialEmptyProcess = true;
    811820}
     
    889898
    890899#if PLATFORM(COCOA)
    891     bool mustMatchDataStore = &websiteDataStore != &API::WebsiteDataStore::defaultDataStore()->websiteDataStore();
     900    bool mustMatchDataStore = API::WebsiteDataStore::defaultDataStoreExists() && &websiteDataStore != &API::WebsiteDataStore::defaultDataStore()->websiteDataStore();
    892901#else
    893902    bool mustMatchDataStore = false;
     
    930939
    931940    if (!pageConfiguration->websiteDataStore()) {
     941        // We try to avoid creating the default data store as long as possible.
     942        // But if there is an attempt to create a web page without any specified data store, then we have to create it.
     943        if (!m_websiteDataStore)
     944            m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
     945
    932946        ASSERT(!pageConfiguration->sessionID().isValid());
    933         pageConfiguration->setWebsiteDataStore(m_websiteDataStore.ptr());
     947        pageConfiguration->setWebsiteDataStore(m_websiteDataStore.get());
    934948        pageConfiguration->setSessionID(pageConfiguration->preferences()->privateBrowsingEnabled() ? PAL::SessionID::legacyPrivateSessionID() : m_websiteDataStore->websiteDataStore().sessionID());
    935949    }
     
    965979
    966980#if ENABLE(INDEXED_DATABASE)
    967         auto storageParameters = page.websiteDataStore().storageProcessParameters();
    968         if (!storageParameters.indexedDatabaseDirectory.isEmpty())
    969             sendToStorageProcessRelaunchingIfNecessary(Messages::StorageProcess::InitializeWebsiteDataStore(storageParameters));
     981        if (!page.websiteDataStore().resolvedIndexedDatabaseDirectory().isEmpty())
     982            ensureStorageProcessAndWebsiteDataStore(&page.websiteDataStore());
    970983#endif
    971984    }
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r221766 r221834  
    169169    void disconnectProcess(WebProcessProxy*);
    170170
    171     API::WebsiteDataStore& websiteDataStore() const { return m_websiteDataStore.get(); }
     171    API::WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); }
     172    void setPrimaryDataStore(API::WebsiteDataStore& dataStore) { m_websiteDataStore = &dataStore; }
    172173
    173174    Ref<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&);
     
    521522    double m_memorySamplerInterval;
    522523
    523     const Ref<API::WebsiteDataStore> m_websiteDataStore;
     524    RefPtr<API::WebsiteDataStore> m_websiteDataStore;
    524525
    525526    typedef HashMap<const char*, RefPtr<WebContextSupplement>, PtrHash<const char*>> WebContextSupplementMap;
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r221683 r221834  
    11801180bool WebsiteDataStore::isAssociatedProcessPool(WebProcessPool& processPool) const
    11811181{
    1182     return &processPool.websiteDataStore().websiteDataStore() == this;
     1182    if (auto* processPoolDataStore = processPool.websiteDataStore())
     1183        return &processPoolDataStore->websiteDataStore() == this;
     1184    return false;
    11831185}
    11841186
  • trunk/Tools/ChangeLog

    r221833 r221834  
     12017-09-10  Brady Eidson  <beidson@apple.com>
     2
     3        Try to avoid creating the default WKWebsiteDataStore until its actually needed.
     4        <rdar://problem/33164453> and https://bugs.webkit.org/show_bug.cgi?id=176551
     5
     6        Reviewed by Tim Horton.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
     9        (TEST):
     10
    1112017-09-10  Michael Catanzaro  <mcatanzaro@igalia.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm

    r221505 r221834  
    120120    [webView loadRequest:request];
    121121
     122    EXPECT_FALSE([WKWebsiteDataStore _defaultDataStoreExists]);
     123
    122124    // We expect 4 messages, 1 each for WebSQL, IndexedDB, cookies, and localStorage.
    123125    EXPECT_STREQ([getNextMessage().body UTF8String], "localstorage written");
     
    214216    receivedScriptMessage = false;
    215217    TestWebKitAPI::Util::run(&receivedScriptMessage);
     218
     219    EXPECT_FALSE([WKWebsiteDataStore _defaultDataStoreExists]);
    216220}
    217221
Note: See TracChangeset for help on using the changeset viewer.