📄 loader.cpp
字号:
} m_reloadedURLs.append(fullURL.url()); reload = true; } } return reload;}CachedImage *DocLoader::requestImage( const DOM::DOMString &url){ KURL fullURL = m_doc->completeURL( url.string() ); if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;#if APPLE_CHANGES if (KWQCheckIfReloading(this)) { setCachePolicy(KIO::CC_Reload); }#endif bool reload = needReload(fullURL);#if APPLE_CHANGES CachedImage *cachedObject = Cache::requestImage(this, fullURL, reload, m_expireDate); KWQCheckCacheObjectStatus(this, cachedObject); return cachedObject;#else return Cache::requestImage(this, fullURL, reload, m_expireDate);#endif}CachedCSSStyleSheet *DocLoader::requestStyleSheet( const DOM::DOMString &url, const QString& charset){ KURL fullURL = m_doc->completeURL( url.string() ); if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;#if APPLE_CHANGES if (KWQCheckIfReloading(this)) { setCachePolicy(KIO::CC_Reload); }#endif bool reload = needReload(fullURL);#if APPLE_CHANGES CachedCSSStyleSheet *cachedObject = Cache::requestStyleSheet(this, url, reload, m_expireDate, charset); KWQCheckCacheObjectStatus(this, cachedObject); return cachedObject;#else return Cache::requestStyleSheet(this, url, reload, m_expireDate, charset);#endif}CachedScript *DocLoader::requestScript( const DOM::DOMString &url, const QString& charset){ KURL fullURL = m_doc->completeURL( url.string() ); if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;#if APPLE_CHANGES if (KWQCheckIfReloading(this)) { setCachePolicy(KIO::CC_Reload); }#endif bool reload = needReload(fullURL);#if APPLE_CHANGES CachedScript *cachedObject = Cache::requestScript(this, url, reload, m_expireDate, charset); KWQCheckCacheObjectStatus(this, cachedObject); return cachedObject;#else return Cache::requestScript(this, url, reload, m_expireDate, charset);#endif}#ifndef KHTML_NO_XBLCachedXBLDocument* DocLoader::requestXBLDocument(const DOM::DOMString &url){ KURL fullURL = m_doc->completeURL(url.string()); // FIXME: Is this right for XBL? if (m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0; #if APPLE_CHANGES if (KWQCheckIfReloading(this)) { setCachePolicy(KIO::CC_Reload); }#endif bool reload = needReload(fullURL); #if APPLE_CHANGES CachedXBLDocument *cachedObject = Cache::requestXBLDocument(this, url, reload, m_expireDate); KWQCheckCacheObjectStatus(this, cachedObject); return cachedObject;#else return Cache::requestXBLDocument(this, url, reload, m_expireDate);#endif}#endifvoid DocLoader::setAutoloadImages( bool enable ){ if ( enable == m_bautoloadImages ) return; m_bautoloadImages = enable; if ( !m_bautoloadImages ) return; for ( const CachedObject* co=m_docObjects.first(); co; co=m_docObjects.next() ) if ( co->type() == CachedObject::Image ) { CachedImage *img = const_cast<CachedImage*>( static_cast<const CachedImage *>( co ) ); CachedObject::Status status = img->status(); if ( status != CachedObject::Unknown ) continue; Cache::loader()->load(this, img, true); }}void DocLoader::setCachePolicy( KIO::CacheControl cachePolicy ){ m_cachePolicy = cachePolicy;}void DocLoader::setShowAnimations( KHTMLSettings::KAnimationAdvice showAnimations ){ if ( showAnimations == m_showAnimations ) return; m_showAnimations = showAnimations; const CachedObject* co; for ( co=m_docObjects.first(); co; co=m_docObjects.next() ) if ( co->type() == CachedObject::Image ) { CachedImage *img = const_cast<CachedImage*>( static_cast<const CachedImage *>( co ) ); img->setShowAnimations( showAnimations ); }}void DocLoader::removeCachedObject( CachedObject* o ) const{ m_docObjects.removeRef( o );}// ------------------------------------------------------------------------------------------Loader::Loader() : QObject(){#if KWIQ QOBJECT_TYPE(khtml::Loader);#endif m_requestsPending.setAutoDelete( true ); m_requestsLoading.setAutoDelete( true );#if APPLE_CHANGES kwq = new KWQLoader(this);#endif}Loader::~Loader(){#if APPLE_CHANGES delete kwq;#endif}void Loader::load(DocLoader* dl, CachedObject *object, bool incremental){ Request *req = new Request(dl, object, incremental); m_requestsPending.append(req); emit requestStarted( req->m_docLoader, req->object ); servePendingRequests();}void Loader::servePendingRequests(){ if ( m_requestsPending.count() == 0 ) return; // get the first pending request Request *req = m_requestsPending.take(0);#ifdef CACHE_DEBUG kdDebug( 6060 ) << "starting Loader url=" << req->object->url().string() << endl;#endif KURL u(req->object->url().string()); KIO::TransferJob* job = KIO::get( u, false, false /*no GUI*/); job->addMetaData("cache", getCacheControlString(req->object->cachePolicy())); if (!req->object->accept().isEmpty()) job->addMetaData("accept", req->object->accept()); if ( req->m_docLoader ) { KURL r = req->m_docLoader->doc()->URL(); if ( r.protocol().startsWith( "http" ) && r.path().isEmpty() ) r.setPath( "/" ); job->addMetaData("referrer", r.url()); QString domain = r.host(); if (req->m_docLoader->doc()->isHTMLDocument()) domain = static_cast<HTMLDocumentImpl*>(req->m_docLoader->doc())->domain().string(); if (crossDomain(u.host(), domain)) job->addMetaData("cross-domain", "true"); } connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotFinished( KIO::Job * ) ) );#if APPLE_CHANGES connect( job, SIGNAL( data( KIO::Job*, const char *, int)), SLOT( slotData( KIO::Job*, const char *, int))); connect( job, SIGNAL( receivedResponse( KIO::Job *, KWIQResponse*)), SLOT( slotReceivedResponse( KIO::Job *, KWIQResponse*)) ); if (KWQServeRequest(this, req, job)) m_requestsLoading.insert(job, req);#else connect( job, SIGNAL( data( KIO::Job*, const QByteArray &)), SLOT( slotData( KIO::Job*, const QByteArray &))); if ( req->object->schedule() ) KIO::Scheduler::scheduleJob( job ); m_requestsLoading.insert(job, req);#endif // APPLE_CHANGES}void Loader::slotFinished( KIO::Job* job ){ Request *r = m_requestsLoading.take( job ); KIO::TransferJob* j = static_cast<KIO::TransferJob*>(job); if ( !r ) return; if (j->error() || j->isErrorPage()) { kdDebug(6060) << "Loader::slotFinished, with error. job->error()= " << j->error() << " job->isErrorPage()=" << j->isErrorPage() << endl; r->object->error( job->error(), job->errorText().ascii() ); emit requestFailed( r->m_docLoader, r->object ); } else { r->object->data(r->m_buffer, true); emit requestDone( r->m_docLoader, r->object );#if !APPLE_CHANGES time_t expireDate = j->queryMetaData("expire-date").toLong();kdDebug(6060) << "Loader::slotFinished, url = " << j->url().url() << " expires " << ctime(&expireDate) << endl; r->object->setExpireDate(expireDate, false);#endif }#if APPLE_CHANGES // We don't want to ever finish the load in the case of an error because we don't want them cached. if (j->error()) Cache::removeCacheEntry( r->object ); else#endif r->object->finish();#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Loader:: JOB FINISHED " << r->object << ": " << r->object->url().string() << endl;#endif delete r; servePendingRequests();}#if APPLE_CHANGESvoid Loader::slotReceivedResponse(KIO::Job* job, KWIQResponse *response){ Request *r = m_requestsLoading[job]; ASSERT(r); ASSERT(response); r->object->setResponse(response); r->object->setExpireDate(KWQCacheObjectExpiresTime(r->m_docLoader, response), false);}#endif#if APPLE_CHANGESvoid Loader::slotData( KIO::Job*job, const char *data, int size )#elsevoid Loader::slotData( KIO::Job*job, const QByteArray &data )#endif{ Request *r = m_requestsLoading[job]; if(!r) { kdDebug( 6060 ) << "got data for unknown request!" << endl; return; } if ( !r->m_buffer.isOpen() ) r->m_buffer.open( IO_WriteOnly );#if APPLE_CHANGES r->m_buffer.writeBlock( data, size );#else r->m_buffer.writeBlock( data.data(), data.size() );#endif if(r->incremental) r->object->data( r->m_buffer, false );}int Loader::numRequests( DocLoader* dl ) const{ int res = 0; QPtrListIterator<Request> pIt( m_requestsPending ); for (; pIt.current(); ++pIt ) if ( pIt.current()->m_docLoader == dl ) res++; QPtrDictIterator<Request> lIt( m_requestsLoading ); for (; lIt.current(); ++lIt ) if ( lIt.current()->m_docLoader == dl ) res++; return res;}void Loader::cancelRequests( DocLoader* dl ){ //kdDebug( 6060 ) << "void Loader::cancelRequests()" << endl; //kdDebug( 6060 ) << "got " << m_requestsPending.count() << " pending requests" << endl; QPtrListIterator<Request> pIt( m_requestsPending ); while ( pIt.current() ) { if ( pIt.current()->m_docLoader == dl ) { kdDebug( 6060 ) << "cancelling pending request for " << pIt.current()->object->url().string() << endl; //emit requestFailed( dl, pIt.current()->object ); Cache::removeCacheEntry( pIt.current()->object ); m_requestsPending.remove( pIt ); } else ++pIt; } //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; }}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::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();}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;}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: " << url.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) {#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);#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=" << url.url() << "!" << endl;#endif return 0; }#ifdef CACHE_DEBUG if( o->status() == CachedObject::Pending ) kdDebug( 6060 ) << "Cache: loading in progress: " << url.url() << endl; else kdDebug( 6060 ) << "Cache: using cached: " << url.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 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -