Changeset 184211 in webkit


Ignore:
Timestamp:
May 12, 2015, 12:37:31 PM (10 years ago)
Author:
ap@apple.com
Message:

[Mac] Share cookie storage between UI process and secondary processes
https://bugs.webkit.org/show_bug.cgi?id=144820
rdar://problem/20572830

Reviewed by Darin Adler.

Source/WebCore:

  • platform/network/mac/CookieJarMac.mm:
  • platform/spi/cf/CFNetworkSPI.h:

Moved SPIs into an SPI header, so that WebKit2 could use them too without duplication.

Source/WebKit2:

Pass a cookie storage descriptor that includes file path as well as other data that
CFNetwork needs to use the same cookies storage as in another process (session cookies
are still separate).

While at it, started to clean up code that passes cookie storage path. It was mostly
dead and unimplemented, only used in child processes when USE(SECCOMP_FILTERS) was enabled.

  • NetworkProcess/cocoa/NetworkProcessCocoa.mm:

(WebKit::NetworkProcess::platformInitializeNetworkProcessCocoa):

  • Shared/Network/NetworkProcessCreationParameters.cpp:

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

  • Shared/Network/NetworkProcessCreationParameters.h:
  • Shared/WebProcessCreationParameters.cpp:

(WebKit::WebProcessCreationParameters::encode):
(WebKit::WebProcessCreationParameters::decode):

  • Shared/WebProcessCreationParameters.h:
  • UIProcess/Cocoa/WebProcessPoolCocoa.mm:

(WebKit::WebProcessPool::platformInitializeWebProcess):
(WebKit::WebProcessPool::platformInitializeNetworkProcess):
(WebKit::WebProcessPool::platformDefaultCookieStorageDirectory): Deleted.

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::ensureNetworkProcess):
(WebKit::WebProcessPool::createNewWebProcess):
(WebKit::WebProcessPool::cookieStorageDirectory):

  • UIProcess/WebProcessPool.h:
  • UIProcess/efl/WebProcessPoolEfl.cpp:

(WebKit::WebProcessPool::platformDefaultCookieStorageDirectory): Deleted.

  • UIProcess/gtk/WebProcessPoolGtk.cpp:

(WebKit::WebProcessPool::platformDefaultCookieStorageDirectory): Deleted.

  • WebProcess/cocoa/WebProcessCocoa.mm:

(WebKit::WebProcess::platformInitializeWebProcess):

Tools:

  • WebKitTestRunner/TestController.cpp: (WTR::TestController::initialize):

Don't set cookie storage directory, as it's a no-op, we use an ephemeral session
for testing.

