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

Changeset 243384 in webkit


Ignore:
Timestamp:
Mar 22, 2019, 10:01:14 AM (7 years ago)
Author:
Chris Dumez
Message:

Prewarmed processes should be usable with any website data store
https://bugs.webkit.org/show_bug.cgi?id=196104

Reviewed by Alex Christensen.

Source/WebKit:

Split WebsiteDataStore-specific data out of WebProcessCreationParameters and into a new
WebProcessDataStoreParameters struct so that we do not need a WebsiteDataStore in order
to lauch and initialize a WebProcess. When the process finally gets used and we thus
know which WebsiteDataStore they will be used for, we send the WebProcessDataStoreParameters
to the process to that it can do its data store-specific initialization.

This allows prewarmed processes not not have a WebsiteDataStore assocated with them. They
can then be used for any WebsiteDataStore when we need them.

This is also used by our dummy WebProcessProxy since it does not have a backing process and
thus has no associated WebsiteDataStore.

  • Shared/WebProcessCreationParameters.cpp:

(WebKit::WebProcessCreationParameters::encode const):
(WebKit::WebProcessCreationParameters::decode):

  • Shared/WebProcessCreationParameters.h:
  • Shared/WebProcessDataStoreParameters.h: Added.

(WebKit::WebProcessDataStoreParameters::encode const):
(WebKit::WebProcessDataStoreParameters::decode):

  • UIProcess/API/C/WKContext.cpp:

(WKContextWarmInitialProcess):

  • UIProcess/API/Cocoa/WKProcessPool.mm:

(-[WKProcessPool _warmInitialProcess]):

  • UIProcess/ServiceWorkerProcessProxy.cpp:

(WebKit::ServiceWorkerProcessProxy::ServiceWorkerProcessProxy):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::notifyProcessPoolToPrewarm):

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::establishWorkerContextConnectionToNetworkProcess):
(WebKit::WebProcessPool::createNewWebProcess):
(WebKit::WebProcessPool::tryTakePrewarmedProcess):
(WebKit::WebProcessPool::sendWebProcessDataStoreParameters):
(WebKit::WebProcessPool::initializeNewWebProcess):
(WebKit::WebProcessPool::prewarmProcess):
(WebKit::WebProcessPool::processForRegistrableDomain):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::didReachGoodTimeToPrewarm):

  • UIProcess/WebProcessPool.h:

(WebKit::WebProcessPool::sendToOneProcess):

  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::create):
(WebKit::WebProcessProxy::WebProcessProxy):
(WebKit::WebProcessProxy::setWebsiteDataStore):
(WebKit::WebProcessProxy::addExistingWebPage):

  • UIProcess/WebProcessProxy.h:

(WebKit::WebProcessProxy::websiteDataStore const):

  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/MediaCache/WebMediaKeyStorageManager.cpp:

(WebKit::WebMediaKeyStorageManager::setWebsiteDataStore):

  • WebProcess/MediaCache/WebMediaKeyStorageManager.h:
  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::initializeWebProcess):
(WebKit::WebProcess::setWebsiteDataStoreParameters):

  • WebProcess/WebProcess.h:
  • WebProcess/WebProcess.messages.in:
  • WebProcess/WebProcessSupplement.h:

(WebKit::WebProcessSupplement::initialize):
(WebKit::WebProcessSupplement::setWebsiteDataStore):

  • WebProcess/cocoa/WebProcessCocoa.mm:

(WebKit::WebProcess::platformInitializeWebProcess):
(WebKit::WebProcess::platformSetWebsiteDataStoreParameters):

  • WebProcess/win/WebProcessWin.cpp:

(WebKit::WebProcess::platformInitializeWebProcess):
(WebKit::WebProcess::platformSetWebsiteDataStoreParameters):

Tools:

Add API test coverage.

  • TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm:

(runInitialWarmedProcessUsedTest):
(TEST):

Location:
trunk
Files:
1 added
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r243381 r243384  
     12019-03-22  Chris Dumez  <cdumez@apple.com>
     2
     3        Prewarmed processes should be usable with any website data store
     4        https://bugs.webkit.org/show_bug.cgi?id=196104
     5
     6        Reviewed by Alex Christensen.
     7
     8        Split WebsiteDataStore-specific data out of WebProcessCreationParameters and into a new
     9        WebProcessDataStoreParameters struct so that we do not need a WebsiteDataStore in order
     10        to lauch and initialize a WebProcess. When the process finally gets used and we thus
     11        know which WebsiteDataStore they will be used for, we send the WebProcessDataStoreParameters
     12        to the process to that it can do its data store-specific initialization.
     13
     14        This allows prewarmed processes not not have a WebsiteDataStore assocated with them. They
     15        can then be used for any WebsiteDataStore when we need them.
     16
     17        This is also used by our dummy WebProcessProxy since it does not have a backing process and
     18        thus has no associated WebsiteDataStore.
     19
     20        * Shared/WebProcessCreationParameters.cpp:
     21        (WebKit::WebProcessCreationParameters::encode const):
     22        (WebKit::WebProcessCreationParameters::decode):
     23        * Shared/WebProcessCreationParameters.h:
     24        * Shared/WebProcessDataStoreParameters.h: Added.
     25        (WebKit::WebProcessDataStoreParameters::encode const):
     26        (WebKit::WebProcessDataStoreParameters::decode):
     27        * UIProcess/API/C/WKContext.cpp:
     28        (WKContextWarmInitialProcess):
     29        * UIProcess/API/Cocoa/WKProcessPool.mm:
     30        (-[WKProcessPool _warmInitialProcess]):
     31        * UIProcess/ServiceWorkerProcessProxy.cpp:
     32        (WebKit::ServiceWorkerProcessProxy::ServiceWorkerProcessProxy):
     33        * UIProcess/WebPageProxy.cpp:
     34        (WebKit::WebPageProxy::notifyProcessPoolToPrewarm):
     35        * UIProcess/WebProcessPool.cpp:
     36        (WebKit::WebProcessPool::establishWorkerContextConnectionToNetworkProcess):
     37        (WebKit::WebProcessPool::createNewWebProcess):
     38        (WebKit::WebProcessPool::tryTakePrewarmedProcess):
     39        (WebKit::WebProcessPool::sendWebProcessDataStoreParameters):
     40        (WebKit::WebProcessPool::initializeNewWebProcess):
     41        (WebKit::WebProcessPool::prewarmProcess):
     42        (WebKit::WebProcessPool::processForRegistrableDomain):
     43        (WebKit::WebProcessPool::createWebPage):
     44        (WebKit::WebProcessPool::didReachGoodTimeToPrewarm):
     45        * UIProcess/WebProcessPool.h:
     46        (WebKit::WebProcessPool::sendToOneProcess):
     47        * UIProcess/WebProcessProxy.cpp:
     48        (WebKit::WebProcessProxy::create):
     49        (WebKit::WebProcessProxy::WebProcessProxy):
     50        (WebKit::WebProcessProxy::setWebsiteDataStore):
     51        (WebKit::WebProcessProxy::addExistingWebPage):
     52        * UIProcess/WebProcessProxy.h:
     53        (WebKit::WebProcessProxy::websiteDataStore const):
     54        * WebKit.xcodeproj/project.pbxproj:
     55        * WebProcess/MediaCache/WebMediaKeyStorageManager.cpp:
     56        (WebKit::WebMediaKeyStorageManager::setWebsiteDataStore):
     57        * WebProcess/MediaCache/WebMediaKeyStorageManager.h:
     58        * WebProcess/WebProcess.cpp:
     59        (WebKit::WebProcess::initializeWebProcess):
     60        (WebKit::WebProcess::setWebsiteDataStoreParameters):
     61        * WebProcess/WebProcess.h:
     62        * WebProcess/WebProcess.messages.in:
     63        * WebProcess/WebProcessSupplement.h:
     64        (WebKit::WebProcessSupplement::initialize):
     65        (WebKit::WebProcessSupplement::setWebsiteDataStore):
     66        * WebProcess/cocoa/WebProcessCocoa.mm:
     67        (WebKit::WebProcess::platformInitializeWebProcess):
     68        (WebKit::WebProcess::platformSetWebsiteDataStoreParameters):
     69        * WebProcess/win/WebProcessWin.cpp:
     70        (WebKit::WebProcess::platformInitializeWebProcess):
     71        (WebKit::WebProcess::platformSetWebsiteDataStoreParameters):
     72
    1732019-03-22  Simon Fraser  <simon.fraser@apple.com>
    274
  • trunk/Source/WebKit/Shared/WebProcessCreationParameters.cpp

    r242437 r243384  
    4949    encoder << additionalSandboxExtensionHandles;
    5050    encoder << initializationUserData;
    51     encoder << applicationCacheDirectory;
    52     encoder << applicationCacheFlatFileSubdirectoryName;
    53     encoder << applicationCacheDirectoryExtensionHandle;
    54     encoder << webSQLDatabaseDirectory;
    55     encoder << webSQLDatabaseDirectoryExtensionHandle;
    56     encoder << mediaCacheDirectory;
    57     encoder << mediaCacheDirectoryExtensionHandle;
    58     encoder << javaScriptConfigurationDirectory;
    59     encoder << javaScriptConfigurationDirectoryExtensionHandle;
    6051#if PLATFORM(IOS_FAMILY)
    6152    encoder << cookieStorageDirectoryExtensionHandle;
     
    6354    encoder << containerTemporaryDirectoryExtensionHandle;
    6455#endif
    65     encoder << mediaKeyStorageDirectory;
    6656    encoder << webCoreLoggingChannels;
    6757    encoder << webKitLoggingChannels;
    68     encoder << mediaKeyStorageDirectoryExtensionHandle;
    6958#if ENABLE(MEDIA_STREAM)
    7059    encoder << audioCaptureExtensionHandle;
     
    9079    encoder << shouldSuppressMemoryPressureHandler;
    9180    encoder << shouldUseFontSmoothing;
    92     encoder << resourceLoadStatisticsEnabled;
    9381    encoder << fontWhitelist;
    9482    encoder << terminationTimeout;
     
    186174    if (!decoder.decode(parameters.initializationUserData))
    187175        return false;
    188     if (!decoder.decode(parameters.applicationCacheDirectory))
    189         return false;
    190     if (!decoder.decode(parameters.applicationCacheFlatFileSubdirectoryName))
    191         return false;
    192    
    193     Optional<SandboxExtension::Handle> applicationCacheDirectoryExtensionHandle;
    194     decoder >> applicationCacheDirectoryExtensionHandle;
    195     if (!applicationCacheDirectoryExtensionHandle)
    196         return false;
    197     parameters.applicationCacheDirectoryExtensionHandle = WTFMove(*applicationCacheDirectoryExtensionHandle);
    198 
    199     if (!decoder.decode(parameters.webSQLDatabaseDirectory))
    200         return false;
    201 
    202     Optional<SandboxExtension::Handle> webSQLDatabaseDirectoryExtensionHandle;
    203     decoder >> webSQLDatabaseDirectoryExtensionHandle;
    204     if (!webSQLDatabaseDirectoryExtensionHandle)
    205         return false;
    206     parameters.webSQLDatabaseDirectoryExtensionHandle = WTFMove(*webSQLDatabaseDirectoryExtensionHandle);
    207 
    208     if (!decoder.decode(parameters.mediaCacheDirectory))
    209         return false;
    210    
    211     Optional<SandboxExtension::Handle> mediaCacheDirectoryExtensionHandle;
    212     decoder >> mediaCacheDirectoryExtensionHandle;
    213     if (!mediaCacheDirectoryExtensionHandle)
    214         return false;
    215     parameters.mediaCacheDirectoryExtensionHandle = WTFMove(*mediaCacheDirectoryExtensionHandle);
    216 
    217     if (!decoder.decode(parameters.javaScriptConfigurationDirectory))
    218         return false;
    219    
    220     Optional<SandboxExtension::Handle> javaScriptConfigurationDirectoryExtensionHandle;
    221     decoder >> javaScriptConfigurationDirectoryExtensionHandle;
    222     if (!javaScriptConfigurationDirectoryExtensionHandle)
    223         return false;
    224     parameters.javaScriptConfigurationDirectoryExtensionHandle = WTFMove(*javaScriptConfigurationDirectoryExtensionHandle);
    225176
    226177#if PLATFORM(IOS_FAMILY)
     
    245196
    246197#endif
    247     if (!decoder.decode(parameters.mediaKeyStorageDirectory))
    248         return false;
    249198    if (!decoder.decode(parameters.webCoreLoggingChannels))
    250199        return false;
    251200    if (!decoder.decode(parameters.webKitLoggingChannels))
    252201        return false;
    253    
    254     Optional<SandboxExtension::Handle> mediaKeyStorageDirectoryExtensionHandle;
    255     decoder >> mediaKeyStorageDirectoryExtensionHandle;
    256     if (!mediaKeyStorageDirectoryExtensionHandle)
    257         return false;
    258     parameters.mediaKeyStorageDirectoryExtensionHandle = WTFMove(*mediaKeyStorageDirectoryExtensionHandle);
    259202
    260203#if ENABLE(MEDIA_STREAM)
     
    306249        return false;
    307250    if (!decoder.decode(parameters.shouldUseFontSmoothing))
    308         return false;
    309     if (!decoder.decode(parameters.resourceLoadStatisticsEnabled))
    310251        return false;
    311252    if (!decoder.decode(parameters.fontWhitelist))
  • trunk/Source/WebKit/Shared/WebProcessCreationParameters.h

    r242437 r243384  
    7676    UserData initializationUserData;
    7777
    78     String applicationCacheDirectory;
    79     String applicationCacheFlatFileSubdirectoryName;
    80     SandboxExtension::Handle applicationCacheDirectoryExtensionHandle;
    81     String webSQLDatabaseDirectory;
    82     SandboxExtension::Handle webSQLDatabaseDirectoryExtensionHandle;
    83     String mediaCacheDirectory;
    84     SandboxExtension::Handle mediaCacheDirectoryExtensionHandle;
    85     String javaScriptConfigurationDirectory;
    86     SandboxExtension::Handle javaScriptConfigurationDirectoryExtensionHandle;
    8778#if PLATFORM(IOS_FAMILY)
    8879    SandboxExtension::Handle cookieStorageDirectoryExtensionHandle;
     
    9081    SandboxExtension::Handle containerTemporaryDirectoryExtensionHandle;
    9182#endif
    92     SandboxExtension::Handle mediaKeyStorageDirectoryExtensionHandle;
    9383#if ENABLE(MEDIA_STREAM)
    9484    SandboxExtension::Handle audioCaptureExtensionHandle;
     
    9787    bool shouldCaptureDisplayInUIProcess { false };
    9888#endif
    99     String mediaKeyStorageDirectory;
    10089
    10190    String webCoreLoggingChannels;
     
    129118    bool shouldSuppressMemoryPressureHandler { false };
    130119    bool shouldUseFontSmoothing { true };
    131     bool resourceLoadStatisticsEnabled { false };
    132120    bool fullKeyboardAccessEnabled { false };
    133121    bool memoryCacheDisabled { false };
  • trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp

    r243110 r243384  
    525525void WKContextWarmInitialProcess(WKContextRef contextRef)
    526526{
    527     WebKit::toImpl(contextRef)->prewarmProcess(nullptr, WebKit::WebProcessPool::MayCreateDefaultDataStore::Yes);
     527    WebKit::toImpl(contextRef)->prewarmProcess();
    528528}
    529529
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

    r243110 r243384  
    390390- (void)_warmInitialProcess
    391391{
    392     _processPool->prewarmProcess(nullptr, WebKit::WebProcessPool::MayCreateDefaultDataStore::Yes);
     392    _processPool->prewarmProcess();
    393393}
    394394
  • trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp

    r242905 r243384  
    5252
    5353ServiceWorkerProcessProxy::ServiceWorkerProcessProxy(WebProcessPool& pool, const RegistrableDomain& registrableDomain, WebsiteDataStore& store)
    54     : WebProcessProxy { pool, store, IsPrewarmed::No }
     54    : WebProcessProxy { pool, &store, IsPrewarmed::No }
    5555    , m_registrableDomain(registrableDomain)
    5656    , m_serviceWorkerPageID(generatePageID())
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r243328 r243384  
    572572void WebPageProxy::notifyProcessPoolToPrewarm()
    573573{
    574     m_process->processPool().didReachGoodTimeToPrewarm(m_websiteDataStore);
     574    m_process->processPool().didReachGoodTimeToPrewarm();
    575575}
    576576
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r243379 r243384  
    7373#include "WebProcessCache.h"
    7474#include "WebProcessCreationParameters.h"
     75#include "WebProcessDataStoreParameters.h"
    7576#include "WebProcessMessages.h"
    7677#include "WebProcessPoolMessages.h"
     
    695696
    696697    updateProcessAssertions();
    697     initializeNewWebProcess(serviceWorkerProcessProxy, *websiteDataStore);
     698    initializeNewWebProcess(serviceWorkerProcessProxy, websiteDataStore);
    698699
    699700    auto* serviceWorkerProcessProxyPtr = serviceWorkerProcessProxy.ptr();
     
    790791}
    791792
    792 WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore& websiteDataStore, WebProcessProxy::IsPrewarmed isPrewarmed)
     793WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore* websiteDataStore, WebProcessProxy::IsPrewarmed isPrewarmed)
    793794{
    794795    auto processProxy = WebProcessProxy::create(*this, websiteDataStore, isPrewarmed);
     
    808809        return nullptr;
    809810
    810     if (&m_prewarmedProcess->websiteDataStore() != &websiteDataStore)
    811         return nullptr;
    812 
    813811    ASSERT(m_prewarmedProcess->isPrewarmed());
    814812    m_prewarmedProcess->markIsNoLongerInPrewarmedPool();
     813
     814    m_prewarmedProcess->setWebsiteDataStore(websiteDataStore);
     815    sendWebProcessDataStoreParameters(*m_prewarmedProcess, websiteDataStore);
    815816
    816817    return std::exchange(m_prewarmedProcess, nullptr);
     
    840841#endif
    841842
    842 void WebProcessPool::initializeNewWebProcess(WebProcessProxy& process, WebsiteDataStore& websiteDataStore, WebProcessProxy::IsPrewarmed isPrewarmed)
     843void WebProcessPool::sendWebProcessDataStoreParameters(WebProcessProxy& process, WebsiteDataStore& websiteDataStore)
     844{
     845    WebProcessDataStoreParameters parameters;
     846
     847    websiteDataStore.resolveDirectoriesIfNecessary();
     848
     849    parameters.applicationCacheDirectory = websiteDataStore.resolvedApplicationCacheDirectory();
     850    if (parameters.applicationCacheDirectory.isEmpty())
     851        parameters.applicationCacheDirectory = m_resolvedPaths.applicationCacheDirectory;
     852    if (!parameters.applicationCacheDirectory.isEmpty())
     853        SandboxExtension::createHandleWithoutResolvingPath(parameters.applicationCacheDirectory, SandboxExtension::Type::ReadWrite, parameters.applicationCacheDirectoryExtensionHandle);
     854    parameters.applicationCacheFlatFileSubdirectoryName = m_configuration->applicationCacheFlatFileSubdirectoryName();
     855
     856    parameters.webSQLDatabaseDirectory = websiteDataStore.resolvedDatabaseDirectory();
     857    if (parameters.webSQLDatabaseDirectory.isEmpty())
     858        parameters.webSQLDatabaseDirectory = m_resolvedPaths.webSQLDatabaseDirectory;
     859    if (!parameters.webSQLDatabaseDirectory.isEmpty())
     860        SandboxExtension::createHandleWithoutResolvingPath(parameters.webSQLDatabaseDirectory, SandboxExtension::Type::ReadWrite, parameters.webSQLDatabaseDirectoryExtensionHandle);
     861
     862    parameters.mediaCacheDirectory = websiteDataStore.resolvedMediaCacheDirectory();
     863    if (parameters.mediaCacheDirectory.isEmpty())
     864        parameters.mediaCacheDirectory = m_resolvedPaths.mediaCacheDirectory;
     865    if (!parameters.mediaCacheDirectory.isEmpty())
     866        SandboxExtension::createHandleWithoutResolvingPath(parameters.mediaCacheDirectory, SandboxExtension::Type::ReadWrite, parameters.mediaCacheDirectoryExtensionHandle);
     867
     868    parameters.mediaKeyStorageDirectory = websiteDataStore.resolvedMediaKeysDirectory();
     869    if (parameters.mediaKeyStorageDirectory.isEmpty())
     870        parameters.mediaKeyStorageDirectory = m_resolvedPaths.mediaKeyStorageDirectory;
     871    if (!parameters.mediaKeyStorageDirectory.isEmpty())
     872        SandboxExtension::createHandleWithoutResolvingPath(parameters.mediaKeyStorageDirectory, SandboxExtension::Type::ReadWrite, parameters.mediaKeyStorageDirectoryExtensionHandle);
     873
     874    if (javaScriptConfigurationFileEnabled()) {
     875        parameters.javaScriptConfigurationDirectory = websiteDataStore.resolvedJavaScriptConfigurationDirectory();
     876        if (!parameters.javaScriptConfigurationDirectory.isEmpty())
     877            SandboxExtension::createHandleWithoutResolvingPath(parameters.javaScriptConfigurationDirectory, SandboxExtension::Type::ReadWrite, parameters.javaScriptConfigurationDirectoryExtensionHandle);
     878    }
     879
     880    parameters.resourceLoadStatisticsEnabled = websiteDataStore.resourceLoadStatisticsEnabled();
     881
     882    process.send(Messages::WebProcess::SetWebsiteDataStoreParameters(parameters), 0);
     883}
     884
     885void WebProcessPool::initializeNewWebProcess(WebProcessProxy& process, WebsiteDataStore* websiteDataStore, WebProcessProxy::IsPrewarmed isPrewarmed)
    843886{
    844887    auto initializationActivityToken = process.throttler().backgroundActivityToken();
     
    854897    WebProcessCreationParameters parameters;
    855898
    856     websiteDataStore.resolveDirectoriesIfNecessary();
    857 
    858899    parameters.injectedBundlePath = m_resolvedPaths.injectedBundlePath;
    859900    if (!parameters.injectedBundlePath.isEmpty())
     
    864905        SandboxExtension::createHandleWithoutResolvingPath(m_resolvedPaths.additionalWebProcessSandboxExtensionPaths[i], SandboxExtension::Type::ReadOnly, parameters.additionalSandboxExtensionHandles[i]);
    865906
    866     parameters.applicationCacheDirectory = websiteDataStore.resolvedApplicationCacheDirectory();
    867     if (parameters.applicationCacheDirectory.isEmpty())
    868         parameters.applicationCacheDirectory = m_resolvedPaths.applicationCacheDirectory;
    869     if (!parameters.applicationCacheDirectory.isEmpty())
    870         SandboxExtension::createHandleWithoutResolvingPath(parameters.applicationCacheDirectory, SandboxExtension::Type::ReadWrite, parameters.applicationCacheDirectoryExtensionHandle);
    871 
    872     parameters.applicationCacheFlatFileSubdirectoryName = m_configuration->applicationCacheFlatFileSubdirectoryName();
    873 
    874     parameters.webSQLDatabaseDirectory = websiteDataStore.resolvedDatabaseDirectory();
    875     if (parameters.webSQLDatabaseDirectory.isEmpty())
    876         parameters.webSQLDatabaseDirectory = m_resolvedPaths.webSQLDatabaseDirectory;
    877     if (!parameters.webSQLDatabaseDirectory.isEmpty())
    878         SandboxExtension::createHandleWithoutResolvingPath(parameters.webSQLDatabaseDirectory, SandboxExtension::Type::ReadWrite, parameters.webSQLDatabaseDirectoryExtensionHandle);
    879 
    880     parameters.mediaCacheDirectory = websiteDataStore.resolvedMediaCacheDirectory();
    881     if (parameters.mediaCacheDirectory.isEmpty())
    882         parameters.mediaCacheDirectory = m_resolvedPaths.mediaCacheDirectory;
    883     if (!parameters.mediaCacheDirectory.isEmpty())
    884         SandboxExtension::createHandleWithoutResolvingPath(parameters.mediaCacheDirectory, SandboxExtension::Type::ReadWrite, parameters.mediaCacheDirectoryExtensionHandle);
    885 
    886     parameters.mediaKeyStorageDirectory = websiteDataStore.resolvedMediaKeysDirectory();
    887     if (parameters.mediaKeyStorageDirectory.isEmpty())
    888         parameters.mediaKeyStorageDirectory = m_resolvedPaths.mediaKeyStorageDirectory;
    889     if (!parameters.mediaKeyStorageDirectory.isEmpty())
    890         SandboxExtension::createHandleWithoutResolvingPath(parameters.mediaKeyStorageDirectory, SandboxExtension::Type::ReadWrite, parameters.mediaKeyStorageDirectoryExtensionHandle);
    891 
    892907#if PLATFORM(IOS_FAMILY)
    893908    setJavaScriptConfigurationFileEnabledFromDefaults();
    894909#endif
    895 
    896     if (javaScriptConfigurationFileEnabled()) {
    897         parameters.javaScriptConfigurationDirectory = websiteDataStore.resolvedJavaScriptConfigurationDirectory();
    898         if (!parameters.javaScriptConfigurationDirectory.isEmpty())
    899             SandboxExtension::createHandleWithoutResolvingPath(parameters.javaScriptConfigurationDirectory, SandboxExtension::Type::ReadWrite, parameters.javaScriptConfigurationDirectoryExtensionHandle);
    900     }
    901910
    902911    parameters.cacheModel = cacheModel();
     
    959968#endif
    960969
    961     parameters.resourceLoadStatisticsEnabled = websiteDataStore.resourceLoadStatisticsEnabled();
    962970#if ENABLE(MEDIA_STREAM)
    963971    parameters.shouldCaptureAudioInUIProcess = m_configuration->shouldCaptureAudioInUIProcess();
     
    990998#endif
    991999
     1000    if (websiteDataStore)
     1001        sendWebProcessDataStoreParameters(process, *websiteDataStore);
     1002
    9921003    if (m_automationSession)
    9931004        process.send(Messages::WebProcess::EnsureAutomationSessionProxy(m_automationSession->sessionIdentifier()), 0);
     
    10151026}
    10161027
    1017 void WebProcessPool::prewarmProcess(WebsiteDataStore* websiteDataStore, MayCreateDefaultDataStore mayCreateDefaultDataStore)
    1018 {
    1019     if (m_prewarmedProcess && websiteDataStore && &m_prewarmedProcess->websiteDataStore() != websiteDataStore) {
    1020         RELEASE_LOG(PerformanceLogging, "Shutting down prewarmed process %i because we needed a prewarmed process with a different data store", m_prewarmedProcess->processIdentifier());
    1021         m_prewarmedProcess->shutDown();
    1022         ASSERT(!m_prewarmedProcess);
    1023     }
    1024 
     1028void WebProcessPool::prewarmProcess()
     1029{
    10251030    if (m_prewarmedProcess)
    10261031        return;
    10271032
    1028     if (!websiteDataStore) {
    1029         websiteDataStore = m_websiteDataStore ? &m_websiteDataStore->websiteDataStore() : nullptr;
    1030         if (!websiteDataStore) {
    1031             if (!m_processes.isEmpty())
    1032                 websiteDataStore = &m_processes.last()->websiteDataStore();
    1033             else if (mayCreateDefaultDataStore == MayCreateDefaultDataStore::Yes || API::WebsiteDataStore::defaultDataStoreExists())
    1034                 websiteDataStore = &API::WebsiteDataStore::defaultDataStore()->websiteDataStore();
    1035             else {
    1036                 RELEASE_LOG(PerformanceLogging, "Unable to prewarming a WebProcess because we could not find a usable data store");
    1037                 return;
    1038             }
    1039         }
    1040     }
    1041 
    1042     ASSERT(websiteDataStore);
    1043 
    10441033    RELEASE_LOG(PerformanceLogging, "Prewarming a WebProcess for performance");
    1045     createNewWebProcess(*websiteDataStore, WebProcessProxy::IsPrewarmed::Yes);
     1034    createNewWebProcess(nullptr, WebProcessProxy::IsPrewarmed::Yes);
    10461035}
    10471036
     
    11701159
    11711160    if (!usesSingleWebProcess())
    1172         return createNewWebProcess(websiteDataStore);
     1161        return createNewWebProcess(&websiteDataStore);
    11731162
    11741163#if PLATFORM(COCOA)
     
    11791168
    11801169    for (auto& process : m_processes) {
    1181         if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore)
     1170        if (process == m_prewarmedProcess || process == m_dummyProcessProxy)
    11821171            continue;
    11831172#if ENABLE(SERVICE_WORKER)
     
    11851174            continue;
    11861175#endif
     1176        if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore)
     1177            continue;
    11871178        return *process;
    11881179    }
    1189     return createNewWebProcess(websiteDataStore);
     1180    return createNewWebProcess(&websiteDataStore);
    11901181}
    11911182
     
    12221213        // In the common case, we delay process launch until something is actually loaded in the page.
    12231214        if (!m_dummyProcessProxy) {
    1224             auto dummyProcessProxy = WebProcessProxy::create(*this, WebsiteDataStore::createNonPersistent().get(), WebProcessProxy::IsPrewarmed::No, WebProcessProxy::ShouldLaunchProcess::No);
     1215            auto dummyProcessProxy = WebProcessProxy::create(*this, nullptr, WebProcessProxy::IsPrewarmed::No, WebProcessProxy::ShouldLaunchProcess::No);
    12251216            m_dummyProcessProxy = dummyProcessProxy.ptr();
    12261217            m_processes.append(WTFMove(dummyProcessProxy));
     
    13921383}
    13931384
    1394 void WebProcessPool::didReachGoodTimeToPrewarm(WebsiteDataStore& dataStore)
     1385void WebProcessPool::didReachGoodTimeToPrewarm()
    13951386{
    13961387    if (!configuration().isAutomaticProcessWarmingEnabled() || !configuration().processSwapsOnNavigation() || usesSingleWebProcess())
     
    14031394    }
    14041395
    1405     prewarmProcess(&dataStore, MayCreateDefaultDataStore::No);
     1396    prewarmProcess();
    14061397}
    14071398
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r243379 r243384  
    107107struct StatisticsData;
    108108struct WebProcessCreationParameters;
     109struct WebProcessDataStoreParameters;
    109110   
    110111typedef GenericCallback<API::Dictionary*> DictionaryCallback;
     
    312313    WebProcessProxy& processForRegistrableDomain(WebsiteDataStore&, WebPageProxy*, const WebCore::RegistrableDomain&); // Will return an existing one if limit is met or due to caching.
    313314
    314     enum class MayCreateDefaultDataStore { No, Yes };
    315     void prewarmProcess(WebsiteDataStore*, MayCreateDefaultDataStore);
     315    void prewarmProcess();
    316316
    317317    bool shouldTerminate(WebProcessProxy*);
     
    478478    void clearSuspendedPages(AllowProcessCaching);
    479479
    480     void didReachGoodTimeToPrewarm(WebsiteDataStore&);
     480    void didReachGoodTimeToPrewarm();
    481481
    482482    void didCollectPrewarmInformation(const WebCore::RegistrableDomain&, const WebCore::PrewarmInformation&);
     
    518518    RefPtr<WebProcessProxy> tryTakePrewarmedProcess(WebsiteDataStore&);
    519519
    520     WebProcessProxy& createNewWebProcess(WebsiteDataStore&, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No);
    521     void initializeNewWebProcess(WebProcessProxy&, WebsiteDataStore&, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No);
     520    WebProcessProxy& createNewWebProcess(WebsiteDataStore*, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No);
     521    void initializeNewWebProcess(WebProcessProxy&, WebsiteDataStore*, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No);
     522    void sendWebProcessDataStoreParameters(WebProcessProxy&, WebsiteDataStore&);
    522523
    523524    void requestWebContentStatistics(StatisticsRequest&);
     
    838839
    839840    if (!messageSent) {
    840         prewarmProcess(nullptr, MayCreateDefaultDataStore::No);
     841        prewarmProcess();
    841842        RefPtr<WebProcessProxy> process = m_processes.last();
    842843        if (process->canSendMessage())
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r243357 r243384  
    123123}
    124124
    125 Ref<WebProcessProxy> WebProcessProxy::create(WebProcessPool& processPool, WebsiteDataStore& websiteDataStore, IsPrewarmed isPrewarmed, ShouldLaunchProcess shouldLaunchProcess)
     125Ref<WebProcessProxy> WebProcessProxy::create(WebProcessPool& processPool, WebsiteDataStore* websiteDataStore, IsPrewarmed isPrewarmed, ShouldLaunchProcess shouldLaunchProcess)
    126126{
    127127    auto proxy = adoptRef(*new WebProcessProxy(processPool, websiteDataStore, isPrewarmed));
     
    131131}
    132132
    133 WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore& websiteDataStore, IsPrewarmed isPrewarmed)
     133WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore* websiteDataStore, IsPrewarmed isPrewarmed)
    134134    : AuxiliaryProcessProxy(processPool.alwaysRunsAtBackgroundPriority())
    135135    , m_responsivenessTimer(*this)
     
    220220}
    221221
     222void WebProcessProxy::setWebsiteDataStore(WebsiteDataStore& dataStore)
     223{
     224    ASSERT(!m_websiteDataStore);
     225    m_websiteDataStore = &dataStore;
     226}
     227
    222228void WebProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
    223229{
     
    376382    ASSERT(!globalPageMap().contains(webPage.pageID()));
    377383    ASSERT(!m_isInProcessCache);
    378     ASSERT(m_websiteDataStore.ptr() == &webPage.websiteDataStore() || processPool().dummyProcessProxy() == this);
     384    ASSERT(!m_websiteDataStore || m_websiteDataStore == &webPage.websiteDataStore());
    379385
    380386    if (beginsUsingDataStore == BeginsUsingDataStore::Yes)
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.h

    r243357 r243384  
    106106    enum class ShouldLaunchProcess : bool { No, Yes };
    107107
    108     static Ref<WebProcessProxy> create(WebProcessPool&, WebsiteDataStore&, IsPrewarmed, ShouldLaunchProcess = ShouldLaunchProcess::Yes);
     108    static Ref<WebProcessProxy> create(WebProcessPool&, WebsiteDataStore*, IsPrewarmed, ShouldLaunchProcess = ShouldLaunchProcess::Yes);
    109109    ~WebProcessProxy();
    110110
     
    121121    bool isInProcessCache() const { return m_isInProcessCache; }
    122122
    123     // FIXME: WebsiteDataStores should be made per-WebPageProxy throughout WebKit2
    124     WebsiteDataStore& websiteDataStore() const { return m_websiteDataStore.get(); }
     123    WebsiteDataStore& websiteDataStore() const { ASSERT(m_websiteDataStore); return *m_websiteDataStore; }
     124    void setWebsiteDataStore(WebsiteDataStore&);
    125125
    126126    static WebProcessProxy* processForIdentifier(WebCore::ProcessIdentifier);
     
    343343protected:
    344344    static uint64_t generatePageID();
    345     WebProcessProxy(WebProcessPool&, WebsiteDataStore&, IsPrewarmed);
     345    WebProcessProxy(WebProcessPool&, WebsiteDataStore*, IsPrewarmed);
    346346
    347347    // AuxiliaryProcessProxy
     
    494494    VisibleWebPageCounter m_visiblePageCounter;
    495495
    496     // FIXME: WebsiteDataStores should be made per-WebPageProxy throughout WebKit2. Get rid of this member.
    497     Ref<WebsiteDataStore> m_websiteDataStore;
     496    RefPtr<WebsiteDataStore> m_websiteDataStore;
    498497
    499498    bool m_isUnderMemoryPressure { false };
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r243354 r243384  
    903903                463FD4821EB94EC000A2982C /* ProcessTerminationReason.h in Headers */ = {isa = PBXBuildFile; fileRef = 463FD4811EB94EAD00A2982C /* ProcessTerminationReason.h */; };
    904904                466BC03C1FA266DA002FA9C1 /* WebSWContextManagerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 466BC0391FA266C9002FA9C1 /* WebSWContextManagerConnection.h */; };
     905                467E43E82243FF7D00B13924 /* WebProcessDataStoreParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 467E43E72243FF6D00B13924 /* WebProcessDataStoreParameters.h */; };
    905906                46A2B6091E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */; };
    906907                46DF063C1F3905F8001980BB /* NetworkCORSPreflightChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 46DF063A1F3905E5001980BB /* NetworkCORSPreflightChecker.h */; };
     
    31243125                466BC0391FA266C9002FA9C1 /* WebSWContextManagerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWContextManagerConnection.h; sourceTree = "<group>"; };
    31253126                466BC03A1FA266C9002FA9C1 /* WebSWContextManagerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWContextManagerConnection.messages.in; sourceTree = "<group>"; };
     3127                467E43E72243FF6D00B13924 /* WebProcessDataStoreParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebProcessDataStoreParameters.h; sourceTree = "<group>"; };
    31263128                4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProvisionalPageProxy.h; sourceTree = "<group>"; };
    31273129                4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProvisionalPageProxy.cpp; sourceTree = "<group>"; };
     
    52155217                                BC306823125A6B9400E71278 /* WebProcessCreationParameters.cpp */,
    52165218                                BC306822125A6B9400E71278 /* WebProcessCreationParameters.h */,
     5219                                467E43E72243FF6D00B13924 /* WebProcessDataStoreParameters.h */,
    52175220                                37948401150C350600E52CE9 /* WebRenderLayer.cpp */,
    52185221                                37948402150C350600E52CE9 /* WebRenderLayer.h */,
     
    96699672                                1A043F6A12514D8B00FFBFB5 /* WebProcessConnectionMessages.h in Headers */,
    96709673                                BC306824125A6B9400E71278 /* WebProcessCreationParameters.h in Headers */,
     9674                                467E43E82243FF7D00B13924 /* WebProcessDataStoreParameters.h in Headers */,
    96719675                                1AFA4B901A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h in Headers */,
    96729676                                1AFA4B8C1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h in Headers */,
  • trunk/Source/WebKit/WebProcess/MediaCache/WebMediaKeyStorageManager.cpp

    r240437 r243384  
    2727#include "WebMediaKeyStorageManager.h"
    2828
    29 #include "WebProcessCreationParameters.h"
     29#include "WebProcessDataStoreParameters.h"
    3030#include <WebCore/SecurityOrigin.h>
    3131#include <WebCore/SecurityOriginData.h>
     
    3636using namespace WebCore;
    3737
    38 void WebMediaKeyStorageManager::initialize(const WebProcessCreationParameters &parameters)
     38void WebMediaKeyStorageManager::setWebsiteDataStore(const WebProcessDataStoreParameters& parameters)
    3939{
    4040    ASSERT(!parameters.mediaKeyStorageDirectory.isEmpty());
  • trunk/Source/WebKit/WebProcess/MediaCache/WebMediaKeyStorageManager.h

    r238802 r243384  
    5656
    5757private:
    58     void initialize(const WebProcessCreationParameters&) override;
     58    void setWebsiteDataStore(const WebProcessDataStoreParameters&) override;
    5959
    6060    String m_mediaKeyStorageDirectory;
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r243357 r243384  
    6262#include "WebPluginInfoProvider.h"
    6363#include "WebProcessCreationParameters.h"
     64#include "WebProcessDataStoreParameters.h"
    6465#include "WebProcessMessages.h"
    6566#include "WebProcessPoolMessages.h"
     
    286287#endif
    287288
    288     platformInitializeWebProcess(WTFMove(parameters));
     289    platformInitializeWebProcess(parameters);
    289290
    290291    // Match the QoS of the UIProcess and the scrolling thread but use a slightly lower priority.
     
    342343        supplement->initialize(parameters);
    343344
     345    setCacheModel(parameters.cacheModel);
     346
     347    if (!parameters.languages.isEmpty())
     348        overrideUserPreferredLanguages(parameters.languages);
     349
     350    m_textCheckerState = parameters.textCheckerState;
     351
     352    m_fullKeyboardAccessEnabled = parameters.fullKeyboardAccessEnabled;
     353
     354    for (auto& scheme : parameters.urlSchemesRegisteredAsEmptyDocument)
     355        registerURLSchemeAsEmptyDocument(scheme);
     356
     357    for (auto& scheme : parameters.urlSchemesRegisteredAsSecure)
     358        registerURLSchemeAsSecure(scheme);
     359
     360    for (auto& scheme : parameters.urlSchemesRegisteredAsBypassingContentSecurityPolicy)
     361        registerURLSchemeAsBypassingContentSecurityPolicy(scheme);
     362
     363    for (auto& scheme : parameters.urlSchemesForWhichDomainRelaxationIsForbidden)
     364        setDomainRelaxationForbiddenForURLScheme(scheme);
     365
     366    for (auto& scheme : parameters.urlSchemesRegisteredAsLocal)
     367        registerURLSchemeAsLocal(scheme);
     368
     369    for (auto& scheme : parameters.urlSchemesRegisteredAsNoAccess)
     370        registerURLSchemeAsNoAccess(scheme);
     371
     372    for (auto& scheme : parameters.urlSchemesRegisteredAsDisplayIsolated)
     373        registerURLSchemeAsDisplayIsolated(scheme);
     374
     375    for (auto& scheme : parameters.urlSchemesRegisteredAsCORSEnabled)
     376        registerURLSchemeAsCORSEnabled(scheme);
     377
     378    for (auto& scheme : parameters.urlSchemesRegisteredAsAlwaysRevalidated)
     379        registerURLSchemeAsAlwaysRevalidated(scheme);
     380
     381    for (auto& scheme : parameters.urlSchemesRegisteredAsCachePartitioned)
     382        registerURLSchemeAsCachePartitioned(scheme);
     383
     384    for (auto& scheme : parameters.urlSchemesServiceWorkersCanHandle)
     385        registerURLSchemeServiceWorkersCanHandle(scheme);
     386
     387    for (auto& scheme : parameters.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest)
     388        registerURLSchemeAsCanDisplayOnlyIfCanRequest(scheme);
     389
     390    setDefaultRequestTimeoutInterval(parameters.defaultRequestTimeoutInterval);
     391
     392    setAlwaysUsesComplexTextCodePath(parameters.shouldAlwaysUseComplexTextCodePath);
     393
     394    setShouldUseFontSmoothing(parameters.shouldUseFontSmoothing);
     395
     396    ensureNetworkProcessConnection();
     397
     398#if ENABLE(RESOURCE_LOAD_STATISTICS)
     399    ResourceLoadObserver::shared().setLogUserInteractionNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& domain) {
     400        ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogUserInteraction(sessionID, domain), 0);
     401    });
     402
     403    ResourceLoadObserver::shared().setLogWebSocketLoadingNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& targetDomain, const RegistrableDomain& topFrameDomain, WallTime lastSeen) {
     404        ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogWebSocketLoading(sessionID, targetDomain, topFrameDomain, lastSeen), 0);
     405    });
     406   
     407    ResourceLoadObserver::shared().setLogSubresourceLoadingNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& targetDomain, const RegistrableDomain& topFrameDomain, WallTime lastSeen) {
     408        ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogSubresourceLoading(sessionID, targetDomain, topFrameDomain, lastSeen), 0);
     409    });
     410
     411    ResourceLoadObserver::shared().setLogSubresourceRedirectNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& sourceDomain, const RegistrableDomain& targetDomain) {
     412        ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogSubresourceRedirect(sessionID, sourceDomain, targetDomain), 0);
     413    });
     414#endif
     415
     416    setTerminationTimeout(parameters.terminationTimeout);
     417
     418    resetPlugInAutoStartOriginHashes(parameters.plugInAutoStartOriginHashes);
     419    for (auto& origin : parameters.plugInAutoStartOrigins)
     420        m_plugInAutoStartOrigins.add(origin);
     421
     422    setMemoryCacheDisabled(parameters.memoryCacheDisabled);
     423
     424    WebCore::RuntimeEnabledFeatures::sharedFeatures().setAttrStyleEnabled(parameters.attrStyleEnabled);
     425
     426#if ENABLE(SERVICE_CONTROLS)
     427    setEnabledServices(parameters.hasImageServices, parameters.hasSelectionServices, parameters.hasRichContentServices);
     428#endif
     429
     430#if ENABLE(REMOTE_INSPECTOR) && PLATFORM(COCOA)
     431    if (Optional<audit_token_t> auditToken = parentProcessConnection()->getAuditToken()) {
     432        RetainPtr<CFDataRef> auditData = adoptCF(CFDataCreate(nullptr, (const UInt8*)&*auditToken, sizeof(*auditToken)));
     433        Inspector::RemoteInspector::singleton().setParentProcessInformation(WebCore::presentingApplicationPID(), auditData);
     434    }
     435#endif
     436
     437#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
     438    resetPluginLoadClientPolicies(parameters.pluginLoadClientPolicies);
     439#endif
     440
     441#if ENABLE(GAMEPAD)
     442    GamepadProvider::singleton().setSharedProvider(WebGamepadProvider::singleton());
     443#endif
     444
     445#if ENABLE(SERVICE_WORKER)
     446    ServiceWorkerProvider::setSharedProvider(WebServiceWorkerProvider::singleton());
     447#endif
     448
     449#if ENABLE(WEBASSEMBLY)
     450    JSC::Wasm::enableFastMemory();
     451#endif
     452
     453#if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
     454    ResourceLoadObserver::shared().setShouldLogUserInteraction(parameters.shouldLogUserInteraction);
     455#endif
     456
     457    RELEASE_LOG(Process, "%p - WebProcess::initializeWebProcess: Presenting process = %d", this, WebCore::presentingApplicationPID());
     458}
     459
     460void WebProcess::setWebsiteDataStoreParameters(WebProcessDataStoreParameters&& parameters)
     461{
    344462    auto& databaseManager = DatabaseManager::singleton();
    345463    databaseManager.initialize(parameters.webSQLDatabaseDirectory);
     
    356474#endif
    357475
    358     setCacheModel(parameters.cacheModel);
    359 
    360     if (!parameters.languages.isEmpty())
    361         overrideUserPreferredLanguages(parameters.languages);
    362 
    363     m_textCheckerState = parameters.textCheckerState;
    364 
    365     m_fullKeyboardAccessEnabled = parameters.fullKeyboardAccessEnabled;
    366 
    367     for (auto& scheme : parameters.urlSchemesRegisteredAsEmptyDocument)
    368         registerURLSchemeAsEmptyDocument(scheme);
    369 
    370     for (auto& scheme : parameters.urlSchemesRegisteredAsSecure)
    371         registerURLSchemeAsSecure(scheme);
    372 
    373     for (auto& scheme : parameters.urlSchemesRegisteredAsBypassingContentSecurityPolicy)
    374         registerURLSchemeAsBypassingContentSecurityPolicy(scheme);
    375 
    376     for (auto& scheme : parameters.urlSchemesForWhichDomainRelaxationIsForbidden)
    377         setDomainRelaxationForbiddenForURLScheme(scheme);
    378 
    379     for (auto& scheme : parameters.urlSchemesRegisteredAsLocal)
    380         registerURLSchemeAsLocal(scheme);
    381 
    382     for (auto& scheme : parameters.urlSchemesRegisteredAsNoAccess)
    383         registerURLSchemeAsNoAccess(scheme);
    384 
    385     for (auto& scheme : parameters.urlSchemesRegisteredAsDisplayIsolated)
    386         registerURLSchemeAsDisplayIsolated(scheme);
    387 
    388     for (auto& scheme : parameters.urlSchemesRegisteredAsCORSEnabled)
    389         registerURLSchemeAsCORSEnabled(scheme);
    390 
    391     for (auto& scheme : parameters.urlSchemesRegisteredAsAlwaysRevalidated)
    392         registerURLSchemeAsAlwaysRevalidated(scheme);
    393 
    394     for (auto& scheme : parameters.urlSchemesRegisteredAsCachePartitioned)
    395         registerURLSchemeAsCachePartitioned(scheme);
    396 
    397     for (auto& scheme : parameters.urlSchemesServiceWorkersCanHandle)
    398         registerURLSchemeServiceWorkersCanHandle(scheme);
    399 
    400     for (auto& scheme : parameters.urlSchemesRegisteredAsCanDisplayOnlyIfCanRequest)
    401         registerURLSchemeAsCanDisplayOnlyIfCanRequest(scheme);
    402 
    403     setDefaultRequestTimeoutInterval(parameters.defaultRequestTimeoutInterval);
    404 
    405476    setResourceLoadStatisticsEnabled(parameters.resourceLoadStatisticsEnabled);
    406477
    407     setAlwaysUsesComplexTextCodePath(parameters.shouldAlwaysUseComplexTextCodePath);
    408 
    409     setShouldUseFontSmoothing(parameters.shouldUseFontSmoothing);
    410 
    411     ensureNetworkProcessConnection();
    412 
    413 #if ENABLE(RESOURCE_LOAD_STATISTICS)
    414     ResourceLoadObserver::shared().setLogUserInteractionNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& domain) {
    415         ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogUserInteraction(sessionID, domain), 0);
    416     });
    417 
    418     ResourceLoadObserver::shared().setLogWebSocketLoadingNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& targetDomain, const RegistrableDomain& topFrameDomain, WallTime lastSeen) {
    419         ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogWebSocketLoading(sessionID, targetDomain, topFrameDomain, lastSeen), 0);
    420     });
    421    
    422     ResourceLoadObserver::shared().setLogSubresourceLoadingNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& targetDomain, const RegistrableDomain& topFrameDomain, WallTime lastSeen) {
    423         ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogSubresourceLoading(sessionID, targetDomain, topFrameDomain, lastSeen), 0);
    424     });
    425 
    426     ResourceLoadObserver::shared().setLogSubresourceRedirectNotificationCallback([this] (PAL::SessionID sessionID, const RegistrableDomain& sourceDomain, const RegistrableDomain& targetDomain) {
    427         ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::LogSubresourceRedirect(sessionID, sourceDomain, targetDomain), 0);
    428     });
    429 #endif
    430 
    431     setTerminationTimeout(parameters.terminationTimeout);
    432 
    433     resetPlugInAutoStartOriginHashes(parameters.plugInAutoStartOriginHashes);
    434     for (auto& origin : parameters.plugInAutoStartOrigins)
    435         m_plugInAutoStartOrigins.add(origin);
    436 
    437     setMemoryCacheDisabled(parameters.memoryCacheDisabled);
    438 
    439     WebCore::RuntimeEnabledFeatures::sharedFeatures().setAttrStyleEnabled(parameters.attrStyleEnabled);
    440 
    441 #if ENABLE(SERVICE_CONTROLS)
    442     setEnabledServices(parameters.hasImageServices, parameters.hasSelectionServices, parameters.hasRichContentServices);
    443 #endif
    444 
    445 #if ENABLE(REMOTE_INSPECTOR) && PLATFORM(COCOA)
    446     if (Optional<audit_token_t> auditToken = parentProcessConnection()->getAuditToken()) {
    447         RetainPtr<CFDataRef> auditData = adoptCF(CFDataCreate(nullptr, (const UInt8*)&*auditToken, sizeof(*auditToken)));
    448         Inspector::RemoteInspector::singleton().setParentProcessInformation(WebCore::presentingApplicationPID(), auditData);
    449     }
    450 #endif
    451 
    452 #if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
    453     resetPluginLoadClientPolicies(parameters.pluginLoadClientPolicies);
    454 #endif
    455 
    456 #if ENABLE(GAMEPAD)
    457     GamepadProvider::singleton().setSharedProvider(WebGamepadProvider::singleton());
    458 #endif
    459 
    460 #if ENABLE(SERVICE_WORKER)
    461     ServiceWorkerProvider::setSharedProvider(WebServiceWorkerProvider::singleton());
    462 #endif
    463 
    464 #if ENABLE(WEBASSEMBLY)
    465     JSC::Wasm::enableFastMemory();
    466 #endif
    467 
    468 #if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
    469     ResourceLoadObserver::shared().setShouldLogUserInteraction(parameters.shouldLogUserInteraction);
    470 #endif
    471 
    472     RELEASE_LOG(Process, "%p - WebProcess::initializeWebProcess: Presenting process = %d", this, WebCore::presentingApplicationPID());
     478    for (auto& supplement : m_supplements.values())
     479        supplement->setWebsiteDataStore(parameters);
     480
     481    platformSetWebsiteDataStoreParameters(WTFMove(parameters));
    473482}
    474483
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r243357 r243384  
    3737#include "ViewUpdateDispatcher.h"
    3838#include "WebInspectorInterruptDispatcher.h"
     39#include "WebProcessCreationParameters.h"
    3940#include <WebCore/ActivityState.h>
    4041#include <WebCore/RegistrableDomain.h>
     
    105106class WebPage;
    106107class WebPageGroupProxy;
     108struct WebProcessCreationParameters;
     109struct WebProcessDataStoreParameters;
    107110class WebProcessSupplement;
    108111enum class WebsiteDataType;
     
    110113struct WebPageGroupData;
    111114struct WebPreferencesStore;
    112 struct WebProcessCreationParameters;
    113115struct WebsiteData;
    114116struct WebsiteDataStoreParameters;
     
    263265
    264266    void initializeWebProcess(WebProcessCreationParameters&&);
    265     void platformInitializeWebProcess(WebProcessCreationParameters&&);
     267    void platformInitializeWebProcess(WebProcessCreationParameters&);
     268    void setWebsiteDataStoreParameters(WebProcessDataStoreParameters&&);
     269    void platformSetWebsiteDataStoreParameters(WebProcessDataStoreParameters&&);
    266270
    267271    void prewarmGlobally();
  • trunk/Source/WebKit/WebProcess/WebProcess.messages.in

    r243357 r243384  
    2323messages -> WebProcess LegacyReceiver {
    2424    InitializeWebProcess(struct WebKit::WebProcessCreationParameters processCreationParameters)
     25    SetWebsiteDataStoreParameters(struct WebKit::WebProcessDataStoreParameters parameters)
    2526
    2627    # Create a new page.
  • trunk/Source/WebKit/WebProcess/WebProcessSupplement.h

    r240683 r243384  
    3131
    3232struct WebProcessCreationParameters;
     33struct WebProcessDataStoreParameters;
    3334
    3435class WebProcessSupplement : public AuxiliaryProcessSupplement {
    3536public:
    36     virtual void initialize(const WebProcessCreationParameters&)
    37     {
    38     }
     37    virtual void initialize(const WebProcessCreationParameters&) { }
     38    virtual void setWebsiteDataStore(const WebProcessDataStoreParameters&) { }
    3939};
    4040
  • trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm

    r242905 r243384  
    4444#import "WebPage.h"
    4545#import "WebProcessCreationParameters.h"
     46#import "WebProcessDataStoreParameters.h"
    4647#import "WebProcessProxyMessages.h"
    4748#import "WebsiteDataStoreParameters.h"
     
    132133#endif
    133134
    134 void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&& parameters)
     135void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters& parameters)
    135136{
    136137#if !LOG_DISABLED || !RELEASE_LOG_DISABLED
     
    146147#if ENABLE(SANDBOX_EXTENSIONS)
    147148    SandboxExtension::consumePermanently(parameters.uiProcessBundleResourcePathExtensionHandle);
    148     SandboxExtension::consumePermanently(parameters.webSQLDatabaseDirectoryExtensionHandle);
    149     SandboxExtension::consumePermanently(parameters.applicationCacheDirectoryExtensionHandle);
    150     SandboxExtension::consumePermanently(parameters.mediaCacheDirectoryExtensionHandle);
    151     SandboxExtension::consumePermanently(parameters.mediaKeyStorageDirectoryExtensionHandle);
    152     SandboxExtension::consumePermanently(parameters.javaScriptConfigurationDirectoryExtensionHandle);
    153149#if ENABLE(MEDIA_STREAM)
    154150    SandboxExtension::consumePermanently(parameters.audioCaptureExtensionHandle);
     
    160156#endif
    161157#endif
    162 
    163     if (!parameters.javaScriptConfigurationDirectory.isEmpty()) {
    164         String javaScriptConfigFile = parameters.javaScriptConfigurationDirectory + "/JSC.config";
    165         JSC::processConfigFile(javaScriptConfigFile.latin1().data(), "com.apple.WebKit.WebContent", parameters.uiProcessBundleIdentifier.latin1().data());
    166     }
    167158
    168159    // Disable NSURLCache.
     
    215206#endif
    216207#endif
     208}
     209
     210void WebProcess::platformSetWebsiteDataStoreParameters(WebProcessDataStoreParameters&& parameters)
     211{
     212#if ENABLE(SANDBOX_EXTENSIONS)
     213    SandboxExtension::consumePermanently(parameters.webSQLDatabaseDirectoryExtensionHandle);
     214    SandboxExtension::consumePermanently(parameters.applicationCacheDirectoryExtensionHandle);
     215    SandboxExtension::consumePermanently(parameters.mediaCacheDirectoryExtensionHandle);
     216    SandboxExtension::consumePermanently(parameters.mediaKeyStorageDirectoryExtensionHandle);
     217    SandboxExtension::consumePermanently(parameters.javaScriptConfigurationDirectoryExtensionHandle);
     218#endif
     219
     220    if (!parameters.javaScriptConfigurationDirectory.isEmpty()) {
     221        String javaScriptConfigFile = parameters.javaScriptConfigurationDirectory + "/JSC.config";
     222        JSC::processConfigFile(javaScriptConfigFile.latin1().data(), "com.apple.WebKit.WebContent", m_uiProcessBundleIdentifier.latin1().data());
     223    }
    217224}
    218225
  • trunk/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp

    r243002 r243384  
    5050}
    5151
    52 void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&& parameters)
     52void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters& parameters)
    5353{
    5454#if PLATFORM(WPE)
     
    7070}
    7171
     72void WebProcess::platformSetWebsiteDataStoreParameters(WebProcessDataStoreParameters&&)
     73{
     74}
     75
    7276void WebProcess::platformTerminate()
    7377{
  • trunk/Source/WebKit/WebProcess/win/WebProcessWin.cpp

    r235205 r243384  
    3535
    3636namespace WebKit {
    37 void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&&)
     37
     38void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&)
     39{
     40}
     41
     42void WebProcess::platformSetWebsiteDataStoreParameters(WebProcessDataStoreParameters&&)
    3843{
    3944}
  • trunk/Tools/ChangeLog

    r243373 r243384  
     12019-03-22  Chris Dumez  <cdumez@apple.com>
     2
     3        Prewarmed processes should be usable with any website data store
     4        https://bugs.webkit.org/show_bug.cgi?id=196104
     5
     6        Reviewed by Alex Christensen.
     7
     8        Add API test coverage.
     9
     10        * TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm:
     11        (runInitialWarmedProcessUsedTest):
     12        (TEST):
     13
    1142019-03-22  David Kilzer  <ddkilzer@apple.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm

    r243094 r243384  
    5050}
    5151
    52 TEST(WKProcessPool, InitialWarmedProcessUsed)
     52enum class ShouldUseEphemeralStore { No, Yes };
     53static void runInitialWarmedProcessUsedTest(ShouldUseEphemeralStore shouldUseEphemeralStore)
    5354{
    5455    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     
    6364    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    6465    configuration.get().processPool = pool.get();
     66    if (shouldUseEphemeralStore == ShouldUseEphemeralStore::Yes)
     67        configuration.get().websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
    6568
    6669    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]);
     
    7578    EXPECT_FALSE([pool _hasPrewarmedWebProcess]);
    7679    EXPECT_EQ(1U, [pool _webPageContentProcessCount]);
     80}
     81
     82TEST(WKProcessPool, InitialWarmedProcessUsed)
     83{
     84    runInitialWarmedProcessUsedTest(ShouldUseEphemeralStore::No);
     85}
     86
     87TEST(WKProcessPool, InitialWarmedProcessUsedForEphemeralSession)
     88{
     89    runInitialWarmedProcessUsedTest(ShouldUseEphemeralStore::Yes);
    7790}
    7891
Note: See TracChangeset for help on using the changeset viewer.