blob: 52ec785f6efebda107907ed61bdeec8e32bd0e60 [file] [log] [blame]
/*
This file is part of the KDE libraries
Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
This class provides all functionality needed for loading images, style sheets and html
pages from the web. It has a memory cache for these objects.
*/
#ifndef Cache_h
#define Cache_h
#include "CachePolicy.h"
#include "CachedResource.h"
#include "loader.h"
#include "PlatformString.h"
#include "StringHash.h"
#include <wtf/Vector.h>
#include <wtf/HashSet.h>
#include <wtf/HashMap.h>
namespace WebCore {
class CachedCSSStyleSheet;
class CachedImage;
class CachedResource;
class CachedScript;
class CachedXSLStyleSheet;
class DocLoader;
class Image;
class KURL;
struct LRUList {
CachedResource* m_head;
CachedResource* m_tail;
LRUList() : m_head(0), m_tail(0) { }
};
typedef HashMap<String, CachedResource*> CachedResourceMap;
// This cache hold subresources used by Web pages. These resources consist of images, scripts and stylesheets.
class Cache {
public:
Cache();
// The loader that fetches resources.
Loader* loader() { return &m_loader; }
// Request resources from the cache. A load will be initiated and a cache object created if the object is not
// found in the cache.
CachedResource* requestResource(DocLoader*, CachedResource::Type, const KURL& url, time_t expireDate = 0, const String* charset = 0);
// Set/retreive the size of the cache. This will only hold approximately, since the size some
// cached objects (like stylesheets) take up in memory is not exactly known.
void setMaximumSize(unsigned bytes);
unsigned maximumSize() const { return m_maximumSize; };
// Turn the cache on and off. Disabling the cache will remove all resources from the cache. They may
// still live on if they are referenced by some Web page though.
void setDisabled(bool);
bool disabled() const { return m_disabled; }
// Remove an existing cache entry from both the resource map and from the LRU list.
void remove(CachedResource*);
// Flush the cache. Any resources still referenced by Web pages will not be removed by this call.
void prune();
void addDocLoader(DocLoader*);
void removeDocLoader(DocLoader*);
CachedResource* resourceForURL(const String&);
// Calls to put the cached resource into and out of LRU lists.
void insertInLRUList(CachedResource*);
void removeFromLRUList(CachedResource*);
// Called to adjust the cache totals when a resource changes size.
void adjustSize(bool live, unsigned oldResourceSize, unsigned newResourceSize);
// Track the size of all resources that are in the cache and still referenced by a Web page.
void addToLiveObjectSize(unsigned s) { m_liveResourcesSize += s; }
void removeFromLiveObjectSize(unsigned s) { m_liveResourcesSize -= s; }
// Functions to collect cache statistics for the caches window in the Safari Debug menu.
struct TypeStatistic {
int count;
int size;
TypeStatistic() : count(0), size(0) { }
};
struct Statistics {
TypeStatistic images;
TypeStatistic cssStyleSheets;
TypeStatistic scripts;
#ifdef XSLT_SUPPORT
TypeStatistic xslStyleSheets;
#endif
#ifdef XBL_SUPPORT
TypeStatistic xblDocs;
#endif
};
Statistics getStatistics();
private:
LRUList* lruListFor(CachedResource*);
void resourceAccessed(CachedResource*);
private:
// Member variables.
HashSet<DocLoader*> m_docLoaders;
Loader m_loader;
bool m_disabled; // Whether or not the cache is enabled.
unsigned m_maximumSize; // The maximum size in bytes that the global cache can consume.
unsigned m_currentSize; // The current size of the global cache in bytes.
unsigned m_liveResourcesSize; // The current size of "live" resources that cannot be flushed.
// Size-adjusted and popularity-aware LRU list collection for cache objects. This collection can hold
// more resources than the cached resource map, since it can also hold "stale" muiltiple versions of objects that are
// waiting to die when the clients referencing them go away.
Vector<LRUList, 32> m_lruLists;
// A URL-based map of all resources that are in the cache (including the freshest version of objects that are currently being
// referenced by a Web page).
HashMap<String, CachedResource*> m_resources;
};
// Function to obtain the global cache.
Cache* cache();
}
#endif