Location:
trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r184210 r184211  
     12015-05-08  Alexey Proskuryakov  <ap@apple.com>
     2
     3        [Mac] Share cookie storage between UI process and secondary processes
     4        https://bugs.webkit.org/show_bug.cgi?id=144820
     5        rdar://problem/20572830
     6
     7        Reviewed by Darin Adler.
     8
     9        * platform/network/mac/CookieJarMac.mm:
     10        * platform/spi/cf/CFNetworkSPI.h:
     11        Moved SPIs into an SPI header, so that WebKit2 could use them too without duplication.
     12
    1132015-05-12  Chris Dumez  <cdumez@apple.com>
    214
  • trunk/Source/WebCore/platform/network/mac/CookieJarMac.mm

    r181878 r184211  
    2727#import "PlatformCookieJar.h"
    2828
     29#import "CFNetworkSPI.h"
    2930#import "NetworkStorageSession.h"
    30 
    31 @interface NSHTTPCookieStorage (Details)
    32 - (void)removeCookiesSinceDate:(NSDate *)date;
    33 - (id)_initWithCFHTTPCookieStorage:(CFHTTPCookieStorageRef)cfStorage;
    34 - (CFHTTPCookieStorageRef)_cookieStorage;
    35 @end
    3631
    3732#if !USE(CFNETWORK)
     
    4338#import "WebCoreSystemInterface.h"
    4439#import <wtf/text/StringBuilder.h>
    45 
    46 enum {
    47     NSHTTPCookieAcceptPolicyExclusivelyFromMainDocumentDomain = 3
    48 };
    49 
    5040
    5141namespace WebCore {
  • trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h

    r182815 r184211  
    121121#endif
    122122
     123#if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
     124EXTERN_C CFDataRef CFHTTPCookieStorageCreateIdentifyingData(CFAllocatorRef inAllocator, CFHTTPCookieStorageRef inStorage);
     125EXTERN_C CFHTTPCookieStorageRef CFHTTPCookieStorageCreateFromIdentifyingData(CFAllocatorRef inAllocator, CFDataRef inData);
     126#endif
     127
     128#if defined(__OBJC__) && !USE(APPLE_INTERNAL_SDK)
     129@interface NSHTTPCookieStorage (Details)
     130#if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
     131+ (void)_setSharedHTTPCookieStorage:(NSHTTPCookieStorage *)storage;
     132#endif
     133- (void)removeCookiesSinceDate:(NSDate *)date;
     134- (id)_initWithCFHTTPCookieStorage:(CFHTTPCookieStorageRef)cfStorage;
     135- (CFHTTPCookieStorageRef)_cookieStorage;
     136@end
     137#endif
     138
    123139#endif // CFNetworkSPI_h
  • trunk/Source/WebKit2/ChangeLog

    r184210 r184211  
     12015-05-08  Alexey Proskuryakov  <ap@apple.com>
     2
     3        [Mac] Share cookie storage between UI process and secondary processes
     4        https://bugs.webkit.org/show_bug.cgi?id=144820
     5        rdar://problem/20572830
     6
     7        Reviewed by Darin Adler.
     8
     9        Pass a cookie storage descriptor that includes file path as well as other data that
     10        CFNetwork needs to use the same cookies storage as in another process (session cookies
     11        are still separate).
     12
     13        While at it, started to clean up code that passes cookie storage path. It was mostly
     14        dead and unimplemented, only used in child processes when USE(SECCOMP_FILTERS) was enabled.
     15
     16        * NetworkProcess/cocoa/NetworkProcessCocoa.mm:
     17        (WebKit::NetworkProcess::platformInitializeNetworkProcessCocoa):
     18        * Shared/Network/NetworkProcessCreationParameters.cpp:
     19        (WebKit::NetworkProcessCreationParameters::encode):
     20        (WebKit::NetworkProcessCreationParameters::decode):
     21        * Shared/Network/NetworkProcessCreationParameters.h:
     22        * Shared/WebProcessCreationParameters.cpp:
     23        (WebKit::WebProcessCreationParameters::encode):
     24        (WebKit::WebProcessCreationParameters::decode):
     25        * Shared/WebProcessCreationParameters.h:
     26        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
     27        (WebKit::WebProcessPool::platformInitializeWebProcess):
     28        (WebKit::WebProcessPool::platformInitializeNetworkProcess):
     29        (WebKit::WebProcessPool::platformDefaultCookieStorageDirectory): Deleted.
     30        * UIProcess/WebProcessPool.cpp:
     31        (WebKit::WebProcessPool::ensureNetworkProcess):
     32        (WebKit::WebProcessPool::createNewWebProcess):
     33        (WebKit::WebProcessPool::cookieStorageDirectory):
     34        * UIProcess/WebProcessPool.h:
     35        * UIProcess/efl/WebProcessPoolEfl.cpp:
     36        (WebKit::WebProcessPool::platformDefaultCookieStorageDirectory): Deleted.
     37        * UIProcess/gtk/WebProcessPoolGtk.cpp:
     38        (WebKit::WebProcessPool::platformDefaultCookieStorageDirectory): Deleted.
     39        * WebProcess/cocoa/WebProcessCocoa.mm:
     40        (WebKit::WebProcess::platformInitializeWebProcess):
     41
    1422015-05-12  Chris Dumez  <cdumez@apple.com>
    243
  • trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkProcessCocoa.mm

    r183755 r184211  
    7878    initializeNetworkSettings();
    7979
     80#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     81    setSharedHTTPCookieStorage(parameters.uiProcessCookieStorageIdentifier);
     82#endif
     83
    8084    // FIXME: Most of what this function does for cache size gets immediately overridden by setCacheModel().
    8185    // - memory cache size passed from UI process is always ignored;
  • trunk/Source/WebKit2/Shared/ChildProcess.h

    r164913 r184211  
    8585    virtual void initializeConnection(IPC::Connection*);
    8686
     87#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     88    static void setSharedHTTPCookieStorage(const Vector<uint8_t>& identifier);
     89#endif
     90
    8791    virtual bool shouldTerminate() = 0;
    8892    virtual void terminate();
  • trunk/Source/WebKit2/Shared/Network/NetworkProcessCreationParameters.cpp

    r182259 r184211  
    5353    encoder << shouldEnableNetworkCacheEfficacyLogging;
    5454#endif
     55#if ENABLE(SECCOMP_FILTERS)
    5556    encoder << cookieStorageDirectory;
     57#endif
     58#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     59    encoder << uiProcessCookieStorageIdentifier;
     60#endif
    5661#if PLATFORM(IOS)
    5762    encoder << cookieStorageDirectoryExtensionHandle;
     
    101106        return false;
    102107#endif
     108#if ENABLE(SECCOMP_FILTERS)
    103109    if (!decoder.decode(result.cookieStorageDirectory))
    104110        return false;
     111#endif
     112#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     113    if (!decoder.decode(result.uiProcessCookieStorageIdentifier))
     114        return false;
     115#endif
    105116#if PLATFORM(IOS)
    106117    if (!decoder.decode(result.cookieStorageDirectoryExtensionHandle))
  • trunk/Source/WebKit2/Shared/Network/NetworkProcessCreationParameters.h

    r182259 r184211  
    6262    bool shouldEnableNetworkCacheEfficacyLogging;
    6363#endif
    64 
     64#if ENABLE(SECCOMP_FILTERS)
    6565    String cookieStorageDirectory;
    66 
     66#endif
     67#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     68    Vector<uint8_t> uiProcessCookieStorageIdentifier;
     69#endif
    6770#if PLATFORM(IOS)
    6871    SandboxExtension::Handle cookieStorageDirectoryExtensionHandle;
    69 
    7072    SandboxExtension::Handle containerCachesDirectoryExtensionHandle;
    71 
    7273    SandboxExtension::Handle parentBundleDirectoryExtensionHandle;
    7374#endif
  • trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp

    r183562 r184211  
    7474    encoder << diskCacheDirectory;
    7575    encoder << diskCacheDirectoryExtensionHandle;
     76#if ENABLE(SECCOMP_FILTERS)
    7677    encoder << cookieStorageDirectory;
     78#endif
     79#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     80    encoder << uiProcessCookieStorageIdentifier;
     81#endif
    7782#if PLATFORM(IOS)
    7883    encoder << cookieStorageDirectoryExtensionHandle;
     
    178183    if (!decoder.decode(parameters.diskCacheDirectoryExtensionHandle))
    179184        return false;
     185#if ENABLE(SECCOMP_FILTERS)
    180186    if (!decoder.decode(parameters.cookieStorageDirectory))
    181187        return false;
     188#endif
     189#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     190    if (!decoder.decode(parameters.uiProcessCookieStorageIdentifier))
     191        return false;
     192#endif
    182193#if PLATFORM(IOS)
    183194    if (!decoder.decode(parameters.cookieStorageDirectoryExtensionHandle))
  • trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h

    r183562 r184211  
    7575    String diskCacheDirectory;
    7676    SandboxExtension::Handle diskCacheDirectoryExtensionHandle;
     77#if ENABLE(SECCOMP_FILTERS)
    7778    String cookieStorageDirectory;
     79#endif
     80#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     81    Vector<uint8_t> uiProcessCookieStorageIdentifier;
     82#endif
    7883#if PLATFORM(IOS)
    7984    SandboxExtension::Handle cookieStorageDirectoryExtensionHandle;
  • trunk/Source/WebKit2/Shared/mac/ChildProcessMac.mm

    r179373 r184211  
    3131#import "SandboxInitializationParameters.h"
    3232#import "WebKitSystemInterface.h"
     33#import <WebCore/CFNetworkSPI.h>
    3334#import <WebCore/FileSystem.h>
    3435#import <WebCore/SystemVersion.h>
     
    176177}
    177178
     179#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     180void ChildProcess::setSharedHTTPCookieStorage(const Vector<uint8_t>& identifier)
     181{
     182    // FIXME: Remove the runtime check when it's not needed (soon).
     183    if (![NSHTTPCookieStorage respondsToSelector:@selector(_setSharedHTTPCookieStorage:)])
     184        return;
     185
     186    RetainPtr<CFDataRef> cookieStorageData = adoptCF(CFDataCreate(kCFAllocatorDefault, identifier.data(), identifier.size()));
     187    RetainPtr<CFHTTPCookieStorageRef> uiProcessCookieStorage = adoptCF(CFHTTPCookieStorageCreateFromIdentifyingData(kCFAllocatorDefault, cookieStorageData.get()));
     188    [NSHTTPCookieStorage _setSharedHTTPCookieStorage:adoptNS([[NSHTTPCookieStorage alloc] _initWithCFHTTPCookieStorage:uiProcessCookieStorage.get()]).get()];
     189}
     190#endif
     191
     192
    178193#if USE(APPKIT)
    179194void ChildProcess::stopNSAppRunLoop()
  • trunk/Source/WebKit2/UIProcess/Cocoa/WebProcessPoolCocoa.mm

    r183893 r184211  
    241241    parameters.networkATSContext = adoptCF(_CFNetworkCopyATSContext());
    242242#endif
     243
     244#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     245    RetainPtr<CFDataRef> cookieStorageData = adoptCF(CFHTTPCookieStorageCreateIdentifyingData(kCFAllocatorDefault, [[NSHTTPCookieStorage sharedHTTPCookieStorage] _cookieStorage]));
     246    ASSERT(parameters.uiProcessCookieStorageIdentifier.isEmpty());
     247    parameters.uiProcessCookieStorageIdentifier.append(CFDataGetBytePtr(cookieStorageData.get()), CFDataGetLength(cookieStorageData.get()));
     248#endif
    243249}
    244250
     
    268274    parameters.shouldEnableNetworkCacheEfficacyLogging = [defaults boolForKey:WebKitNetworkCacheEfficacyLoggingEnabledDefaultsKey];
    269275#endif
     276
     277#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     278    RetainPtr<CFDataRef> cookieStorageData = adoptCF(CFHTTPCookieStorageCreateIdentifyingData(kCFAllocatorDefault, [[NSHTTPCookieStorage sharedHTTPCookieStorage] _cookieStorage]));
     279    ASSERT(parameters.uiProcessCookieStorageIdentifier.isEmpty());
     280    parameters.uiProcessCookieStorageIdentifier.append(CFDataGetBytePtr(cookieStorageData.get()), CFDataGetLength(cookieStorageData.get()));
     281#endif
    270282}
    271283#endif
     
    282294        cachePath = @"~/Library/Caches/com.apple.WebKit.WebProcess";
    283295    return stringByResolvingSymlinksInPath([cachePath stringByStandardizingPath]);
    284 }
    285 
    286 String WebProcessPool::platformDefaultCookieStorageDirectory() const
    287 {
    288 #if PLATFORM(IOS)
    289     String path = pathForProcessContainer();
    290     if (path.isEmpty())
    291         path = NSHomeDirectory();
    292 
    293     path = path + "/Library/Cookies";
    294     path = stringByResolvingSymlinksInPath(path);
    295     return path;
    296 #else
    297     notImplemented();
    298     return [@"" stringByStandardizingPath];
    299 #endif
    300296}
    301297
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp

    r183562 r184211  
    412412        SandboxExtension::createHandleForReadWriteDirectory(parameters.diskCacheDirectory, parameters.diskCacheDirectoryExtensionHandle);
    413413
    414     parameters.cookieStorageDirectory = cookieStorageDirectory();
     414#if ENABLE(SECCOMP_FILTERS)
     415    parameters.cookieStorageDirectory = this->cookieStorageDirectory();
     416#endif
    415417
    416418#if PLATFORM(IOS)
    417     if (!parameters.cookieStorageDirectory.isEmpty())
    418         SandboxExtension::createHandleForReadWriteDirectory(parameters.cookieStorageDirectory, parameters.cookieStorageDirectoryExtensionHandle);
     419    String cookieStorageDirectory = this->cookieStorageDirectory();
     420    if (!cookieStorageDirectory.isEmpty())
     421        SandboxExtension::createHandleForReadWriteDirectory(cookieStorageDirectory, parameters.cookieStorageDirectoryExtensionHandle);
    419422
    420423    String containerCachesDirectory = this->networkingCachesDirectory();
     
    611614        SandboxExtension::createHandleForReadWriteDirectory(parameters.diskCacheDirectory, parameters.diskCacheDirectoryExtensionHandle);
    612615
    613     parameters.cookieStorageDirectory = cookieStorageDirectory();
     616#if ENABLE(SECCOMP_FILTERS)
     617    parameters.cookieStorageDirectory = this->cookieStorageDirectory();
     618#endif
    614619
    615620#if PLATFORM(IOS)
    616     if (!parameters.cookieStorageDirectory.isEmpty())
    617         SandboxExtension::createHandleForReadWriteDirectory(parameters.cookieStorageDirectory, parameters.cookieStorageDirectoryExtensionHandle);
     621    String cookieStorageDirectory = this->cookieStorageDirectory();
     622    if (!cookieStorageDirectory.isEmpty())
     623        SandboxExtension::createHandleForReadWriteDirectory(cookieStorageDirectory, parameters.cookieStorageDirectoryExtensionHandle);
    618624
    619625    String containerCachesDirectory = this->webContentCachesDirectory();
     
    11881194}
    11891195
     1196#if ENABLE(SECCOMP_FILTERS)
    11901197String WebProcessPool::cookieStorageDirectory() const
    11911198{
     
    11931200        return m_overrideCookieStorageDirectory;
    11941201
    1195     return platformDefaultCookieStorageDirectory();
    1196 }
     1202    // FIXME: This doesn't make much sense. Is this function used at all? We used to call platform code, but no existing platforms implemented that function.
     1203    return emptyString();
     1204}
     1205#endif
    11971206
    11981207void WebProcessPool::useTestingNetworkSession()
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.h

    r183562 r184211  
    402402    String platformDefaultDiskCacheDirectory() const;
    403403
     404#if ENABLE(SECCOMP_FILTERS)
    404405    String cookieStorageDirectory() const;
    405     String platformDefaultCookieStorageDirectory() const;
     406#endif
    406407
    407408#if PLATFORM(IOS)
  • trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp

    r180145 r184211  
    132132}
    133133
    134 String WebProcessPool::platformDefaultCookieStorageDirectory() const
    135 {
    136     notImplemented();
    137     return String();
    138 }
    139 
    140134void WebProcessPool::setIgnoreTLSErrors(bool ignoreTLSErrors)
    141135{
  • trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp

    r179409 r184211  
    149149}
    150150
    151 String WebProcessPool::platformDefaultCookieStorageDirectory() const
    152 {
    153     notImplemented();
    154     return String();
    155 }
    156 
    157151void WebProcessPool::setIgnoreTLSErrors(bool ignoreTLSErrors)
    158152{
  • trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm

    r183562 r184211  
    150150#endif
    151151
     152#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
     153    setSharedHTTPCookieStorage(parameters.uiProcessCookieStorageIdentifier);
     154#endif
     155
    152156    // FIXME: Most of what this function does for cache size gets immediately overridden by setCacheModel().
    153157    // - memory cache size passed from UI process is always ignored;
  • trunk/Tools/ChangeLog

    r184209 r184211  
     12015-05-11  Alexey Proskuryakov  <ap@apple.com>
     2
     3        [Mac] Share cookie storage between UI process and secondary processes
     4        https://bugs.webkit.org/show_bug.cgi?id=144820
     5        rdar://problem/20572830
     6
     7        Reviewed by Darin Adler.
     8
     9        * WebKitTestRunner/TestController.cpp: (WTR::TestController::initialize):
     10        Don't set cookie storage directory, as it's a no-op, we use an ephemeral session
     11        for testing.
     12
    1132015-05-12  Jake Nielsen  <jacob_nielsen@apple.com>
    214
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r184015 r184211  
    381381        WKContextSetApplicationCacheDirectory(m_context.get(), toWK(temporaryFolder + separator + "ApplicationCache").get());
    382382        WKContextSetDiskCacheDirectory(m_context.get(), toWK(temporaryFolder + separator + "Cache").get());
    383         WKContextSetCookieStorageDirectory(m_context.get(), toWK(temporaryFolder + separator + "Cookies").get());
    384383        // Disable icon database to avoid fetching <http://127.0.0.1:8000/favicon.ico> and making tests flaky.
    385384        // Invividual tests can enable it using testRunner.setIconDatabaseEnabled, although it's not currently supported in WebKitTestRunner.
Note: See TracChangeset for help on using the changeset viewer.