Title: [221834] trunk
Revision
221834
Author
beid...@apple.com
Date
2017-09-10 09:36:52 -0700 (Sun, 10 Sep 2017)

Log 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):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (221833 => 221834)


--- trunk/Source/WebKit/ChangeLog	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/ChangeLog	2017-09-10 16:36:52 UTC (rev 221834)
@@ -1,3 +1,41 @@
+2017-09-10  Brady Eidson  <beid...@apple.com>
+
+        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.
+
+        * 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):
+
 2017-09-09  Mark Lam  <mark....@apple.com>
 
         Avoid duplicate computations of ExecState::vm().

Modified: trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp	2017-09-10 16:36:52 UTC (rev 221834)
@@ -56,7 +56,13 @@
 {
     auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
     if (!pool) {
-        callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies = m_owningDataStore->pendingCookies()]() {
+        Vector<WebCore::Cookie> allCookies;
+        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
+            allCookies = WebCore::NetworkStorageSession::defaultStorageSession().getAllCookies();
+        else
+            allCookies = m_owningDataStore->pendingCookies();
+
+        callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies]() {
             completionHandler(allCookies);
         });
         return;
@@ -72,7 +78,11 @@
 {
     auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
     if (!pool) {
-        m_owningDataStore->addPendingCookie(cookie);
+        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
+            WebCore::NetworkStorageSession::defaultStorageSession().setCookie(cookie);
+        else
+            m_owningDataStore->addPendingCookie(cookie);
+
         callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
             completionHandler();
         });
@@ -89,7 +99,10 @@
 {
     auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
     if (!pool) {
-        m_owningDataStore->removePendingCookie(cookie);
+        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
+            WebCore::NetworkStorageSession::defaultStorageSession().deleteCookie(cookie);
+        else
+            m_owningDataStore->removePendingCookie(cookie);
         callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
             completionHandler();
         });

