Changeset 216977 in webkit


Ignore:
Timestamp:
May 17, 2017 9:51:46 AM (7 years ago)
Author:
achristensen@apple.com
Message:

Interacting with WKHTTPCookieStores before creating WKWebViews and WKProcessPools should affect cookies used
https://bugs.webkit.org/show_bug.cgi?id=171987

Reviewed by Brady Eidson.

Source/WebCore:

Covered by new API tests.

  • CMakeLists.txt:
  • platform/Cookie.h:

(WebCore::Cookie::Cookie):
(WebCore::Cookie::isNull):
(WebCore::CookieHash::hash):
(WebCore::CookieHash::equal):
(WTF::HashTraits<WebCore::Cookie>::emptyValue):
(WTF::HashTraits<WebCore::Cookie>::constructDeletedValue):
(WTF::HashTraits<WebCore::Cookie>::isDeletedValue):

  • platform/network/Cookie.cpp: Added.

(WebCore::Cookie::operator==):
(WebCore::Cookie::hash):

  • platform/network/cocoa/CookieCocoa.mm:

(WebCore::Cookie::operator NSHTTPCookie *):
(WebCore::Cookie::operator==):
(WebCore::Cookie::hash):

  • platform/network/cocoa/NetworkStorageSessionCocoa.mm:

(WebCore::NetworkStorageSession::setCookies):
Use NSHTTPCookie's hash and equality comparison to more closely match the NSHTTPCookie behavior.

Source/WebKit2:

When putting cookies in a WKHTTPCookieStore that hasn't been associated with a WKProcessPool yet, there is no
NetworkProcess into which to put the cookies. In such a case, we should store these cookies in the WebsiteDataStore
until there is a NetworkProcess.

  • NetworkProcess/NetworkConnectionToWebProcess.cpp:

(WebKit::NetworkConnectionToWebProcess::ensureLegacyPrivateBrowsingSession):

  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::initializeNetworkProcess):
(WebKit::NetworkProcess::ensurePrivateBrowsingSession):

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • NetworkProcess/RemoteNetworkingContext.h:
  • NetworkProcess/mac/RemoteNetworkingContext.mm:

(WebKit::RemoteNetworkingContext::ensurePrivateBrowsingSession):
(WebKit::RemoteNetworkingContext::ensureWebsiteDataStoreSession):

  • Shared/WebsiteDataStoreParameters.cpp:

(WebKit::WebsiteDataStoreParameters::~WebsiteDataStoreParameters):
(WebKit::WebsiteDataStoreParameters::encode):
(WebKit::WebsiteDataStoreParameters::decode):
(WebKit::WebsiteDataStoreParameters::WebsiteDataStoreParameters): Deleted.

  • Shared/WebsiteDataStoreParameters.h:
  • UIProcess/API/APIHTTPCookieStore.cpp:

(API::HTTPCookieStore::cookies):
(API::HTTPCookieStore::setCookie):
(API::HTTPCookieStore::deleteCookie):

  • UIProcess/API/APIHTTPCookieStore.h:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::setAnyPageGroupMightHavePrivateBrowsingEnabled):
(WebKit::WebProcessPool::pageAddedToProcess):

  • UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:

(WebKit::WebsiteDataStore::parameters):

  • UIProcess/WebsiteData/WebsiteDataStore.cpp:

(WebKit::WebsiteDataStore::pendingCookies):
(WebKit::WebsiteDataStore::addPendingCookie):
(WebKit::WebsiteDataStore::removePendingCookie):

  • UIProcess/WebsiteData/WebsiteDataStore.h:

Tools:

  • TestWebKitAPI/Tests/WebKit2Cocoa/WKHTTPCookieStore.mm:

