WebResourceCacheManager.cpp [plain text]
#include "config.h"
#include "WebResourceCacheManager.h"
#include "Connection.h"
#include "MessageID.h"
#include "ResourceCachesToClear.h"
#include "SecurityOriginData.h"
#include "WebCoreArgumentCoders.h"
#include "WebResourceCacheManagerProxyMessages.h"
#include "WebProcess.h"
#include <WebCore/MemoryCache.h>
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SecurityOriginHash.h>
#include <wtf/UnusedParam.h>
using namespace WebCore;
namespace WebKit {
WebResourceCacheManager& WebResourceCacheManager::shared()
{
static WebResourceCacheManager& shared = *new WebResourceCacheManager;
return shared;
}
WebResourceCacheManager::WebResourceCacheManager()
{
}
WebResourceCacheManager::~WebResourceCacheManager()
{
}
void WebResourceCacheManager::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
{
didReceiveWebResourceCacheManagerMessage(connection, messageID, arguments);
}
void WebResourceCacheManager::getCacheOrigins(uint64_t callbackID) const
{
WebProcess::LocalTerminationDisabler terminationDisabler(WebProcess::shared());
MemoryCache::SecurityOriginSet origins;
memoryCache()->getOriginsWithCache(origins);
#if USE(CFURLCACHE)
RetainPtr<CFArrayRef> cfURLHosts = cfURLCacheHostNames();
CFIndex size = cfURLHosts ? CFArrayGetCount(cfURLHosts.get()) : 0;
String httpString("http");
for (CFIndex i = 0; i < size; ++i) {
CFStringRef host = static_cast<CFStringRef>(CFArrayGetValueAtIndex(cfURLHosts.get(), i));
origins.add(SecurityOrigin::create(httpString, host, 0));
}
#endif
Vector<SecurityOriginData> identifiers;
identifiers.reserveCapacity(origins.size());
MemoryCache::SecurityOriginSet::iterator end = origins.end();
for (MemoryCache::SecurityOriginSet::iterator it = origins.begin(); it != end; ++it) {
RefPtr<SecurityOrigin> origin = *it;
SecurityOriginData originData;
originData.protocol = origin->protocol();
originData.host = origin->host();
originData.port = origin->port();
identifiers.uncheckedAppend(originData);
}
WebProcess::shared().connection()->send(Messages::WebResourceCacheManagerProxy::DidGetCacheOrigins(identifiers, callbackID), 0);
}
void WebResourceCacheManager::clearCacheForOrigin(SecurityOriginData originData, uint32_t cachesToClear) const
{
WebProcess::LocalTerminationDisabler terminationDisabler(WebProcess::shared());
#if USE(CFURLCACHE)
ResourceCachesToClear resourceCachesToClear = static_cast<ResourceCachesToClear>(cachesToClear);
#else
UNUSED_PARAM(cachesToClear);
#endif
RefPtr<SecurityOrigin> origin = SecurityOrigin::create(originData.protocol, originData.host, originData.port);
if (!origin)
return;
memoryCache()->removeResourcesWithOrigin(origin.get());
#if USE(CFURLCACHE)
if (resourceCachesToClear != InMemoryResourceCachesOnly) {
RetainPtr<CFMutableArrayRef> hostArray(AdoptCF, CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks));
RetainPtr<CFStringRef> host(AdoptCF, origin->host().createCFString());
CFArrayAppendValue(hostArray.get(), host.get());
clearCFURLCacheForHostNames(hostArray.get());
}
#endif
}
void WebResourceCacheManager::clearCacheForAllOrigins(uint32_t cachesToClear) const
{
WebProcess::LocalTerminationDisabler terminationDisabler(WebProcess::shared());
ResourceCachesToClear resourceCachesToClear = static_cast<ResourceCachesToClear>(cachesToClear);
WebProcess::shared().clearResourceCaches(resourceCachesToClear);
}
}