Modified: trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.cpp	2017-09-10 16:36:52 UTC (rev 221834)
@@ -31,15 +31,23 @@
 
 namespace API {
 
+static WebsiteDataStore* globalDefaultDataStore;
+
 Ref<WebsiteDataStore> WebsiteDataStore::defaultDataStore()
 {
     WebKit::InitializeWebKit2();
 
-    static WebsiteDataStore* defaultDataStore = adoptRef(new WebsiteDataStore(defaultDataStoreConfiguration(), PAL::SessionID::defaultSessionID())).leakRef();
+    if (!globalDefaultDataStore)
+        globalDefaultDataStore = adoptRef(new WebsiteDataStore(defaultDataStoreConfiguration(), PAL::SessionID::defaultSessionID())).leakRef();
 
-    return *defaultDataStore;
+    return *globalDefaultDataStore;
 }
 
+bool WebsiteDataStore::defaultDataStoreExists()
+{
+    return globalDefaultDataStore;
+}
+
 Ref<WebsiteDataStore> WebsiteDataStore::createNonPersistentDataStore()
 {
     return adoptRef(*new WebsiteDataStore);

Modified: trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/API/APIWebsiteDataStore.h	2017-09-10 16:36:52 UTC (rev 221834)
@@ -36,6 +36,8 @@
 class WebsiteDataStore final : public ObjectImpl<Object::Type::WebsiteDataStore> {
 public:
     static Ref<WebsiteDataStore> defaultDataStore();
+    static bool defaultDataStoreExists();
+
     static Ref<WebsiteDataStore> createNonPersistentDataStore();
     static Ref<WebsiteDataStore> createLegacy(WebKit::WebsiteDataStore::Configuration);
 

Modified: trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp	2017-09-10 16:36:52 UTC (rev 221834)
@@ -414,7 +414,14 @@
 
 WKWebsiteDataStoreRef WKContextGetWebsiteDataStore(WKContextRef context)
 {
-    return toAPI(&toImpl(context)->websiteDataStore());
+    auto* dataStore = toImpl(context)->websiteDataStore();
+    if (!dataStore) {
+        auto defaultDataStore = API::WebsiteDataStore::defaultDataStore();
+        toImpl(context)->setPrimaryDataStore(defaultDataStore.get());
+        dataStore = defaultDataStore.ptr();
+    }
+
+    return toAPI(dataStore);
 }
 
 WKApplicationCacheManagerRef WKContextGetApplicationCacheManager(WKContextRef context)

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2017-09-10 16:36:52 UTC (rev 221834)
@@ -174,6 +174,11 @@
     return allWebsiteDataTypes;
 }
 
++ (BOOL)_defaultDataStoreExists
+{
+    return API::WebsiteDataStore::defaultDataStoreExists();
+}
+
 - (instancetype)_initWithConfiguration:(_WKWebsiteDataStoreConfiguration *)configuration
 {
     if (!(self = [super init]))

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2017-09-10 16:36:52 UTC (rev 221834)
@@ -38,6 +38,7 @@
 @interface WKWebsiteDataStore (WKPrivate)
 
 + (NSSet<NSString *> *)_allWebsiteDataTypesIncludingPrivate;
++ (BOOL)_defaultDataStoreExists;
 
 - (instancetype)_initWithConfiguration:(_WKWebsiteDataStoreConfiguration *)configuration WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2017-09-10 16:36:52 UTC (rev 221834)
@@ -227,7 +227,6 @@
     , m_shouldUseFontSmoothing(true)
     , m_memorySamplerEnabled(false)
     , m_memorySamplerInterval(1400.0)
-    , m_websiteDataStore(m_configuration->shouldHaveLegacyDataStore() ? API::WebsiteDataStore::createLegacy(legacyWebsiteDataStoreConfiguration(m_configuration)) : API::WebsiteDataStore::defaultDataStore())
 #if PLATFORM(MAC)
     , m_highPerformanceGraphicsUsageSampler(std::make_unique<HighPerformanceGraphicsUsageSampler>(*this))
     , m_perActivityStateCPUUsageSampler(std::make_unique<PerActivityStateCPUUsageSampler>(*this))
@@ -244,6 +243,12 @@
     , m_hiddenPageThrottlingAutoIncreasesCounter([this](RefCounterEvent) { m_hiddenPageThrottlingTimer.startOneShot(0_s); })
     , m_hiddenPageThrottlingTimer(RunLoop::main(), this, &WebProcessPool::updateHiddenPageThrottlingAutoIncreaseLimit)
 {
+    if (m_configuration->shouldHaveLegacyDataStore())
+        m_websiteDataStore = API::WebsiteDataStore::createLegacy(legacyWebsiteDataStoreConfiguration(m_configuration));
+
+    if (!m_websiteDataStore && API::WebsiteDataStore::defaultDataStoreExists())
+        m_websiteDataStore = API::WebsiteDataStore::defaultDataStore();
+
     for (auto& scheme : m_configuration->alwaysRevalidatedURLSchemes())
         m_schemesToRegisterAsAlwaysRevalidated.add(scheme);
 
@@ -476,7 +481,8 @@
         m_didNetworkProcessCrash = false;
         for (auto& process : m_processes)
             process->reinstateNetworkProcessAssertionState(*m_networkProcess);
-        websiteDataStore().websiteDataStore().networkProcessDidCrash();
+        if (m_websiteDataStore)
+            m_websiteDataStore->websiteDataStore().networkProcessDidCrash();
     }
 
     if (withWebsiteDataStore)
@@ -526,22 +532,22 @@
     // *********
 
     if (!m_storageProcess) {
-        m_storageProcess = StorageProcessProxy::create(this);
+        auto parameters = m_websiteDataStore ? m_websiteDataStore->websiteDataStore().storageProcessParameters() : (relevantDataStore ? relevantDataStore->storageProcessParameters() : API::WebsiteDataStore::defaultDataStore()->websiteDataStore().storageProcessParameters());
 
-        StorageProcessCreationParameters parameters;
+        ASSERT(parameters.sessionID.isValid());
+
 #if ENABLE(INDEXED_DATABASE)
-        ASSERT(!m_configuration->indexedDBDatabaseDirectory().isEmpty());
-
-        parameters.sessionID = websiteDataStore().websiteDataStore().sessionID();
-        parameters.indexedDatabaseDirectory = m_configuration->indexedDBDatabaseDirectory();
-        SandboxExtension::createHandleForReadWriteDirectory(parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle);
+        if (parameters.indexedDatabaseDirectory.isEmpty()) {
+            parameters.indexedDatabaseDirectory = m_configuration->indexedDBDatabaseDirectory();
+            SandboxExtension::createHandleForReadWriteDirectory(parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle);
+        }
 #endif
 
-        ASSERT(!parameters.indexedDatabaseDirectory.isEmpty());
+        m_storageProcess = StorageProcessProxy::create(this);
         m_storageProcess->send(Messages::StorageProcess::InitializeWebsiteDataStore(parameters), 0);
     }
 
-    if (!relevantDataStore || relevantDataStore == &websiteDataStore().websiteDataStore())
+    if (!relevantDataStore || !m_websiteDataStore || relevantDataStore == &m_websiteDataStore->websiteDataStore())
         return;
 
     m_storageProcess->send(Messages::StorageProcess::InitializeWebsiteDataStore(relevantDataStore->storageProcessParameters()), 0);
@@ -806,7 +812,10 @@
     if (m_processes.size() >= maximumNumberOfProcesses())
         return;
 
+    if (!m_websiteDataStore)
+        m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
     createNewWebProcess(m_websiteDataStore->websiteDataStore());
+
     m_haveInitialEmptyProcess = true;
 }
 
@@ -888,7 +897,7 @@
     // Once WebsiteDataStores are truly per-view instead of per-process, remove this nonsense.
 
 #if PLATFORM(COCOA)
-    bool mustMatchDataStore = &websiteDataStore != &API::WebsiteDataStore::defaultDataStore()->websiteDataStore();
+    bool mustMatchDataStore = API::WebsiteDataStore::defaultDataStoreExists() && &websiteDataStore != &API::WebsiteDataStore::defaultDataStore()->websiteDataStore();
 #else
     bool mustMatchDataStore = false;
 #endif
@@ -929,8 +938,13 @@
         pageConfiguration->setVisitedLinkStore(m_visitedLinkStore.ptr());
 
     if (!pageConfiguration->websiteDataStore()) {
+        // We try to avoid creating the default data store as long as possible.
+        // But if there is an attempt to create a web page without any specified data store, then we have to create it.
+        if (!m_websiteDataStore)
+            m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
+
         ASSERT(!pageConfiguration->sessionID().isValid());
-        pageConfiguration->setWebsiteDataStore(m_websiteDataStore.ptr());
+        pageConfiguration->setWebsiteDataStore(m_websiteDataStore.get());
         pageConfiguration->setSessionID(pageConfiguration->preferences()->privateBrowsingEnabled() ? PAL::SessionID::legacyPrivateSessionID() : m_websiteDataStore->websiteDataStore().sessionID());
     }
 
@@ -964,9 +978,8 @@
         page.process().send(Messages::WebProcess::AddWebsiteDataStore(page.websiteDataStore().parameters()), 0);
 
 #if ENABLE(INDEXED_DATABASE)
-        auto storageParameters = page.websiteDataStore().storageProcessParameters();
-        if (!storageParameters.indexedDatabaseDirectory.isEmpty())
-            sendToStorageProcessRelaunchingIfNecessary(Messages::StorageProcess::InitializeWebsiteDataStore(storageParameters));
+        if (!page.websiteDataStore().resolvedIndexedDatabaseDirectory().isEmpty())
+            ensureStorageProcessAndWebsiteDataStore(&page.websiteDataStore());
 #endif
     }
 }

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2017-09-10 16:36:52 UTC (rev 221834)
@@ -168,7 +168,8 @@
     // Disconnect the process from the context.
     void disconnectProcess(WebProcessProxy*);
 
