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

Changeset 225935 in webkit


Ignore:
Timestamp:
Dec 14, 2017, 2:57:14 PM (9 years ago)
Author:
beidson@apple.com
Message:

REGRESSION (r225789): API tests WKProcessPool.InitialWarmedProcessUsed and WebKit.WebsiteDataStoreCustomPaths are failing.
​https://bugs.webkit.org/show_bug.cgi?id=180722

Reviewed by Chris Dumez.

Source/WebKit:

  • Add a test-only accessor to get the number of WebProcesses hosting WebPages
  • Have WebsiteDataStore keep track of all instances so they can be looked up by SessionID
  • When the StorageProcess needs to establish a SW context connection on behalf of a specific SessionID, the UI process will now prefer using the WebsiteDataStore associated with that SessionID. This allows us to continue deferring creation of the default data store if it's not needed.
  • StorageProcess/StorageProcess.cpp:

(WebKit::StorageProcess::connectionToContextProcessWasClosed):
(WebKit::StorageProcess::createServerToContextConnection):

  • StorageProcess/StorageProcess.h:
  • StorageProcess/StorageToWebProcessConnection.cpp:

(WebKit::StorageToWebProcessConnection::establishSWServerConnection):

  • UIProcess/API/Cocoa/WKProcessPool.mm:

(-[WKProcessPool _webPageContentProcessCount]):

  • UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
  • UIProcess/Storage/StorageProcessProxy.cpp:

(WebKit::StorageProcessProxy::establishWorkerContextConnectionToStorageProcess):
(WebKit::StorageProcessProxy::establishWorkerContextConnectionToStorageProcessForExplicitSession):

  • UIProcess/Storage/StorageProcessProxy.h:
  • UIProcess/Storage/StorageProcessProxy.messages.in:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):

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

(WebKit::WebsiteDataStore::WebsiteDataStore):
(WebKit::WebsiteDataStore::~WebsiteDataStore):
(WebKit::WebsiteDataStore::existingDataStoreForSessionID):

  • UIProcess/WebsiteData/WebsiteDataStore.h:

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm:

(TEST):

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r225934 r225935  
     12017-12-14  Brady Eidson  <beidson@apple.com>
     2
     3        REGRESSION (r225789): API tests WKProcessPool.InitialWarmedProcessUsed and WebKit.WebsiteDataStoreCustomPaths are failing.
     4        https://bugs.webkit.org/show_bug.cgi?id=180722
     5
     6        Reviewed by Chris Dumez.
     7
     8        - Add a test-only accessor to get the number of WebProcesses hosting WebPages
     9        - Have WebsiteDataStore keep track of all instances so they can be looked up by SessionID
     10        - When the StorageProcess needs to establish a SW context connection on behalf of a specific SessionID,
     11          the UI process will now prefer using the WebsiteDataStore associated with that SessionID. This allows
     12          us to continue deferring creation of the default data store if it's not needed.
     13
     14        * StorageProcess/StorageProcess.cpp:
     15        (WebKit::StorageProcess::connectionToContextProcessWasClosed):
     16        (WebKit::StorageProcess::createServerToContextConnection):
     17        * StorageProcess/StorageProcess.h:
     18
     19        * StorageProcess/StorageToWebProcessConnection.cpp:
     20        (WebKit::StorageToWebProcessConnection::establishSWServerConnection):
     21
     22        * UIProcess/API/Cocoa/WKProcessPool.mm:
     23        (-[WKProcessPool _webPageContentProcessCount]):
     24        * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
     25
     26        * UIProcess/Storage/StorageProcessProxy.cpp:
     27        (WebKit::StorageProcessProxy::establishWorkerContextConnectionToStorageProcess):
     28        (WebKit::StorageProcessProxy::establishWorkerContextConnectionToStorageProcessForExplicitSession):
     29        * UIProcess/Storage/StorageProcessProxy.h:
     30        * UIProcess/Storage/StorageProcessProxy.messages.in:
     31
     32        * UIProcess/WebProcessPool.cpp:
     33        (WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):
     34        * UIProcess/WebProcessPool.h:
     35
     36        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     37        (WebKit::WebsiteDataStore::WebsiteDataStore):
     38        (WebKit::WebsiteDataStore::~WebsiteDataStore):
     39        (WebKit::WebsiteDataStore::existingDataStoreForSessionID):
     40        * UIProcess/WebsiteData/WebsiteDataStore.h:
     41
    1422017-12-14  John Wilander  <wilander@apple.com>
    243
  • trunk/Source/WebKit/StorageProcess/StorageProcess.cpp

    r225926 r225935  
    112112
    113113    if (shouldRelaunch)
    114         createServerToContextConnection();
     114        createServerToContextConnection(std::nullopt);
    115115}
    116116
    … …  
    425425}
    426426
    427 void StorageProcess::createServerToContextConnection()
     427void StorageProcess::createServerToContextConnection(std::optional<PAL::SessionID> sessionID)
    428428{
    429429    if (m_waitingForServerToContextProcessConnection)
    … …  
    431431   
    432432    m_waitingForServerToContextProcessConnection = true;
    433     parentProcessConnection()->send(Messages::StorageProcessProxy::EstablishWorkerContextConnectionToStorageProcess(), 0);
     433    if (sessionID)
     434        parentProcessConnection()->send(Messages::StorageProcessProxy::EstablishWorkerContextConnectionToStorageProcessForExplicitSession(*sessionID), 0);
     435    else
     436        parentProcessConnection()->send(Messages::StorageProcessProxy::EstablishWorkerContextConnectionToStorageProcess(), 0);
    434437}
    435438
  • trunk/Source/WebKit/StorageProcess/StorageProcess.h

    r225926 r225935  
    9090    // This will change in the future.
    9191    WebSWServerToContextConnection* globalServerToContextConnection();
    92     void createServerToContextConnection();
     92    void createServerToContextConnection(std::optional<PAL::SessionID>);
    9393
    9494    WebCore::SWServer& swServerForSession(PAL::SessionID);
  • trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.cpp

    r225877 r225935  
    172172
    173173    if (!StorageProcess::singleton().globalServerToContextConnection())
    174         StorageProcess::singleton().createServerToContextConnection();
     174        StorageProcess::singleton().createServerToContextConnection(sessionID);
    175175}
    176176
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

    r225877 r225935  
    438438}
    439439
     440- (size_t)_webPageContentProcessCount
     441{
     442    auto allWebProcesses = _processPool->processes();
     443    auto* serviceWorkerProcess = _processPool->serviceWorkerProxy();
     444    if (!serviceWorkerProcess)
     445        return allWebProcesses.size();
     446
     447#if !ASSERT_DISABLED
     448    bool serviceWorkerProcessWasFound = false;
     449    for (auto& process : allWebProcesses) {
     450        if (process == serviceWorkerProcess) {
     451            serviceWorkerProcessWasFound = true;
     452            break;
     453        }
     454    }
     455
     456    ASSERT(serviceWorkerProcessWasFound);
     457    ASSERT(allWebProcesses.size() > 1);
     458#endif
     459
     460    return allWebProcesses.size() - 1;
     461}
     462
    440463- (void)_preconnectToServer:(NSURL *)serverURL
    441464{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h

    r225877 r225935  
    8686- (void)_syncNetworkProcessCookies WK_API_AVAILABLE(macosx(10.13), ios(11.0));
    8787
     88// Test only. Returns web processes running web pages (does not include web processes running service workers)
     89- (size_t)_webPageContentProcessCount WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     90
    8891// Test only. Should be called before any web content processes are launched.
    8992+ (void)_forceGameControllerFramework WK_API_AVAILABLE(macosx(10.13), ios(11.0));
  • trunk/Source/WebKit/UIProcess/Storage/StorageProcessProxy.cpp

    r225877 r225935  
    224224void StorageProcessProxy::establishWorkerContextConnectionToStorageProcess()
    225225{
    226     m_processPool.establishWorkerContextConnectionToStorageProcess(*this);
     226    m_processPool.establishWorkerContextConnectionToStorageProcess(*this, std::nullopt);
     227}
     228
     229void StorageProcessProxy::establishWorkerContextConnectionToStorageProcessForExplicitSession(PAL::SessionID sessionID)
     230{
     231    m_processPool.establishWorkerContextConnectionToStorageProcess(*this, sessionID);
    227232}
    228233#endif
  • trunk/Source/WebKit/UIProcess/Storage/StorageProcessProxy.h

    r225877 r225935  
    8282#if ENABLE(SERVICE_WORKER)
    8383    void establishWorkerContextConnectionToStorageProcess();
     84    void establishWorkerContextConnectionToStorageProcessForExplicitSession(PAL::SessionID);
    8485#endif
    8586
  • trunk/Source/WebKit/UIProcess/Storage/StorageProcessProxy.messages.in

    r225877 r225935  
    3434#if ENABLE(SERVICE_WORKER)
    3535    EstablishWorkerContextConnectionToStorageProcess()
     36    EstablishWorkerContextConnectionToStorageProcessForExplicitSession(PAL::SessionID explicitSession)
    3637#endif
    3738}
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r225924 r225935  
    590590
    591591#if ENABLE(SERVICE_WORKER)
    592 void WebProcessPool::establishWorkerContextConnectionToStorageProcess(StorageProcessProxy& proxy)
     592void WebProcessPool::establishWorkerContextConnectionToStorageProcess(StorageProcessProxy& proxy, std::optional<PAL::SessionID> sessionID)
    593593{
    594594    ASSERT_UNUSED(proxy, &proxy == m_storageProcess);
    … …  
    597597        return;
    598598
    599     if (!m_websiteDataStore)
    600         m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
    601 
    602     auto serviceWorkerProcessProxy = ServiceWorkerProcessProxy::create(*this, m_websiteDataStore->websiteDataStore());
     599    WebsiteDataStore* websiteDataStore = nullptr;
     600    if (sessionID)
     601        websiteDataStore = WebsiteDataStore::existingNonDefaultDataStoreForSessionID(*sessionID);
     602
     603    if (!websiteDataStore) {
     604        if (!m_websiteDataStore)
     605            m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
     606        websiteDataStore = &m_websiteDataStore->websiteDataStore();
     607    }
     608
     609    auto serviceWorkerProcessProxy = ServiceWorkerProcessProxy::create(*this, *websiteDataStore);
    603610    m_serviceWorkerProcess = serviceWorkerProcessProxy.ptr();
     611
    604612    updateProcessAssertions();
    605     initializeNewWebProcess(serviceWorkerProcessProxy.get(), m_websiteDataStore->websiteDataStore());
     613    initializeNewWebProcess(serviceWorkerProcessProxy.get(), *websiteDataStore);
     614
    606615    m_processes.append(WTFMove(serviceWorkerProcessProxy));
    607616
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r225877 r225935  
    324324    void storageProcessCrashed(StorageProcessProxy*);
    325325#if ENABLE(SERVICE_WORKER)
    326     void establishWorkerContextConnectionToStorageProcess(StorageProcessProxy&);
     326    void establishWorkerContextConnectionToStorageProcess(StorageProcessProxy&, std::optional<PAL::SessionID>);
    327327    bool isServiceWorker(uint64_t pageID) const { return m_serviceWorkerProcess && m_serviceWorkerProcess->pageID() == pageID; }
    328328    ServiceWorkerProcessProxy* serviceWorkerProxy() const { return m_serviceWorkerProcess; }
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r225877 r225935  
    5656namespace WebKit {
    5757
     58static HashMap<PAL::SessionID, WebsiteDataStore*>& nonDefaultDataStores()
     59{
     60    RELEASE_ASSERT(isMainThread());
     61    static NeverDestroyed<HashMap<PAL::SessionID, WebsiteDataStore*>> map;
     62    return map;
     63}
     64
    5865Ref<WebsiteDataStore> WebsiteDataStore::createNonPersistent()
    5966{
    … …  
    7279    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
    7380{
     81    if (m_sessionID != PAL::SessionID::defaultSessionID()) {
     82        auto result = nonDefaultDataStores().add(sessionID, this);
     83        ASSERT_UNUSED(result, result.isNewEntry);
     84    }
     85
    7486    platformInitialize();
    7587}
    … …  
    8092    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
    8193{
     94    if (m_sessionID != PAL::SessionID::defaultSessionID()) {
     95        auto result = nonDefaultDataStores().add(sessionID, this);
     96        ASSERT_UNUSED(result, result.isNewEntry);
     97    }
     98   
    8299    platformInitialize();
    83100}
    … …  
    85102WebsiteDataStore::~WebsiteDataStore()
    86103{
     104    if (m_sessionID != PAL::SessionID::defaultSessionID()) {
     105        ASSERT(nonDefaultDataStores().get(m_sessionID) == this);
     106        nonDefaultDataStores().remove(m_sessionID);
     107    }
     108
    87109    platformDestroy();
    88110
    … …  
    91113            processPool->sendToNetworkingProcess(Messages::NetworkProcess::DestroySession(m_sessionID));
    92114    }
     115}
     116
     117WebsiteDataStore* WebsiteDataStore::existingNonDefaultDataStoreForSessionID(PAL::SessionID sessionID)
     118{
     119    return nonDefaultDataStores().get(sessionID);
    93120}
    94121
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h

    r225877 r225935  
    9292    virtual ~WebsiteDataStore();
    9393
     94    static WebsiteDataStore* existingNonDefaultDataStoreForSessionID(PAL::SessionID);
     95
    9496    bool isPersistent() const { return !m_sessionID.isEphemeral(); }
    9597    PAL::SessionID sessionID() const { return m_sessionID; }
  • trunk/Tools/ChangeLog

    r225931 r225935  
     12017-12-14  Brady Eidson  <beidson@apple.com>
     2
     3        REGRESSION (r225789): API tests WKProcessPool.InitialWarmedProcessUsed and WebKit.WebsiteDataStoreCustomPaths are failing.
     4        https://bugs.webkit.org/show_bug.cgi?id=180722
     5
     6        Reviewed by Chris Dumez.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm:
     9        (TEST):
     10
    1112017-12-14  Alex Christensen  <achristensen@webkit.org>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm

    r225877 r225935  
    4949    [webView _test_waitForDidFinishNavigation];
    5050
    51     EXPECT_EQ([pool _webProcessCount], static_cast<size_t>(1));
     51    EXPECT_EQ([pool _webPageContentProcessCount], static_cast<size_t>(1));
    5252}
    5353
Note: See TracChangeset for help on using the changeset viewer.