CookieStorageShimLibrary.cpp [plain text]
#include "config.h"
#include "CookieStorageShimLibrary.h"
#if !PLATFORM(IOS)
#include <WebCore/DynamicLinkerInterposing.h>
#include <mutex>
extern "C" CFDictionaryRef _CFHTTPCookieStorageCopyRequestHeaderFieldsForURL(CFAllocatorRef inAllocator, CFHTTPCookieStorageRef inCookieStorage, CFURLRef inRequestURL);
namespace WebKit {
extern "C" void WebKitCookieStorageShimInitialize(const CookieStorageShimCallbacks&);
static CookieStorageShimCallbacks cookieStorageShimCallbacks;
class ShimProtector {
public:
ShimProtector() { ++m_count; }
~ShimProtector() { --m_count; }
static unsigned count() { return m_count; }
private:
__thread static unsigned m_count;
};
__thread unsigned ShimProtector::m_count = 0;
static CFDictionaryRef shimCFHTTPCookieStorageCopyRequestHeaderFieldsForURL(CFAllocatorRef inAllocator, CFHTTPCookieStorageRef inCookieStorage, CFURLRef inRequestURL)
{
ShimProtector protector;
do {
if (!cookieStorageShimCallbacks.cookieStorageCopyRequestHeaderFieldsForURL)
break;
if (ShimProtector::count() > 1)
break;
CFDictionaryRef results = cookieStorageShimCallbacks.cookieStorageCopyRequestHeaderFieldsForURL(inCookieStorage, inRequestURL);
if (!results)
break;
return results;
} while (0);
return _CFHTTPCookieStorageCopyRequestHeaderFieldsForURL(inAllocator, inCookieStorage, inRequestURL);
}
DYLD_INTERPOSE(shimCFHTTPCookieStorageCopyRequestHeaderFieldsForURL, _CFHTTPCookieStorageCopyRequestHeaderFieldsForURL);
__attribute__((visibility("default")))
void WebKitCookieStorageShimInitialize(const CookieStorageShimCallbacks& callbacks)
{
static std::once_flag initializeCallbacksOnceFlag;
std::call_once(initializeCallbacksOnceFlag, [&callbacks] { cookieStorageShimCallbacks = callbacks; });
}
}
#endif // !PLATFORM(IOS)