-    API::WebsiteDataStore& websiteDataStore() const { return m_websiteDataStore.get(); }
+    API::WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); }
+    void setPrimaryDataStore(API::WebsiteDataStore& dataStore) { m_websiteDataStore = &dataStore; }
 
     Ref<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&);
 
@@ -520,7 +521,7 @@
     bool m_memorySamplerEnabled;
     double m_memorySamplerInterval;
 
-    const Ref<API::WebsiteDataStore> m_websiteDataStore;
+    RefPtr<API::WebsiteDataStore> m_websiteDataStore;
 
     typedef HashMap<const char*, RefPtr<WebContextSupplement>, PtrHash<const char*>> WebContextSupplementMap;
     WebContextSupplementMap m_supplements;

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (221833 => 221834)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2017-09-10 16:36:52 UTC (rev 221834)
@@ -1179,7 +1179,9 @@
 
 bool WebsiteDataStore::isAssociatedProcessPool(WebProcessPool& processPool) const
 {
-    return &processPool.websiteDataStore().websiteDataStore() == this;
+    if (auto* processPoolDataStore = processPool.websiteDataStore())
+        return &processPoolDataStore->websiteDataStore() == this;
+    return false;
 }
 
 HashSet<RefPtr<WebProcessPool>> WebsiteDataStore::processPools(size_t count, bool ensureAPoolExists) const

Modified: trunk/Tools/ChangeLog (221833 => 221834)


--- trunk/Tools/ChangeLog	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Tools/ChangeLog	2017-09-10 16:36:52 UTC (rev 221834)
@@ -1,3 +1,13 @@
+2017-09-10  Brady Eidson  <beid...@apple.com>
+
+        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.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
+        (TEST):
+
 2017-09-10  Michael Catanzaro  <mcatanz...@igalia.com>
 
         [GTK] Improve Ctrl+W and Ctrl+Q shortcuts in MiniBrowser

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm (221833 => 221834)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2017-09-10 09:54:31 UTC (rev 221833)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2017-09-10 16:36:52 UTC (rev 221834)
@@ -119,6 +119,8 @@
     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"WebsiteDataStoreCustomPaths" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     [webView loadRequest:request];
 
+    EXPECT_FALSE([WKWebsiteDataStore _defaultDataStoreExists]);
+
     // We expect 4 messages, 1 each for WebSQL, IndexedDB, cookies, and localStorage.
     EXPECT_STREQ([getNextMessage().body UTF8String], "localstorage written");
     EXPECT_STREQ([getNextMessage().body UTF8String], "cookie written");
@@ -213,6 +215,8 @@
 
     receivedScriptMessage = false;
     TestWebKitAPI::Util::run(&receivedScriptMessage);
+
+    EXPECT_FALSE([WKWebsiteDataStore _defaultDataStoreExists]);
 }
 
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to