Changeset 250351 in webkit


Ignore:
Timestamp:
Sep 25, 2019 12:16:36 PM (5 years ago)
Author:
achristensen@apple.com
Message:

Replace WebsiteDataStoreParameters::privateSessionParameters with re-initializing all sessions immediately upon NetworkProcess resumption
https://bugs.webkit.org/show_bug.cgi?id=202211

Reviewed by Tim Horton.

Source/WebKit:

Re-adding an ephemeral session after a NetworkProcess crash based on guessing that all its parameters are empty was added in r227590 with a test.
That test passes even when that re-adding code is removed because we re-add all sessions with parameters from the UIProcess when we restart a NetworkProcess.
I move the addition of non-default sessions to the initialization message instead of messages after the initialization message to remove race conditions that
might cause loads to happen before the NetworkProcess has received its second message from the UIProcess. I also add a unit test to verify that session
resumption also works with non-default persistent WebsiteDataStores.

  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::initializeNetworkProcess):

  • NetworkProcess/NetworkProcessCreationParameters.cpp:

(WebKit::NetworkProcessCreationParameters::encode const):
(WebKit::NetworkProcessCreationParameters::decode):

  • NetworkProcess/NetworkProcessCreationParameters.h:
  • NetworkProcess/NetworkResourceLoader.cpp:

(WebKit::NetworkResourceLoader::startNetworkLoad):

  • NetworkProcess/NetworkSessionCreationParameters.cpp:

(WebKit::NetworkSessionCreationParameters::privateSessionParameters): Deleted.

  • NetworkProcess/NetworkSessionCreationParameters.h:
  • Shared/WebsiteDataStoreParameters.cpp:

(WebKit::WebsiteDataStoreParameters::privateSessionParameters): Deleted.

  • Shared/WebsiteDataStoreParameters.h:

(WebKit::WebsiteDataStoreParameters::legacyPrivateSessionParameters): Deleted.

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::ensureNetworkProcess):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/NetworkProcessCrashNonPersistentDataStore.mm:

(checkRecoveryAfterCrash):
(TEST):

Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r250349 r250351  
     12019-09-25  Alex Christensen  <achristensen@webkit.org>
     2
     3        Replace WebsiteDataStoreParameters::privateSessionParameters with re-initializing all sessions immediately upon NetworkProcess resumption
     4        https://bugs.webkit.org/show_bug.cgi?id=202211
     5
     6        Reviewed by Tim Horton.
     7
     8        Re-adding an ephemeral session after a NetworkProcess crash based on guessing that all its parameters are empty was added in r227590 with a test.
     9        That test passes even when that re-adding code is removed because we re-add all sessions with parameters from the UIProcess when we restart a NetworkProcess.
     10        I move the addition of non-default sessions to the initialization message instead of messages after the initialization message to remove race conditions that
     11        might cause loads to happen before the NetworkProcess has received its second message from the UIProcess.  I also add a unit test to verify that session
     12        resumption also works with non-default persistent WebsiteDataStores.
     13
     14        * NetworkProcess/NetworkProcess.cpp:
     15        (WebKit::NetworkProcess::initializeNetworkProcess):
     16        * NetworkProcess/NetworkProcessCreationParameters.cpp:
     17        (WebKit::NetworkProcessCreationParameters::encode const):
     18        (WebKit::NetworkProcessCreationParameters::decode):
     19        * NetworkProcess/NetworkProcessCreationParameters.h:
     20        * NetworkProcess/NetworkResourceLoader.cpp:
     21        (WebKit::NetworkResourceLoader::startNetworkLoad):
     22        * NetworkProcess/NetworkSessionCreationParameters.cpp:
     23        (WebKit::NetworkSessionCreationParameters::privateSessionParameters): Deleted.
     24        * NetworkProcess/NetworkSessionCreationParameters.h:
     25        * Shared/WebsiteDataStoreParameters.cpp:
     26        (WebKit::WebsiteDataStoreParameters::privateSessionParameters): Deleted.
     27        * Shared/WebsiteDataStoreParameters.h:
     28        (WebKit::WebsiteDataStoreParameters::legacyPrivateSessionParameters): Deleted.
     29        * UIProcess/WebProcessPool.cpp:
     30        (WebKit::WebProcessPool::ensureNetworkProcess):
     31
    1322019-09-25  Alex Christensen  <achristensen@webkit.org>
    233
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r250346 r250351  
    323323    auto sessionID = parameters.defaultDataStoreParameters.networkSessionParameters.sessionID;
    324324    setSession(sessionID, NetworkSession::create(*this, WTFMove(parameters.defaultDataStoreParameters.networkSessionParameters)));
     325    for (auto&& parameters : WTFMove(parameters.nonDefaultDataStoreParameters))
     326        addWebsiteDataStore(WTFMove(parameters));
    325327
    326328#if ENABLE(INDEXED_DATABASE)
  • trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp

    r250143 r250351  
    6767#endif
    6868    encoder << defaultDataStoreParameters;
     69    encoder << nonDefaultDataStoreParameters;
    6970#if USE(SOUP)
    7071    encoder.encodeEnum(cookieAcceptPolicy);
     
    156157    result.defaultDataStoreParameters = WTFMove(*defaultDataStoreParameters);
    157158
     159    Optional<Vector<WebsiteDataStoreParameters>> nonDefaultDataStoreParameters;
     160    decoder >> nonDefaultDataStoreParameters;
     161    if (!nonDefaultDataStoreParameters)
     162        return false;
     163    result.nonDefaultDataStoreParameters = WTFMove(*nonDefaultDataStoreParameters);
     164   
    158165#if USE(SOUP)
    159166    if (!decoder.decodeEnum(result.cookieAcceptPolicy))
  • trunk/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h

    r250143 r250351  
    8383
    8484    WebsiteDataStoreParameters defaultDataStoreParameters;
     85    Vector<WebsiteDataStoreParameters> nonDefaultDataStoreParameters;
    8586   
    8687#if USE(SOUP)
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

    r250053 r250351  
    303303
    304304    auto* networkSession = m_connection->networkSession();
    305     if (!networkSession && sessionID().isEphemeral()) {
    306         m_connection->networkProcess().addWebsiteDataStore(WebsiteDataStoreParameters::privateSessionParameters(sessionID()));
    307         networkSession = m_connection->networkProcess().networkSession(sessionID());
    308     }
    309305    if (!networkSession) {
    310306        WTFLogAlways("Attempted to create a NetworkLoad with a session (id=%" PRIu64 ") that does not exist.", sessionID().toUInt64());
  • trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.cpp

    r250349 r250351  
    3939namespace WebKit {
    4040
    41 NetworkSessionCreationParameters NetworkSessionCreationParameters::privateSessionParameters(const PAL::SessionID& sessionID)
    42 {
    43     return {
    44         sessionID
    45         , { }
    46         , AllowsCellularAccess::Yes
    47 #if PLATFORM(COCOA)
    48         , { }
    49         , { }
    50         , { }
    51         , false
    52         , { }
    53         , { }
    54         , { }
    55         , false
    56 #endif
    57 #if USE(SOUP)
    58         , { }
    59         , SoupCookiePersistentStorageType::Text
    60 #endif
    61 #if USE(CURL)
    62         , { }
    63         , { }
    64 #endif
    65         , { }
    66         , { }
    67         , false
    68         , false
    69         , { }
    70         , { }
    71         , { }
    72         , { }
    73         , { }
    74         , { }
    75         , { }
    76         , { }
    77         , { }
    78     };
    79 }
    80 
    8141void NetworkSessionCreationParameters::encode(IPC::Encoder& encoder) const
    8242{
  • trunk/Source/WebKit/NetworkProcess/NetworkSessionCreationParameters.h

    r250349 r250351  
    5858    void encode(IPC::Encoder&) const;
    5959    static Optional<NetworkSessionCreationParameters> decode(IPC::Decoder&);
    60     static NetworkSessionCreationParameters privateSessionParameters(const PAL::SessionID&);
    6160   
    6261    PAL::SessionID sessionID { PAL::SessionID::defaultSessionID() };
  • trunk/Source/WebKit/Shared/WebsiteDataStoreParameters.cpp

    r248734 r250351  
    151151}
    152152
    153 WebsiteDataStoreParameters WebsiteDataStoreParameters::privateSessionParameters(PAL::SessionID sessionID)
    154 {
    155     ASSERT(sessionID.isEphemeral());
    156     return { { }, { }, { }, NetworkSessionCreationParameters::privateSessionParameters(sessionID)
    157 #if ENABLE(INDEXED_DATABASE)
    158         , { }, { }
    159 #if PLATFORM(IOS_FAMILY)
    160         , { }
    161 #endif
    162 #endif
    163 #if ENABLE(SERVICE_WORKER)
    164         , { }, { }
    165 #endif
    166         , { }, { }
    167     };
    168 }
    169 
    170153} // namespace WebKit
  • trunk/Source/WebKit/Shared/WebsiteDataStoreParameters.h

    r248734 r250351  
    4747    ~WebsiteDataStoreParameters();
    4848
    49     static WebsiteDataStoreParameters legacyPrivateSessionParameters() { return privateSessionParameters(PAL::SessionID::legacyPrivateSessionID()); }
    50     static WebsiteDataStoreParameters privateSessionParameters(PAL::SessionID);
    51 
    5249    void encode(IPC::Encoder&) const;
    5350    static Optional<WebsiteDataStoreParameters> decode(IPC::Decoder&);
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r250329 r250351  
    634634    platformInitializeNetworkProcess(parameters);
    635635
     636    // Make sure the network process knows about all the sessions that have been registered before it started.
     637    for (auto& sessionID : m_sessionToPageIDsMap.keys()) {
     638        if (auto* websiteDataStore = WebsiteDataStore::existingNonDefaultDataStoreForSessionID(sessionID))
     639            parameters.nonDefaultDataStoreParameters.append(websiteDataStore->parameters());
     640    }
     641
    636642    // Initialize the network process.
    637643    networkProcess->send(Messages::NetworkProcess::InitializeNetworkProcess(parameters), 0);
     
    649655        networkProcess->addSession(makeRef(*withWebsiteDataStore));
    650656        withWebsiteDataStore->clearPendingCookies();
    651     }
    652 
    653     // Make sure the network process knows about all the sessions that have been registered before it started.
    654     for (auto& sessionID : m_sessionToPageIDsMap.keys()) {
    655         if (auto* websiteDataStore = WebsiteDataStore::existingNonDefaultDataStoreForSessionID(sessionID))
    656             networkProcess->addSession(*websiteDataStore);
    657657    }
    658658
  • trunk/Tools/ChangeLog

    r250350 r250351  
     12019-09-25  Alex Christensen  <achristensen@webkit.org>
     2
     3        Replace WebsiteDataStoreParameters::privateSessionParameters with re-initializing all sessions immediately upon NetworkProcess resumption
     4        https://bugs.webkit.org/show_bug.cgi?id=202211
     5
     6        Reviewed by Tim Horton.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/NetworkProcessCrashNonPersistentDataStore.mm:
     9        (checkRecoveryAfterCrash):
     10        (TEST):
     11
    1122019-09-25  Aakash Jain  <aakash_jain@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NetworkProcessCrashNonPersistentDataStore.mm

    r242339 r250351  
    3030#import "TestWKWebView.h"
    3131#import <WebKit/WKProcessPoolPrivate.h>
     32#import <WebKit/WKWebsiteDataStorePrivate.h>
     33#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
    3234#import <wtf/RetainPtr.h>
    3335
     
    5658@end
    5759
    58 TEST(WebKit, NetworkProcessCrashNonPersistentDataStore)
     60static void checkRecoveryAfterCrash(WKWebsiteDataStore *dataStore)
    5961{
    6062    NSURL *simple = [[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
     
    6264   
    6365    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    64     [configuration setWebsiteDataStore:[WKWebsiteDataStore nonPersistentDataStore]];
     66    [configuration setWebsiteDataStore:dataStore];
    6567    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
    6668    auto delegate = adoptNS([[CrashDelegate alloc] init]);
     
    7577    TestWebKitAPI::Util::run(&done);
    7678}
     79
     80TEST(WebKit, NetworkProcessCrashNonPersistentDataStore)
     81{
     82    checkRecoveryAfterCrash([WKWebsiteDataStore nonPersistentDataStore]);
     83}
     84
     85TEST(WebKit, NetworkProcessCrashNonDefaultPersistentDataStore)
     86{
     87    checkRecoveryAfterCrash([[[WKWebsiteDataStore alloc] _initWithConfiguration:[[[_WKWebsiteDataStoreConfiguration alloc] init] autorelease]] autorelease]);
     88}
Note: See TracChangeset for help on using the changeset viewer.