(-[CookieUIDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(TEST):

Location:
trunk
Files:
1 added
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r216967 r216977  
    24122412    platform/network/BlobResourceHandle.cpp
    24132413    platform/network/CacheValidation.cpp
     2414    platform/network/Cookie.cpp
    24142415    platform/network/CredentialBase.cpp
    24152416    platform/network/CredentialStorage.cpp
  • trunk/Source/WebCore/ChangeLog

    r216974 r216977  
     12017-05-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Interacting with WKHTTPCookieStores before creating WKWebViews and WKProcessPools should affect cookies used
     4        https://bugs.webkit.org/show_bug.cgi?id=171987
     5
     6        Reviewed by Brady Eidson.
     7
     8        Covered by new API tests.
     9
     10        * CMakeLists.txt:
     11        * platform/Cookie.h:
     12        (WebCore::Cookie::Cookie):
     13        (WebCore::Cookie::isNull):
     14        (WebCore::CookieHash::hash):
     15        (WebCore::CookieHash::equal):
     16        (WTF::HashTraits<WebCore::Cookie>::emptyValue):
     17        (WTF::HashTraits<WebCore::Cookie>::constructDeletedValue):
     18        (WTF::HashTraits<WebCore::Cookie>::isDeletedValue):
     19        * platform/network/Cookie.cpp: Added.
     20        (WebCore::Cookie::operator==):
     21        (WebCore::Cookie::hash):
     22        * platform/network/cocoa/CookieCocoa.mm:
     23        (WebCore::Cookie::operator NSHTTPCookie *):
     24        (WebCore::Cookie::operator==):
     25        (WebCore::Cookie::hash):
     26        * platform/network/cocoa/NetworkStorageSessionCocoa.mm:
     27        (WebCore::NetworkStorageSession::setCookies):
     28        Use NSHTTPCookie's hash and equality comparison to more closely match the NSHTTPCookie behavior.
     29
    1302017-05-17  Emilio Cobos Álvarez  <ecobos@igalia.com>
    231
  • trunk/Source/WebCore/platform/Cookie.h

    r213877 r216977  
    11/*
    22 * Copyright (C) 2009 Joseph Pecoraro. All rights reserved.
     3 * Copyright (C) 2017 Apple Inc. All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    3839struct Cookie {
    3940    Cookie() { }
     41   
     42    Cookie(WTF::HashTableDeletedValueType)
     43        : name(WTF::HashTableDeletedValue)
     44    { }
    4045
    4146    Cookie(const String& name, const String& value, const String& domain, const String& path, double expires, bool httpOnly, bool secure, bool session, const String& comment, const URL& commentURL, const Vector<uint16_t> ports)
     
    5762    template<class Decoder> static bool decode(Decoder&, Cookie&);
    5863
     64    WEBCORE_EXPORT bool operator==(const Cookie&) const;
     65    WEBCORE_EXPORT unsigned hash() const;
     66
    5967#ifdef __OBJC__
    6068    WEBCORE_EXPORT Cookie(NSHTTPCookie *);
     
    6270#endif
    6371
     72    bool isNull() const
     73    {
     74        return name.isNull()
     75        && value.isNull()
     76        && domain.isNull()
     77        && path.isNull()
     78        && expires == 0
     79        && !httpOnly
     80        && !secure
     81        && !session
     82        && comment.isNull()
     83        && commentURL.isNull();
     84    }
     85   
    6486    String name;
    6587    String value;
     
    6789    String path;
    6890    // Expiration date, expressed as milliseconds since the UNIX epoch.
    69     double expires;
    70     bool httpOnly;
    71     bool secure;
    72     bool session;
     91    double expires { 0 };
     92    bool httpOnly { false };
     93    bool secure { false };
     94    bool session { false };
    7395    String comment;
    7496    URL commentURL;
    7597    Vector<uint16_t> ports;
    76 
    7798};
    7899
    79100struct CookieHash {
    80101    static unsigned hash(const Cookie& key)
    81     { 
    82         return StringHash::hash(key.name) + StringHash::hash(key.domain) + StringHash::hash(key.path) + key.secure;
     102    {
     103        return key.hash();
    83104    }
    84105
    85106    static bool equal(const Cookie& a, const Cookie& b)
    86107    {
    87         return a.name == b.name && a.domain == b.domain && a.path == b.path && a.secure == b.secure;
     108        return a == b;
    88109    }
     110    static const bool safeToCompareToEmptyOrDeleted = false;
    89111};
    90112
     
    131153        typedef WebCore::CookieHash Hash;
    132154    };
     155    template<> struct HashTraits<WebCore::Cookie> : GenericHashTraits<WebCore::Cookie> {
     156        static WebCore::Cookie emptyValue() { return { }; }
     157        static void constructDeletedValue(WebCore::Cookie& slot) { slot = WebCore::Cookie(WTF::HashTableDeletedValue); }
     158        static bool isDeletedValue(const WebCore::Cookie& slot) { return slot.name.isHashTableDeletedValue(); }
     159    };
    133160}
  • trunk/Source/WebCore/platform/network/cocoa/CookieCocoa.mm

    r216292 r216977  
    6565Cookie::operator NSHTTPCookie *() const
    6666{
     67    if (isNull())
     68        return nil;
     69
    6770    // FIXME: existing APIs do not provide a way to set httpOnly without parsing headers from scratch.
    6871
     
    106109    return [NSHTTPCookie cookieWithProperties:properties];
    107110}
     111   
     112bool Cookie::operator==(const Cookie& other) const
     113{
     114    ASSERT(!name.isHashTableDeletedValue());
     115    bool thisNull = isNull();
     116    bool otherNull = other.isNull();
     117    if (thisNull || otherNull)
     118        return thisNull == otherNull;
     119   
     120    NSHTTPCookie *nsCookie(*this);
     121    return [nsCookie isEqual:other];
     122}
     123   
     124unsigned Cookie::hash() const
     125{
     126    ASSERT(!name.isHashTableDeletedValue());
     127    ASSERT(!isNull());
     128    NSHTTPCookie *nsCookie(*this);
     129    return nsCookie.hash;
     130}
    108131
    109132} // namespace WebCore
  • trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm

    r214127 r216977  
    4444{
    4545    RetainPtr<NSMutableArray> nsCookies = adoptNS([[NSMutableArray alloc] initWithCapacity:cookies.size()]);
    46     for (auto cookie : cookies)
     46    for (const auto& cookie : cookies)
    4747        [nsCookies addObject:(NSHTTPCookie *)cookie];
    4848
  • trunk/Source/WebKit2/ChangeLog

    r216974 r216977  
     12017-05-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Interacting with WKHTTPCookieStores before creating WKWebViews and WKProcessPools should affect cookies used
     4        https://bugs.webkit.org/show_bug.cgi?id=171987
     5
     6        Reviewed by Brady Eidson.
     7
     8        When putting cookies in a WKHTTPCookieStore that hasn't been associated with a WKProcessPool yet, there is no
     9        NetworkProcess into which to put the cookies.  In such a case, we should store these cookies in the WebsiteDataStore
     10        until there is a NetworkProcess.
     11
     12        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     13        (WebKit::NetworkConnectionToWebProcess::ensureLegacyPrivateBrowsingSession):
     14        * NetworkProcess/NetworkProcess.cpp:
     15        (WebKit::NetworkProcess::initializeNetworkProcess):
     16        (WebKit::NetworkProcess::ensurePrivateBrowsingSession):
     17        * NetworkProcess/NetworkProcess.h:
     18        * NetworkProcess/NetworkProcess.messages.in:
     19        * NetworkProcess/RemoteNetworkingContext.h:
     20        * NetworkProcess/mac/RemoteNetworkingContext.mm:
     21        (WebKit::RemoteNetworkingContext::ensurePrivateBrowsingSession):
     22        (WebKit::RemoteNetworkingContext::ensureWebsiteDataStoreSession):
     23        * Shared/WebsiteDataStoreParameters.cpp:
     24        (WebKit::WebsiteDataStoreParameters::~WebsiteDataStoreParameters):
     25        (WebKit::WebsiteDataStoreParameters::encode):
     26        (WebKit::WebsiteDataStoreParameters::decode):
     27        (WebKit::WebsiteDataStoreParameters::WebsiteDataStoreParameters): Deleted.
     28        * Shared/WebsiteDataStoreParameters.h:
     29        * UIProcess/API/APIHTTPCookieStore.cpp:
     30        (API::HTTPCookieStore::cookies):
     31        (API::HTTPCookieStore::setCookie):
     32        (API::HTTPCookieStore::deleteCookie):
     33        * UIProcess/API/APIHTTPCookieStore.h:
     34        * UIProcess/WebProcessPool.cpp:
     35        (WebKit::WebProcessPool::setAnyPageGroupMightHavePrivateBrowsingEnabled):
     36        (WebKit::WebProcessPool::pageAddedToProcess):
     37        * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
     38        (WebKit::WebsiteDataStore::parameters):
     39        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     40        (WebKit::WebsiteDataStore::pendingCookies):
     41        (WebKit::WebsiteDataStore::addPendingCookie):
     42        (WebKit::WebsiteDataStore::removePendingCookie):
     43        * UIProcess/WebsiteData/WebsiteDataStore.h:
     44
    1452017-05-17  Emilio Cobos Álvarez  <ecobos@igalia.com>
    246
  • trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r215941 r216977  
    4646#include "SessionTracker.h"
    4747#include "WebCoreArgumentCoders.h"
     48#include "WebsiteDataStoreParameters.h"
    4849#include <WebCore/NetworkStorageSession.h>
    4950#include <WebCore/PingHandle.h>
     
    400401void NetworkConnectionToWebProcess::ensureLegacyPrivateBrowsingSession()
    401402{
    402     NetworkProcess::singleton().ensurePrivateBrowsingSession(SessionID::legacyPrivateSessionID());
     403    NetworkProcess::singleton().ensurePrivateBrowsingSession({SessionID::legacyPrivateSessionID(), { }, { }, { }});
    403404}
    404405
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp

    r216903 r216977  
    5050#include "WebsiteData.h"
    5151#include "WebsiteDataFetchOption.h"
     52#include "WebsiteDataStoreParameters.h"
    5253#include "WebsiteDataType.h"
    5354#include <WebCore/DNS.h>
     
    237238    // FIXME: instead of handling this here, a message should be sent later (scales to multiple sessions)
    238239    if (parameters.privateBrowsingEnabled)
    239         RemoteNetworkingContext::ensurePrivateBrowsingSession(SessionID::legacyPrivateSessionID());
     240        RemoteNetworkingContext::ensurePrivateBrowsingSession({SessionID::legacyPrivateSessionID(), { }, { }, { }});
    240241
    241242    if (parameters.shouldUseTestingNetworkSession)
     
    288289}
    289290
    290 void NetworkProcess::ensurePrivateBrowsingSession(SessionID sessionID)
    291 {
    292     RemoteNetworkingContext::ensurePrivateBrowsingSession(sessionID);
     291void NetworkProcess::ensurePrivateBrowsingSession(WebsiteDataStoreParameters&& parameters)
     292{
     293    RemoteNetworkingContext::ensurePrivateBrowsingSession(WTFMove(parameters));
    293294}
    294295
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h

    r215991 r216977  
    114114    void prefetchDNS(const String&);
    115115
    116     void ensurePrivateBrowsingSession(WebCore::SessionID);
     116    void ensurePrivateBrowsingSession(WebsiteDataStoreParameters&&);
    117117
    118118    void grantSandboxExtensionsToDatabaseProcessForBlobs(const Vector<String>& filenames, Function<void ()>&& completionHandler);
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in

    r215991 r216977  
    3636    ClearCachedCredentials()
    3737
    38     EnsurePrivateBrowsingSession(WebCore::SessionID sessionID)
     38    EnsurePrivateBrowsingSession(struct WebKit::WebsiteDataStoreParameters websiteDataStoreParameters)
    3939    AddWebsiteDataStore(struct WebKit::WebsiteDataStoreParameters websiteDataStoreParameters);
    4040    DestroySession(WebCore::SessionID sessionID)
  • trunk/Source/WebKit2/NetworkProcess/RemoteNetworkingContext.h

    r215941 r216977  
    4444
    4545    // FIXME: Remove platform-specific code and use SessionTracker.
    46     static void ensurePrivateBrowsingSession(WebCore::SessionID);
     46    static void ensurePrivateBrowsingSession(WebsiteDataStoreParameters&&);
    4747    static void ensureWebsiteDataStoreSession(WebsiteDataStoreParameters&&);
    4848
  • trunk/Source/WebKit2/NetworkProcess/mac/RemoteNetworkingContext.mm

    r215991 r216977  
    8181}
    8282
    83 void RemoteNetworkingContext::ensurePrivateBrowsingSession(SessionID sessionID)
     83void RemoteNetworkingContext::ensurePrivateBrowsingSession(WebsiteDataStoreParameters&& parameters)
    8484{
    85     ASSERT(sessionID.isEphemeral());
     85    ASSERT(parameters.sessionID.isEphemeral());
    8686
    87     if (NetworkStorageSession::storageSession(sessionID))
     87    if (NetworkStorageSession::storageSession(parameters.sessionID))
    8888        return;
    8989
     
    9494        base = SessionTracker::getIdentifierBase();
    9595
    96     NetworkStorageSession::ensurePrivateBrowsingSession(sessionID, base + '.' + String::number(sessionID.sessionID()));
     96    NetworkStorageSession::ensurePrivateBrowsingSession(parameters.sessionID, base + '.' + String::number(parameters.sessionID.sessionID()));
     97
     98    auto* session = NetworkStorageSession::storageSession(parameters.sessionID);
     99    for (const auto& cookie : parameters.pendingCookies)
     100        session->setCookie(cookie);
    97101
    98102#if USE(NETWORK_SESSION)
    99     auto networkSession = NetworkSession::create(sessionID, NetworkProcess::singleton().supplement<LegacyCustomProtocolManager>());
    100     SessionTracker::setSession(sessionID, WTFMove(networkSession));
     103    auto networkSession = NetworkSession::create(parameters.sessionID, NetworkProcess::singleton().supplement<LegacyCustomProtocolManager>());
     104    SessionTracker::setSession(parameters.sessionID, WTFMove(networkSession));
    101105#endif
    102106}
     
    123127    NetworkStorageSession::ensureSession(parameters.sessionID, base + '.' + String::number(parameters.sessionID.sessionID()), WTFMove(uiProcessCookieStorage));
    124128
     129    auto* session = NetworkStorageSession::storageSession(parameters.sessionID);
     130    for (const auto& cookie : parameters.pendingCookies)
     131        session->setCookie(cookie);
     132
    125133#if USE(NETWORK_SESSION)
    126134    auto networkSession = NetworkSession::create(parameters.sessionID, NetworkProcess::singleton().supplement<LegacyCustomProtocolManager>());
  • trunk/Source/WebKit2/NetworkProcess/soup/RemoteNetworkingContextSoup.cpp

    r215941 r216977  
    4949}
    5050
    51 void RemoteNetworkingContext::ensurePrivateBrowsingSession(SessionID sessionID)
     51void RemoteNetworkingContext::ensurePrivateBrowsingSession(WebsiteDataStoreParameters&& parameters)
    5252{
    53     ASSERT(sessionID.isEphemeral());
     53    ASSERT(parameters.sessionID.isEphemeral());
    5454
    55     if (NetworkStorageSession::storageSession(sessionID))
     55    if (NetworkStorageSession::storageSession(parameters.sessionID))
    5656        return;
    5757
    58     NetworkStorageSession::ensurePrivateBrowsingSession(sessionID, String::number(sessionID.sessionID()));
    59     SessionTracker::setSession(sessionID, NetworkSession::create(sessionID));
     58    NetworkStorageSession::ensurePrivateBrowsingSession(parameters.sessionID, String::number(parameters.sessionID.sessionID()));
     59    SessionTracker::setSession(parameters.sessionID, NetworkSession::create(parameters.sessionID));
    6060}
    6161
  • trunk/Source/WebKit2/Shared/WebsiteDataStoreParameters.cpp

    r215991 r216977  
    3131namespace WebKit {
    3232
    33 
    34 WebsiteDataStoreParameters::WebsiteDataStoreParameters()
     33WebsiteDataStoreParameters::~WebsiteDataStoreParameters()
    3534{
    3635}
     
    4140    encoder << uiProcessCookieStorageIdentifier;
    4241    encoder << cookieStoragePathExtensionHandle;
     42    encoder << pendingCookies;
    4343}
    4444
     
    5454        return false;
    5555
     56    if (!decoder.decode(parameters.pendingCookies))
     57        return false;
     58
    5659    return true;
    5760}
  • trunk/Source/WebKit2/Shared/WebsiteDataStoreParameters.h

    r215991 r216977  
    2727
    2828#include "SandboxExtension.h"
     29#include <WebCore/Cookie.h>
    2930#include <WebCore/SessionID.h>
    3031#include <wtf/Vector.h>
     
    3940
    4041struct WebsiteDataStoreParameters {
    41     WebsiteDataStoreParameters();
    42 
     42    WebsiteDataStoreParameters() = default;
     43    WebsiteDataStoreParameters(WebsiteDataStoreParameters&&) = default;
     44    ~WebsiteDataStoreParameters();
     45   
    4346    void encode(IPC::Encoder&) const;
    4447    static bool decode(IPC::Decoder&, WebsiteDataStoreParameters&);
     
    4750    Vector<uint8_t> uiProcessCookieStorageIdentifier;
    4851    SandboxExtension::Handle cookieStoragePathExtensionHandle;
     52    Vector<WebCore::Cookie> pendingCookies;
    4953};
    5054
  • trunk/Source/WebKit2/UIProcess/API/APIHTTPCookieStore.cpp

    r214127 r216977  
    5858    auto* pool = dataStore.processPoolForCookieStorageOperations();
    5959    if (!pool) {
    60         // FIXME: This is not necessarily the right storage session, but it's currently
    61         // the best we can do in the absence of a process pool.
    62         auto allCookies = WebCore::NetworkStorageSession::defaultStorageSession().getAllCookies();
    63         callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies = WTFMove(allCookies)]() {
     60        callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies = dataStore.pendingCookies()]() {
    6461            completionHandler(allCookies);
    6562        });
    66 
    6763        return;
    6864    }
     
    7975    auto* pool = dataStore.processPoolForCookieStorageOperations();
    8076    if (!pool) {
    81         // FIXME: This is not necessarily the right storage session, but it's currently
    82         // the best we can do in the absence of a process pool.
    83         WebCore::NetworkStorageSession::defaultStorageSession().setCookie(cookie);
     77        dataStore.addPendingCookie(cookie);
    8478        callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
    8579            completionHandler();
    8680        });
    87 
    8881        return;
    8982    }
     
    10093    auto* pool = dataStore.processPoolForCookieStorageOperations();
    10194    if (!pool) {
    102         // FIXME: This is not necessarily the right storage session, but it's currently
    103         // the best we can do in the absence of a process pool.
    104         WebCore::NetworkStorageSession::defaultStorageSession().deleteCookie(cookie);
     95        dataStore.removePendingCookie(cookie);
    10596        callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
    10697            completionHandler();
    10798        });
    108 
    10999        return;
    110100    }
  • trunk/Source/WebKit2/UIProcess/API/APIHTTPCookieStore.h

    r214127 r216977  
    2828#include "APIObject.h"
    2929#include "HTTPCookieAcceptPolicy.h"
     30#include <WebCore/Cookie.h>
    3031#include <wtf/Function.h>
    3132#include <wtf/HashSet.h>
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp

    r216903 r216977  
    579579    if (networkProcess()) {
    580580        if (privateBrowsingEnabled)
    581             networkProcess()->send(Messages::NetworkProcess::EnsurePrivateBrowsingSession(SessionID::legacyPrivateSessionID()), 0);
     581            networkProcess()->send(Messages::NetworkProcess::EnsurePrivateBrowsingSession({SessionID::legacyPrivateSessionID(), { }, { }, { }}), 0);
    582582        else
    583583            networkProcess()->send(Messages::NetworkProcess::DestroySession(SessionID::legacyPrivateSessionID()), 0);
     
    946946    auto sessionID = page.sessionID();
    947947    if (sessionID.isEphemeral()) {
    948         sendToNetworkingProcess(Messages::NetworkProcess::EnsurePrivateBrowsingSession(sessionID));
     948        // FIXME: Merge NetworkProcess::EnsurePrivateBrowsingSession and NetworkProcess::AddWebsiteDataStore into one message type.
     949        // They do basically the same thing.
     950        sendToNetworkingProcess(Messages::NetworkProcess::EnsurePrivateBrowsingSession(page.websiteDataStore().parameters()));
    949951        page.process().send(Messages::WebProcess::EnsurePrivateBrowsingSession(sessionID), 0);
    950952    } else if (sessionID != SessionID::defaultSessionID()) {
  • trunk/Source/WebKit2/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm

    r215991 r216977  
    7171#endif
    7272
     73    copyToVector(m_pendingCookies, parameters.pendingCookies);
     74
    7375    if (!cookieFile.isEmpty())
    7476        SandboxExtension::createHandleForReadWriteDirectory(WebCore::directoryName(cookieFile), parameters.cookieStoragePathExtensionHandle);
  • trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r216841 r216977  
    12661266}
    12671267
     1268Vector<WebCore::Cookie> WebsiteDataStore::pendingCookies() const
     1269{
     1270    Vector<WebCore::Cookie> cookies;
     1271    copyToVector(m_pendingCookies, cookies);
     1272    return cookies;
     1273}
     1274
     1275void WebsiteDataStore::addPendingCookie(const WebCore::Cookie& cookie)
     1276{
     1277    m_pendingCookies.add(cookie);
     1278}
     1279
     1280void WebsiteDataStore::removePendingCookie(const WebCore::Cookie& cookie)
     1281{
     1282    m_pendingCookies.remove(cookie);
     1283}
     1284
    12681285#if !PLATFORM(COCOA)
    12691286WebsiteDataStoreParameters WebsiteDataStore::parameters()
  • trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h

    r215991 r216977  
    2727
    2828#include "WebProcessLifetimeObserver.h"
     29#include <WebCore/Cookie.h>
    2930#include <WebCore/SecurityOriginData.h>
    3031#include <WebCore/SecurityOriginHash.h>
     
    119120    DatabaseProcessCreationParameters databaseProcessParameters();
    120121
     122    Vector<WebCore::Cookie> pendingCookies() const;
     123    void addPendingCookie(const WebCore::Cookie&);
     124    void removePendingCookie(const WebCore::Cookie&);
     125
    121126private:
    122127    explicit WebsiteDataStore(WebCore::SessionID);
     
    161166    RetainPtr<CFHTTPCookieStorageRef> m_cfCookieStorage;
    162167#endif
     168    HashSet<WebCore::Cookie> m_pendingCookies;
    163169};
    164170
  • trunk/Tools/ChangeLog

    r216974 r216977  
     12017-05-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        Interacting with WKHTTPCookieStores before creating WKWebViews and WKProcessPools should affect cookies used
     4        https://bugs.webkit.org/show_bug.cgi?id=171987
     5
     6        Reviewed by Brady Eidson.
     7
     8        * TestWebKitAPI/Tests/WebKit2Cocoa/WKHTTPCookieStore.mm:
     9        (-[CookieUIDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
     10        (TEST):
     11
    1122017-05-17  Emilio Cobos Álvarez  <ecobos@igalia.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKHTTPCookieStore.mm

    r216292 r216977  
    168168}
    169169
     170static bool finished;
     171
     172@interface CookieUIDelegate : NSObject <WKUIDelegate>
     173@end
     174
     175@implementation CookieUIDelegate
     176- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
     177{
     178    EXPECT_STREQ("cookie:cookiename=cookievalue", message.UTF8String);
     179    finished = true;
     180    completionHandler();
     181}
     182@end
     183
     184TEST(WebKit2, WKHTTPCookieStoreWithoutProcessPool)
     185{
     186    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:[NSDictionary dictionaryWithObjectsAndKeys:@"127.0.0.1", NSHTTPCookieDomain, @"/", NSHTTPCookiePath, @"cookiename", NSHTTPCookieName, @"cookievalue", NSHTTPCookieValue, [NSDate distantFuture], NSHTTPCookieExpires, nil]];
     187    NSString *alertCookieHTML = @"<script>alert('cookie:'+document.cookie);</script>";
     188   
     189    finished = false;
     190    WKWebsiteDataStore *ephemeralStoreWithCookies = [WKWebsiteDataStore nonPersistentDataStore];
     191    [ephemeralStoreWithCookies.httpCookieStore setCookie:cookie completionHandler:^ {
     192        WKWebsiteDataStore *ephemeralStoreWithIndependentCookieStorage = [WKWebsiteDataStore nonPersistentDataStore];
     193        [ephemeralStoreWithIndependentCookieStorage.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
     194            ASSERT_EQ(cookies.count, 0u);
     195           
     196            WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
     197            configuration.websiteDataStore = ephemeralStoreWithCookies;
     198            WKWebView *view = [[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration];
     199            view.UIDelegate = [[CookieUIDelegate alloc] init];
     200
     201            [view loadHTMLString:alertCookieHTML baseURL:[NSURL URLWithString:@"http://127.0.0.1/"]];
     202        }];
     203    }];
     204    TestWebKitAPI::Util::run(&finished);
     205   
     206    finished = false;
     207    WKWebsiteDataStore *defaultStore = [WKWebsiteDataStore defaultDataStore];
     208    [defaultStore.httpCookieStore setCookie:cookie completionHandler:^ {
     209        [defaultStore.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
     210            ASSERT_EQ(cookies.count, 1u);
     211           
     212            WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
     213            configuration.websiteDataStore = defaultStore;
     214            WKWebView *view = [[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration];
     215            view.UIDelegate = [[CookieUIDelegate alloc] init];
     216           
     217            [view loadHTMLString:alertCookieHTML baseURL:[NSURL URLWithString:@"http://127.0.0.1/"]];
     218        }];
     219    }];
     220    TestWebKitAPI::Util::run(&finished);
     221   
     222    [defaultStore.httpCookieStore deleteCookie:cookie completionHandler:^ {
     223        [defaultStore.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
     224            ASSERT_EQ(cookies.count, 0u);
     225            finished = true;
     226        }];
     227    }];
     228    TestWebKitAPI::Util::run(&finished);
     229}
    170230#endif
Note: See TracChangeset for help on using the changeset viewer.