WebResourceCacheManager.cpp [plain text]
#include "config.h"
#include "WebResourceCacheManager.h"
#include "SecurityOriginData.h"
#include "WebCoreArgumentCoders.h"
#include "WebProcess.h"
#include "WebResourceCacheManagerMessages.h"
#include "WebResourceCacheManagerProxyMessages.h"
#include <WebCore/MemoryCache.h>
#include <WebCore/SecurityOrigin.h>
#include <WebCore/SecurityOriginHash.h>
using namespace WebCore;
namespace WebKit {
const char* WebResourceCacheManager::supplementName()
{
return "WebResourceCacheManager";
}
WebResourceCacheManager::WebResourceCacheManager(WebProcess* process)
: m_process(process)
{
m_process->addMessageReceiver(Messages::WebResourceCacheManager::messageReceiverName(), *this);
}
void WebResourceCacheManager::getCacheOrigins(uint64_t callbackID) const
{
#if USE(CFURLCACHE) && ENABLE(CACHE_PARTITIONING)
__block MemoryCache::SecurityOriginSet origins;
#else
MemoryCache::SecurityOriginSet origins;
#endif
memoryCache()->getOriginsWithCache(origins);
#if USE(CFURLCACHE)
#if ENABLE(CACHE_PARTITIONING)
cfURLCacheHostNamesWithCallback(^(RetainPtr<CFArrayRef> cfURLHosts) {
#else
RetainPtr<CFArrayRef> cfURLHosts = cfURLCacheHostNames();
#endif
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
returnCacheOrigins(callbackID, origins);
#if USE(CFURLCACHE) && ENABLE(CACHE_PARTITIONING)
});
#endif
}
void WebResourceCacheManager::returnCacheOrigins(uint64_t callbackID, const MemoryCache::SecurityOriginSet& origins) const
{
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);
}
m_process->send(Messages::WebResourceCacheManagerProxy::DidGetCacheOrigins(identifiers, callbackID), 0);
}
void WebResourceCacheManager::clearCacheForOrigin(const SecurityOriginData& originData, uint32_t cachesToClear) const
{
#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));
CFArrayAppendValue(hostArray.get(), origin->host().createCFString().get());
clearCFURLCacheForHostNames(hostArray.get());
}
#endif
}
void WebResourceCacheManager::clearCacheForAllOrigins(uint32_t cachesToClear) const
{
ResourceCachesToClear resourceCachesToClear = static_cast<ResourceCachesToClear>(cachesToClear);
m_process->clearResourceCaches(resourceCachesToClear);
}
}