CachedResource.cpp [plain text]
#include "config.h"
#include "CachedResource.h"
#include "Cache.h"
#include "DocLoader.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "KURL.h"
#include "Request.h"
#include "SystemTime.h"
#include <wtf/Vector.h>
namespace WebCore {
CachedResource::CachedResource(const String& URL, Type type, bool forCache, bool sendResourceLoadCallbacks)
: m_lastDecodedAccessTime(0)
, m_sendResourceLoadCallbacks(sendResourceLoadCallbacks)
, m_inCache(forCache)
, m_docLoader(0)
{
m_url = URL;
m_type = type;
m_status = Pending;
m_encodedSize = 0;
m_decodedSize = 0;
m_request = 0;
m_accessCount = 0;
m_inLiveDecodedResourcesList = false;
m_nextInAllResourcesList = 0;
m_prevInAllResourcesList = 0;
m_nextInLiveResourcesList = 0;
m_prevInLiveResourcesList = 0;
#ifndef NDEBUG
m_deleted = false;
m_lruIndex = 0;
#endif
m_errorOccurred = false;
m_shouldTreatAsLocal = FrameLoader::shouldTreatURLAsLocal(m_url);
}
CachedResource::~CachedResource()
{
ASSERT(!inCache());
ASSERT(!m_deleted);
#ifndef NDEBUG
m_deleted = true;
#endif
if (m_docLoader)
m_docLoader->removeCachedResource(this);
}
void CachedResource::finish()
{
m_status = Cached;
}
bool CachedResource::isExpired() const
{
if (!m_response.expirationDate())
return false;
time_t now = time(0);
return (difftime(now, m_response.expirationDate()) >= 0);
}
void CachedResource::setRequest(Request* request)
{
if (request && !m_request)
m_status = Pending;
m_request = request;
if (canDelete() && !inCache())
delete this;
}
void CachedResource::ref(CachedResourceClient *c)
{
if (!referenced() && inCache())
cache()->addToLiveResourcesSize(this);
m_clients.add(c);
}
void CachedResource::deref(CachedResourceClient *c)
{
ASSERT(m_clients.contains(c));
m_clients.remove(c);
if (canDelete() && !inCache())
delete this;
else if (!referenced() && inCache()) {
cache()->removeFromLiveResourcesSize(this);
cache()->removeFromLiveDecodedResourcesList(this);
allReferencesRemoved();
cache()->prune();
}
}
void CachedResource::setDecodedSize(unsigned size)
{
if (size == m_decodedSize)
return;
int delta = size - m_decodedSize;
if (inCache())
cache()->removeFromLRUList(this);
m_decodedSize = size;
if (inCache()) {
cache()->insertInLRUList(this);
if (m_decodedSize && !m_inLiveDecodedResourcesList && referenced())
cache()->insertInLiveDecodedResourcesList(this);
else if (!m_decodedSize && m_inLiveDecodedResourcesList)
cache()->removeFromLiveDecodedResourcesList(this);
cache()->adjustSize(referenced(), delta);
}
}
void CachedResource::setEncodedSize(unsigned size)
{
if (size == m_encodedSize)
return;
ASSERT(size == 0 || size >= m_encodedSize);
int delta = size - m_encodedSize;
if (inCache())
cache()->removeFromLRUList(this);
m_encodedSize = size;
if (inCache()) {
cache()->insertInLRUList(this);
cache()->adjustSize(referenced(), delta);
}
}
void CachedResource::didAccessDecodedData(double timeStamp)
{
m_lastDecodedAccessTime = timeStamp;
if (inCache()) {
if (m_inLiveDecodedResourcesList) {
cache()->removeFromLiveDecodedResourcesList(this);
cache()->insertInLiveDecodedResourcesList(this);
}
cache()->prune();
}
}
}