📄 loader.cpp
字号:
}
#if APPLE_CHANGES
QPtrListIterator<Request> bdIt( m_requestsBackgroundDecoding );
while ( bdIt.current() )
{
if ( bdIt.current()->m_docLoader == dl )
{
kdDebug( 6060 ) << "cancelling pending request for " << bdIt.current()->object->url().string() << endl;
//emit requestFailed( dl, bdIt.current()->object );
Cache::removeCacheEntry( bdIt.current()->object );
m_requestsBackgroundDecoding.remove( bdIt );
}
else
++bdIt;
}
#endif
//kdDebug( 6060 ) << "got " << m_requestsLoading.count() << "loading requests" << endl;
QPtrDictIterator<Request> lIt( m_requestsLoading );
while ( lIt.current() )
{
if ( lIt.current()->m_docLoader == dl )
{
//kdDebug( 6060 ) << "cancelling loading request for " << lIt.current()->object->url().string() << endl;
KIO::Job *job = static_cast<KIO::Job *>( lIt.currentKey() );
Cache::removeCacheEntry( lIt.current()->object );
m_requestsLoading.remove( lIt.currentKey() );
job->kill();
//emit requestFailed( dl, pIt.current()->object );
}
else
++lIt;
}
}
#if APPLE_CHANGES
void Loader::removeBackgroundDecodingRequest (Request *r)
{
bool present = m_requestsBackgroundDecoding.containsRef(r);
if (present) {
m_requestsBackgroundDecoding.remove (r);
}
}
#endif
KIO::Job *Loader::jobForRequest( const DOM::DOMString &url ) const
{
QPtrDictIterator<Request> it( m_requestsLoading );
for (; it.current(); ++it )
{
CachedObject *obj = it.current()->object;
if ( obj && obj->url() == url )
return static_cast<KIO::Job *>( it.currentKey() );
}
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 NOKIA_CHANGES
if( dl ) {
// load the image if autoload is on or object is in disk cache
if (dl->autoloadImages()
|| KWQ(dl->doc()->part())->bridge()->Client().IsObjectAvailableInDiskCache(url.url().Des()) )
Cache::loader()->load(dl, im, true);
else {
// otherwise, use the error image
im->clear();
im->m_loading = false;
im->do_notify(im->pixmap(), QRect(0, 0, 16, 16));
im->checkNotify();
im->setSize(1024);
}
}
#else
if ( dl && dl->autoloadImages() ) Cache::loader()->load(dl, im, true);
#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 NOKIA_CHANGES
else if (dl->autoloadImages() && o->type() == CachedObject::Image) {
CachedImage* im = static_cast<CachedImage*>(o);
if (im->isErrorImage() && !im->errorOccured)
// we have image in cache but it is not valid and this was not a network error
// it was probably created when autoloadImages was off, so try to load it again
Cache::loader()->load(dl, im, true);
}
#endif
#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...
KUR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -