Changeset 225864 in webkit


Ignore:
Timestamp:
Dec 13, 2017 12:20:18 PM (6 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): Call a new SPI to get the count of WebProcesses hosting WebPages.

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r225863 r225864  
     12017-12-13  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-13  Per Arne Vollan  <pvollan@apple.com>
    243
  • trunk/Source/WebKit/StorageProcess/StorageProcess.cpp

    r225711 r225864  
    112112
    113113    if (shouldRelaunch)
    114         createServerToContextConnection();
     114        createServerToContextConnection(std::nullopt);
    115115}
    116116
     
    428428}
    429429
    430 void StorageProcess::createServerToContextConnection()
     430void StorageProcess::createServerToContextConnection(std::optional<PAL::SessionID> sessionID)
    431431{
    432432    if (m_waitingForServerToContextProcessConnection)
     
    434434   
    435435    m_waitingForServerToContextProcessConnection = true;
    436     parentProcessConnection()->send(Messages::StorageProcessProxy::EstablishWorkerContextConnectionToStorageProcess(), 0);
     436    if (sessionID)
     437        parentProcessConnection()->send(Messages::StorageProcessProxy::EstablishWorkerContextConnectionToStorageProcessForExplicitSession(*sessionID), 0);
     438    else
     439        parentProcessConnection()->send(Messages::StorageProcessProxy::EstablishWorkerContextConnectionToStorageProcess(), 0);
    437440}
    438441
  • trunk/Source/WebKit/StorageProcess/StorageProcess.h

    r225622 r225864  
    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

    r225622 r225864  
    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

    r225622 r225864  
    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

    r225622 r225864  
    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

    r225289 r225864  
    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

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

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

    r225850 r225864  
    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::existingDataStoreForSessionID(*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

    r225850 r225864  
    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

    r225827 r225864  
    5656namespace WebKit {
    5757
     58static HashMap<PAL::SessionID, WebsiteDataStore*>& allDataStores()
     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    auto result = allDataStores().add(sessionID, this);
     82    ASSERT_UNUSED(result, result.isNewEntry);
     83
    7484    platformInitialize();
    7585}
     
    8090    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
    8191{
     92    auto result = allDataStores().add(sessionID, this);
     93    ASSERT_UNUSED(result, result.isNewEntry);
     94
    8295    platformInitialize();
    8396}
     
    8598WebsiteDataStore::~WebsiteDataStore()
    8699{
     100    ASSERT(allDataStores().get(m_sessionID) == this);
     101    allDataStores().remove(m_sessionID);
     102
    87103    platformDestroy();
    88104
     
    91107            processPool->sendToNetworkingProcess(Messages::NetworkProcess::DestroySession(m_sessionID));
    92108    }
     109}
     110
     111WebsiteDataStore* WebsiteDataStore::existingDataStoreForSessionID(PAL::SessionID sessionID)
     112{
     113    return allDataStores().get(sessionID);
    93114}
    94115
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h

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

    r225857 r225864  
     12017-12-13  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): Call a new SPI to get the count of WebProcesses hosting WebPages.
     10
    1112017-12-13  Mark Lam  <mark.lam@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm

    r215536 r225864  
    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.