1/* 2 * Copyright (C) 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "CookieStorage.h" 28 29#import "ResourceHandle.h" 30#import "WebCoreSystemInterface.h" 31#import <wtf/RetainPtr.h> 32#import <wtf/UnusedParam.h> 33 34#if USE(PLATFORM_STRATEGIES) 35#include "CookiesStrategy.h" 36#include "PlatformStrategies.h" 37#endif 38 39using namespace WebCore; 40 41@interface CookieStorageObjCAdapter : NSObject 42-(void)notifyCookiesChangedOnMainThread; 43-(void)cookiesChangedNotificationHandler:(NSNotification *)notification; 44-(void)startListeningForCookieChangeNotifications; 45-(void)stopListeningForCookieChangeNotifications; 46@end 47 48@implementation CookieStorageObjCAdapter 49 50-(void)notifyCookiesChangedOnMainThread 51{ 52#if USE(PLATFORM_STRATEGIES) 53 platformStrategies()->cookiesStrategy()->notifyCookiesChanged(); 54#endif 55} 56 57-(void)cookiesChangedNotificationHandler:(NSNotification *)notification 58{ 59 UNUSED_PARAM(notification); 60 61 [self performSelectorOnMainThread:@selector(notifyCookiesChangedOnMainThread) withObject:nil waitUntilDone:FALSE]; 62} 63 64-(void)startListeningForCookieChangeNotifications 65{ 66 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cookiesChangedNotificationHandler:) name:NSHTTPCookieManagerCookiesChangedNotification object:[NSHTTPCookieStorage sharedHTTPCookieStorage]]; 67} 68 69-(void)stopListeningForCookieChangeNotifications 70{ 71 [[NSNotificationCenter defaultCenter] removeObserver:self name:NSHTTPCookieManagerCookiesChangedNotification object:nil]; 72} 73 74@end 75 76namespace WebCore { 77 78#if USE(CFURLSTORAGESESSIONS) 79 80RetainPtr<CFHTTPCookieStorageRef>& privateBrowsingCookieStorage() 81{ 82 DEFINE_STATIC_LOCAL(RetainPtr<CFHTTPCookieStorageRef>, cookieStorage, ()); 83 return cookieStorage; 84} 85 86#endif 87 88void setCookieStoragePrivateBrowsingEnabled(bool enabled) 89{ 90#if USE(CFURLSTORAGESESSIONS) 91 if (enabled && privateBrowsingCookieStorage()) 92 return; 93 94 if (enabled && ResourceHandle::privateBrowsingStorageSession()) { 95 privateBrowsingCookieStorage().adoptCF(wkCopyHTTPCookieStorage(ResourceHandle::privateBrowsingStorageSession())); 96 97 // FIXME: When Private Browsing is enabled, the Private Browsing Cookie Storage should be 98 // observed for changes, not the default Cookie Storage. 99 100 return; 101 } 102 103 privateBrowsingCookieStorage() = nullptr; 104#endif 105 wkSetCookieStoragePrivateBrowsingEnabled(enabled); 106} 107 108static CookieStorageObjCAdapter *cookieStorageAdapter; 109 110void startObservingCookieChanges() 111{ 112 if (!cookieStorageAdapter) 113 cookieStorageAdapter = [[CookieStorageObjCAdapter alloc] init]; 114 [cookieStorageAdapter startListeningForCookieChangeNotifications]; 115} 116 117void stopObservingCookieChanges() 118{ 119 // cookieStorageAdapter can be nil here, if the WebProcess crashed and was restarted between 120 // when startObservingCookieChanges was called, and stopObservingCookieChanges is currently being called. 121 if (!cookieStorageAdapter) 122 return; 123 [cookieStorageAdapter stopListeningForCookieChangeNotifications]; 124} 125 126} 127