CookieStorageCFNet.cpp [plain text]
#include "config.h"
#include "CookieStorage.h"
#include "CookieStorageCFNet.h"
#if USE(CFNETWORK) || USE(CFURLSTORAGESESSIONS)
#include "ResourceHandle.h"
#include <wtf/MainThread.h>
#if PLATFORM(MAC)
#include "WebCoreSystemInterface.h"
#elif PLATFORM(WIN)
#include "LoaderRunLoopCF.h"
#include <CFNetwork/CFHTTPCookiesPriv.h>
#include <WebKitSystemInterface/WebKitSystemInterface.h>
#endif
#if USE(PLATFORM_STRATEGIES)
#include "CookiesStrategy.h"
#include "PlatformStrategies.h"
#endif
#endif
namespace WebCore {
#if PLATFORM(WIN)
static RetainPtr<CFHTTPCookieStorageRef>& cookieStorageOverride()
{
DEFINE_STATIC_LOCAL(RetainPtr<CFHTTPCookieStorageRef>, cookieStorage, ());
return cookieStorage;
}
#endif
#if USE(CFNETWORK) || USE(CFURLSTORAGESESSIONS)
RetainPtr<CFHTTPCookieStorageRef> currentCFHTTPCookieStorage()
{
#if PLATFORM(WIN)
if (RetainPtr<CFHTTPCookieStorageRef>& override = cookieStorageOverride())
return override;
#endif
#if USE(CFNETWORK) || USE(CFURLSTORAGESESSIONS)
if (CFURLStorageSessionRef session = ResourceHandle::currentStorageSession())
return RetainPtr<CFHTTPCookieStorageRef>(AdoptCF, wkCopyHTTPCookieStorage(session));
#endif
#if USE(CFNETWORK)
return wkGetDefaultHTTPCookieStorage();
#else
return 0;
#endif
}
#endif // USE(CFNETWORK) || USE(CFURLSTORAGESESSIONS)
#if USE(CFNETWORK) && PLATFORM(WIN)
void overrideCookieStorage(CFHTTPCookieStorageRef cookieStorage)
{
ASSERT(isMainThread());
cookieStorageOverride().adoptCF(cookieStorage);
}
void setCookieStoragePrivateBrowsingEnabled(bool)
{
ASSERT(isMainThread());
}
static void notifyCookiesChangedOnMainThread(void*)
{
ASSERT(isMainThread());
#if USE(PLATFORM_STRATEGIES)
platformStrategies()->cookiesStrategy()->notifyCookiesChanged();
#endif
}
static void notifyCookiesChanged(CFHTTPCookieStorageRef, void *)
{
callOnMainThread(notifyCookiesChangedOnMainThread, 0);
}
static inline CFRunLoopRef cookieStorageObserverRunLoop()
{
return loaderRunLoop();
}
void startObservingCookieChanges()
{
ASSERT(isMainThread());
CFRunLoopRef runLoop = cookieStorageObserverRunLoop();
ASSERT(runLoop);
RetainPtr<CFHTTPCookieStorageRef> cookieStorage = currentCFHTTPCookieStorage();
ASSERT(cookieStorage);
CFHTTPCookieStorageScheduleWithRunLoop(cookieStorage.get(), runLoop, kCFRunLoopCommonModes);
CFHTTPCookieStorageAddObserver(cookieStorage.get(), runLoop, kCFRunLoopDefaultMode, notifyCookiesChanged, 0);
}
void stopObservingCookieChanges()
{
ASSERT(isMainThread());
CFRunLoopRef runLoop = cookieStorageObserverRunLoop();
ASSERT(runLoop);
RetainPtr<CFHTTPCookieStorageRef> cookieStorage = currentCFHTTPCookieStorage();
ASSERT(cookieStorage);
CFHTTPCookieStorageRemoveObserver(cookieStorage.get(), runLoop, kCFRunLoopDefaultMode, notifyCookiesChanged, 0);
CFHTTPCookieStorageUnscheduleFromRunLoop(cookieStorage.get(), runLoop, kCFRunLoopCommonModes);
}
#endif // USE(CFNETWORK) && PLATFORM(WIN)
}