Changeset 243711 in webkit


Ignore:
Timestamp:
Apr 1, 2019 1:52:36 PM (5 years ago)
Author:
Chris Dumez
Message:

UIProcess crash when a prewarmed process is terminated
https://bugs.webkit.org/show_bug.cgi?id=196451
<rdar://problem/49245471>

Reviewed by Geoffrey Garen.

Source/WebKit:

Stop assuming that WebProcessProxy::m_websiteDataStore is non-null as this is no longer
true after r243384. For example, prewarmed WebContent processe do not get a data store
until they actually get used.

  • UIProcess/API/Cocoa/WKProcessPool.mm:

(-[WKProcessPool _prewarmedProcessIdentifier]):

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

(WebKit::WebProcessPool::networkProcessIdentifier):
(WebKit::WebProcessPool::prewarmedProcessIdentifier):

  • UIProcess/WebProcessPool.h:
  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::didClose):
(WebKit::WebProcessProxy::didFinishLaunching):
(WebKit::WebProcessProxy::requestTermination):
(WebKit::WebProcessProxy::isReleaseLoggingAllowed const):

  • UIProcess/WebProcessProxy.h:

Tools:

Add API test coverage.

  • TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm:

(TEST):

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r243708 r243711  
     12019-04-01  Chris Dumez  <cdumez@apple.com>
     2
     3        UIProcess crash when a prewarmed process is terminated
     4        https://bugs.webkit.org/show_bug.cgi?id=196451
     5        <rdar://problem/49245471>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Stop assuming that WebProcessProxy::m_websiteDataStore is non-null as this is no longer
     10        true after r243384. For example, prewarmed WebContent processe do not get a data store
     11        until they actually get used.
     12
     13        * UIProcess/API/Cocoa/WKProcessPool.mm:
     14        (-[WKProcessPool _prewarmedProcessIdentifier]):
     15        * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
     16        * UIProcess/WebProcessPool.cpp:
     17        (WebKit::WebProcessPool::networkProcessIdentifier):
     18        (WebKit::WebProcessPool::prewarmedProcessIdentifier):
     19        * UIProcess/WebProcessPool.h:
     20        * UIProcess/WebProcessProxy.cpp:
     21        (WebKit::WebProcessProxy::didClose):
     22        (WebKit::WebProcessProxy::didFinishLaunching):
     23        (WebKit::WebProcessProxy::requestTermination):
     24        (WebKit::WebProcessProxy::isReleaseLoggingAllowed const):
     25        * UIProcess/WebProcessProxy.h:
     26
    1272019-04-01  Patrick Griffis  <pgriffis@igalia.com>
    228
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

    r243384 r243711  
    441441}
    442442
     443- (pid_t)_prewarmedProcessIdentifier
     444{
     445    return _processPool->prewarmedProcessIdentifier();
     446}
     447
     448
    443449- (void)_syncNetworkProcessCookies
    444450{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h

    r243376 r243711  
    9090// Test only.
    9191- (pid_t)_networkProcessIdentifier WK_API_AVAILABLE(macos(10.13), ios(11.0));
     92- (pid_t)_prewarmedProcessIdentifier WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    9293
    9394// Test only.
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r243562 r243711  
    14411441ProcessID WebProcessPool::networkProcessIdentifier()
    14421442{
    1443     if (!m_networkProcess)
    1444         return 0;
    1445 
    1446     return m_networkProcess->processIdentifier();
     1443    return m_networkProcess ? m_networkProcess->processIdentifier() : 0;
     1444}
     1445
     1446ProcessID WebProcessPool::prewarmedProcessIdentifier()
     1447{
     1448    return m_prewarmedProcess ? m_prewarmedProcess->processIdentifier() : 0;
    14471449}
    14481450
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r243384 r243711  
    233233
    234234    ProcessID networkProcessIdentifier();
     235    ProcessID prewarmedProcessIdentifier();
    235236    void activePagesOriginsInWebProcessForTesting(ProcessID, CompletionHandler<void(Vector<String>&&)>&&);
    236237    bool networkProcessHasEntitlementForTesting(const String&);
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r243388 r243711  
    649649void WebProcessProxy::didClose(IPC::Connection&)
    650650{
    651     RELEASE_LOG_IF(m_websiteDataStore->sessionID().isAlwaysOnLoggingAllowed(), Process, "%p - WebProcessProxy didClose (web process crash)", this);
     651    RELEASE_LOG_IF(isReleaseLoggingAllowed(), Process, "%p - WebProcessProxy didClose (web process crash)", this);
    652652    processDidTerminateOrFailedToLaunch();
    653653}
     
    758758
    759759    if (!IPC::Connection::identifierIsValid(connectionIdentifier)) {
    760         RELEASE_LOG_IF(m_websiteDataStore->sessionID().isAlwaysOnLoggingAllowed(), Process, "%p - WebProcessProxy didFinishLaunching - invalid connection identifier (web process failed to launch)", this);
     760        RELEASE_LOG_IF(isReleaseLoggingAllowed(), Process, "%p - WebProcessProxy didFinishLaunching - invalid connection identifier (web process failed to launch)", this);
    761761        processDidTerminateOrFailedToLaunch();
    762762        return;
     
    985985
    986986    auto protectedThis = makeRef(*this);
    987     RELEASE_LOG_IF(m_websiteDataStore->sessionID().isAlwaysOnLoggingAllowed(), Process, "%p - WebProcessProxy::requestTermination - reason %d", this, reason);
     987    RELEASE_LOG_IF(isReleaseLoggingAllowed(), Process, "%p - WebProcessProxy::requestTermination - reason %d", this, reason);
    988988
    989989    AuxiliaryProcessProxy::terminate();
     
    998998    for (auto& page : pages)
    999999        page->processDidTerminate(reason);
     1000}
     1001
     1002bool WebProcessProxy::isReleaseLoggingAllowed() const
     1003{
     1004    return !m_websiteDataStore || m_websiteDataStore->sessionID().isAlwaysOnLoggingAllowed();
    10001005}
    10011006
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.h

    r243630 r243711  
    359359    void processDidTerminateOrFailedToLaunch();
    360360
     361    bool isReleaseLoggingAllowed() const;
     362
    361363    // IPC::Connection::Client
    362364    friend class WebConnectionToWebProcess;
  • trunk/Tools/ChangeLog

    r243707 r243711  
     12019-04-01  Chris Dumez  <cdumez@apple.com>
     2
     3        UIProcess crash when a prewarmed process is terminated
     4        https://bugs.webkit.org/show_bug.cgi?id=196451
     5        <rdar://problem/49245471>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Add API test coverage.
     10
     11        * TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm:
     12        (TEST):
     13
    1142019-04-01  Aakash Jain  <aakash_jain@apple.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm

    r243384 r243711  
    121121    EXPECT_EQ(2U, [pool _webPageContentProcessCount]);
    122122}
     123
     124TEST(WKProcessPool, PrewarmedProcessCrash)
     125{
     126    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     127    processPoolConfiguration.get().prewarmsProcessesAutomatically = NO;
     128
     129    auto pool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     130    [pool _warmInitialProcess];
     131
     132    EXPECT_TRUE([pool _hasPrewarmedWebProcess]);
     133    EXPECT_EQ(1U, [pool _webPageContentProcessCount]);
     134
     135    // Wait for prewarmed process to finish launching.
     136    while (![pool _prewarmedProcessIdentifier])
     137        TestWebKitAPI::Util::sleep(0.01);
     138
     139    kill([pool _prewarmedProcessIdentifier], 9);
     140
     141    while ([pool _hasPrewarmedWebProcess])
     142        TestWebKitAPI::Util::sleep(0.01);
     143}
Note: See TracChangeset for help on using the changeset viewer.