loader.cpp
来自「It is WEB browser core module with sourc」· C++ 代码 · 共 2,335 行 · 第 1/5 页
CPP
2,335 行
return 0;
}
// ----------------------------------------------------------------------------
LRUList::LRUList()
:m_head(0), m_tail(0)
{}
LRUList::~LRUList()
{}
QDict<CachedObject> *Cache::cache = 0;
QPtrList<DocLoader>* Cache::docloader = 0;
Loader *Cache::m_loader = 0;
int Cache::maxSize = DEFCACHESIZE;
int Cache::maxCacheable = MAXCACHEABLE;
int Cache::flushCount = 0;
QPixmap *Cache::nullPixmap = 0;
QPixmap *Cache::brokenPixmap = 0;
CachedObject *Cache::m_headOfUncacheableList = 0;
int Cache::m_totalSizeOfLRULists = 0;
int Cache::m_countOfLRUAndUncacheableLists;
LRUList *Cache::m_LRULists = 0;
void Cache::init()
{
if ( !cache )
cache = new QDict<CachedObject>(401, true);
if ( !docloader )
docloader = new QPtrList<DocLoader>;
if ( !nullPixmap )
nullPixmap = new QPixmap;
if ( !brokenPixmap )
#if APPLE_CHANGES
brokenPixmap = KWQLoadPixmap("missing_image");
#else
brokenPixmap = new QPixmap(KHTMLFactory::instance()->iconLoader()->loadIcon("file_broken", KIcon::Desktop, 16, KIcon::DisabledState));
#endif
if ( !m_loader )
m_loader = new Loader();
// make a oom handler
// TODO: figure out a way to delete this oom handler
#ifdef __OOM__
if( !oom_collector )
oom_collector = new CacheMemCollector();
#endif
}
void Cache::clear()
{
if ( !cache ) return;
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache: CLEAR!" << endl;
statistics();
#endif
cache->setAutoDelete( true );
delete cache; cache = 0;
delete nullPixmap; nullPixmap = 0;
delete brokenPixmap; brokenPixmap = 0;
delete m_loader; m_loader = 0;
delete docloader; docloader = 0;
#ifdef __OOM__
if( oom_collector )
delete oom_collector;
oom_collector = 0;
#endif
}
CachedImage *Cache::requestImage( DocLoader* dl, const DOMString & url, bool reload, time_t _expireDate )
{
// this brings the _url to a standard form...
KURL kurl;
if (dl)
kurl = dl->m_doc->completeURL( url.string() );
else
kurl = url.string();
return requestImage(dl, kurl, reload, _expireDate);
}
CachedImage *Cache::requestImage( DocLoader* dl, const KURL & url, bool reload, time_t _expireDate )
{
KIO::CacheControl cachePolicy;
if (dl)
cachePolicy = dl->cachePolicy();
else
cachePolicy = KIO::CC_Verify;
#if APPLE_CHANGES
// Checking if the URL is malformed is lots of extra work for little benefit.
#else
if( kurl.isMalformed() )
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;
#endif
return 0;
}
#endif
#if APPLE_CHANGES
if (!dl->doc()->shouldCreateRenderers()){
return 0;
}
#endif
CachedObject *o = 0;
if (!reload)
o = cache->find(url.url());
if(!o)
{
//#if NOKIA_CHANGES
// don't kick of image load in fast display mode
// they might affect loading of more important resources
// if (dl->doc()->fastDisplayMode())
// return 0;
//#endif
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache: new: " << url.url() << endl;
#endif
CachedImage *im = new CachedImage(dl, url.url(), cachePolicy, _expireDate);
if ( dl && dl->autoloadImages() ) Cache::loader()->load(dl, im, true);
#ifdef NOKIA_CHANGES
//Auto load images is off, so we fake an error response
//This causes the alt text to be shown instead of the image
if( dl && !dl->autoloadImages() ) im->error(0,0);
#endif
#if APPLE_CHANGES
if (cacheDisabled)
im->setFree(true);
else {
#endif
cache->insert( url.url(), im );
moveToHeadOfLRUList(im);
#if APPLE_CHANGES
}
#endif
o = im;
}
#if !APPLE_CHANGES
o->setExpireDate(_expireDate, true);
#endif
if(o->type() != CachedObject::Image)
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache::Internal Error in requestImage url=" << kurl.url() << "!" << endl;
#endif
return 0;
}
#ifdef CACHE_DEBUG
if( o->status() == CachedObject::Pending )
kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl;
else
kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << ", status " << o->status() << endl;
#endif
moveToHeadOfLRUList(o);
if ( dl ) {
dl->m_docObjects.remove( o );
#if APPLE_CHANGES
if (!cacheDisabled)
#endif
dl->m_docObjects.append( o );
}
return static_cast<CachedImage *>(o);
}
CachedCSSStyleSheet *Cache::requestStyleSheet( DocLoader* dl, const DOMString & url, bool reload, time_t _expireDate, const QString& charset)
{
// this brings the _url to a standard form...
KURL kurl;
KIO::CacheControl cachePolicy;
if ( dl )
{
kurl = dl->m_doc->completeURL( url.string() );
cachePolicy = dl->cachePolicy();
}
else
{
kurl = url.string();
cachePolicy = KIO::CC_Verify;
}
#if APPLE_CHANGES
// Checking if the URL is malformed is lots of extra work for little benefit.
#else
if( kurl.isMalformed() )
{
kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;
return 0;
}
#endif
CachedObject *o = cache->find(kurl.url());
if(!o)
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
#endif
CachedCSSStyleSheet *sheet = new CachedCSSStyleSheet(dl, kurl.url(), cachePolicy, _expireDate, charset);
#if APPLE_CHANGES
if (cacheDisabled)
sheet->setFree(true);
else {
#endif
cache->insert( kurl.url(), sheet );
moveToHeadOfLRUList(sheet);
#if APPLE_CHANGES
}
#endif
#if NOKIA_CHANGES
if( dl->doc()->part()->fastDisplayState() == KHTMLPart::ShowingInitialDocument &&
!KWQ(dl->doc()->part())->bridge()->Client().IsObjectAvailableInDiskCache(kurl.url().Des()) ) {
dl->doc()->part()->switchToFastDisplayDoc();
}
// make the request but don't actually ref the resource
// we don't want anything to get applied to fast display doc
if (dl->m_doc->fastDisplayMode())
return 0;
#endif
o = sheet;
}
#if !APPLE_CHANGES
o->setExpireDate(_expireDate, true);
#endif
if(o->type() != CachedObject::CSSStyleSheet)
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache::Internal Error in requestStyleSheet url=" << kurl.url() << "!" << endl;
#endif
return 0;
}
#ifdef CACHE_DEBUG
if( o->status() == CachedObject::Pending )
kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl;
else
kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << endl;
#endif
moveToHeadOfLRUList(o);
if ( dl ) {
dl->m_docObjects.remove( o );
#if APPLE_CHANGES
if (!cacheDisabled)
#endif
dl->m_docObjects.append( o );
}
return static_cast<CachedCSSStyleSheet *>(o);
}
void Cache::preloadStyleSheet( const QString &url, const QString &stylesheet_data)
{
CachedObject *o = cache->find(url);
if(o)
removeCacheEntry(o);
CachedCSSStyleSheet *stylesheet = new CachedCSSStyleSheet(url, stylesheet_data);
cache->insert( url, stylesheet );
}
CachedScript *Cache::requestScript( DocLoader* dl, const DOM::DOMString &url, bool reload, time_t _expireDate, const QString& charset)
{
// this brings the _url to a standard form...
KURL kurl;
KIO::CacheControl cachePolicy;
if ( dl )
{
kurl = dl->m_doc->completeURL( url.string() );
cachePolicy = dl->cachePolicy();
}
else
{
kurl = url.string();
cachePolicy = KIO::CC_Verify;
}
#if APPLE_CHANGES
// Checking if the URL is malformed is lots of extra work for little benefit.
#else
if( kurl.isMalformed() )
{
kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;
return 0;
}
#endif
CachedObject *o = cache->find(kurl.url());
if(!o)
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
#endif
CachedScript *script = new CachedScript(dl, kurl.url(), cachePolicy, _expireDate, charset);
#if APPLE_CHANGES
if (cacheDisabled)
script->setFree(true);
else {
#endif
cache->insert( kurl.url(), script );
moveToHeadOfLRUList(script);
#if APPLE_CHANGES
}
#endif
#if NOKIA_CHANGES
if( dl->doc()->part()->fastDisplayState() == KHTMLPart::ShowingInitialDocument &&
!KWQ(dl->doc()->part())->bridge()->Client().IsObjectAvailableInDiskCache(kurl.url().Des()) ) {
dl->doc()->part()->switchToFastDisplayDoc();
}
// make the request but don't actually ref the resource
// we don't want anything to get applied to fast display doc
if (dl->m_doc->fastDisplayMode())
return 0;
#endif
o = script;
}
#if !APPLE_CHANGES
o->setExpireDate(_expireDate, true);
#endif
if(!(o->type() == CachedObject::Script))
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache::Internal Error in requestScript url=" << kurl.url() << "!" << endl;
#endif
return 0;
}
#ifdef CACHE_DEBUG
if( o->status() == CachedObject::Pending )
kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl;
else
kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << endl;
#endif
moveToHeadOfLRUList(o);
if ( dl ) {
dl->m_docObjects.remove( o );
#if APPLE_CHANGES
if (!cacheDisabled)
#endif
dl->m_docObjects.append( o );
}
return static_cast<CachedScript *>(o);
}
void Cache::preloadScript( const QString &url, const QString &script_data)
{
CachedObject *o = cache->find(url);
if(o)
removeCacheEntry(o);
CachedScript *script = new CachedScript(url, script_data);
cache->insert( url, script );
}
#ifdef KHTML_XSLT
CachedXSLStyleSheet* Cache::requestXSLStyleSheet(DocLoader* dl, const DOMString & url, bool reload,
time_t _expireDate)
{
// this brings the _url to a standard form...
KURL kurl;
KIO::CacheControl cachePolicy;
if (dl) {
kurl = dl->m_doc->completeURL(url.string());
cachePolicy = dl->cachePolicy();
}
else {
kurl = url.string();
cachePolicy = KIO::CC_Verify;
}
#if APPLE_CHANGES
// Checking if the URL is malformed is lots of extra work for little benefit.
#else
if(kurl.isMalformed()) {
kdDebug( 6060 ) << "Cache: Malformed url: " << kurl.url() << endl;
return 0;
}
#endif
CachedObject *o = cache->find(kurl.url());
if (!o) {
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache: new: " << kurl.url() << endl;
#endif
CachedXSLStyleSheet* doc = new CachedXSLStyleSheet(dl, kurl.url(), cachePolicy, _expireDate);
#if APPLE_CHANGES
if (cacheDisabled)
doc->setFree(true);
else {
#endif
cache->insert(kurl.url(), doc);
moveToHeadOfLRUList(doc);
#if APPLE_CHANGES
}
#endif
o = doc;
}
#if !APPLE_CHANGES
o->setExpireDate(_expireDate, true);
#endif
if (o->type() != CachedObject::XSLStyleSheet) {
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Cache::Internal Error in requestXSLStyleSheet url=" << kurl.url() << "!" << endl;
#endif
return 0;
}
#ifdef CACHE_DEBUG
if (o->status() == CachedObject::Pending)
kdDebug( 6060 ) << "Cache: loading in progress: " << kurl.url() << endl;
else
kdDebug( 6060 ) << "Cache: using cached: " << kurl.url() << endl;
#endif
moveToHeadOfLRUList(o);
if (dl) {
dl->m_docObjects.remove( o );
#if APPLE_CHANGES
if (!cacheDisabled)
#endif
dl->m_docObjects.append( o );
}
return static_cast<CachedXSLStyleSheet*>(o);
}
#endif
#ifndef KHTML_NO_XBL
CachedXBLDocument* Cache::requestXBLDocument(DocLoader* dl, const DOMString & url, bool reload,
time_t _expireDate)
{
// this brings the _url to a standard form...
KURL kurl;
KIO::CacheControl cachePolicy;
if (dl) {
kurl = dl->m_doc->completeURL(url.string());
cachePolicy = dl->cachePolicy();
}
else {
kurl = ur
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?