📄 loader.cpp
字号:
#endif cache->insert( kurl.url(), sheet ); moveToHeadOfLRUList(sheet);#if APPLE_CHANGES }#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 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 );}#ifndef KHTML_NO_XBLCachedXBLDocument* 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 = 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 CachedXBLDocument* doc = new CachedXBLDocument(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::XBL) {#ifdef CACHE_DEBUG kdDebug( 6060 ) << "Cache::Internal Error in requestXBLDocument 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<CachedXBLDocument*>(o);}#endifvoid Cache::flush(bool force){ if (force) flushCount = 0; // Don't flush for every image. if (m_countOfLRUAndUncacheableLists < flushCount) return; init();#ifdef CACHE_DEBUG statistics(); kdDebug( 6060 ) << "Cache: flush()" << endl;#endif while (m_headOfUncacheableList) removeCacheEntry(m_headOfUncacheableList); for (int i = MAX_LRU_LISTS-1; i>=0; i--) { if (m_totalSizeOfLRULists <= maxSize) break; while (m_totalSizeOfLRULists > maxSize && m_LRULists[i].m_tail) { removeCacheEntry(m_LRULists[i].m_tail); } } flushCount = m_countOfLRUAndUncacheableLists+10; // Flush again when the cache has grown.#ifdef CACHE_DEBUG //statistics();#endif}#if 0void Cache::checkLRUAndUncacheableListIntegrity(){ int count = 0; { int size = 0; CachedObject *prev = 0; for (CachedObject *o = m_headOfLRUList; o; o = o->m_nextInLRUList) { ASSERT(o->allowInLRUList()); ASSERT(o->status() != CachedObject::Uncacheable); ASSERT(o->m_prevInLRUList == prev); size += o->size(); prev = o; ++count; } ASSERT(m_tailOfLRUList == prev); ASSERT(m_totalSizeOfLRUList == size); } { CachedObject *prev = 0; for (CachedObject *o = m_headOfUncacheableList; o; o = o->m_nextInLRUList) { ASSERT(o->allowInLRUList()); ASSERT(o->status() == CachedObject::Uncacheable); ASSERT(o->m_prevInLRUList == prev); prev = o; ++count; } } ASSERT(m_countOfLRUAndUncacheableLists == count);}#endifvoid Cache::setSize( int bytes ){ maxSize = bytes; // may be we need to clear parts of the cache flushCount = 0; flush(true);}void Cache::statistics(){ CachedObject *o; // this function is for debugging purposes only init(); int size = 0; int msize = 0; int movie = 0; int stylesheets = 0; QDictIterator<CachedObject> it(*cache); for(it.toFirst(); it.current(); ++it) { o = it.current(); if(o->type() == CachedObject::Image) { CachedImage *im = static_cast<CachedImage *>(o); if(im->m != 0) { movie++; msize += im->size(); } } else { if(o->type() == CachedObject::CSSStyleSheet) stylesheets++; } size += o->size(); } size /= 1024; kdDebug( 6060 ) << "------------------------- image cache statistics -------------------" << endl; kdDebug( 6060 ) << "Number of items in cache: " << cache->count() << endl; kdDebug( 6060 ) << "Number of items in lru : " << m_countOfLRUAndUncacheableLists << endl; kdDebug( 6060 ) << "Number of cached images: " << cache->count()-movie << endl; kdDebug( 6060 ) << "Number of cached movies: " << movie << endl; kdDebug( 6060 ) << "Number of cached stylesheets: " << stylesheets << endl; kdDebug( 6060 ) << "pixmaps: allocated space approx. " << size << " kB" << endl; kdDebug( 6060 ) << "movies : allocated space approx. " << msize/1024 << " kB" << endl; kdDebug( 6060 ) << "--------------------------------------------------------------------" << endl;}void Cache::removeCacheEntry( CachedObject *object ){ QString key = object->url().string(); // this indicates the deref() method of CachedObject to delete itself when the reference counter // drops down to zero object->setFree( true ); cache->remove( key ); removeFromLRUList(object); const DocLoader* dl; for ( dl=docloader->first(); dl; dl=docloader->next() ) dl->removeCachedObject( object ); if ( object->canDelete() ) delete object;}#define FAST_LOG2(_log2,_n) \ unsigned int j_ = (unsigned int)(_n); \ (_log2) = 0; \ if ((j_) & ((j_)-1)) \ (_log2) += 1; \ if ((j_) >> 16) \ (_log2) += 16, (j_) >>= 16; \ if ((j_) >> 8) \ (_log2) += 8, (j_) >>= 8; \ if ((j_) >> 4) \ (_log2) += 4, (j_) >>= 4; \ if ((j_) >> 2) \ (_log2) += 2, (j_) >>= 2; \ if ((j_) >> 1) \ (_log2) += 1;int FastLog2(unsigned int i) { int log2; FAST_LOG2(log2,i); return log2;}LRUList* Cache::getLRUListFor(CachedObject* o){ int accessCount = o->accessCount(); int queueIndex; if (accessCount == 0) { queueIndex = 0; } else { int sizeLog = FastLog2(o->size()); queueIndex = sizeLog/o->accessCount() - 1; if (queueIndex < 0) queueIndex = 0; if (queueIndex >= MAX_LRU_LISTS) queueIndex = MAX_LRU_LISTS-1; } if (m_LRULists == 0) { m_LRULists = new LRUList [MAX_LRU_LISTS]; } return &m_LRULists[queueIndex];}void Cache::removeFromLRUList(CachedObject *object){ CachedObject *next = object->m_nextInLRUList; CachedObject *prev = object->m_prevInLRUList; bool uncacheable = object->status() == CachedObject::Uncacheable; LRUList* list = uncacheable ? 0 : getLRUListFor(object); CachedObject *&head = uncacheable ? m_headOfUncacheableList : list->m_head; if (next == 0 && prev == 0 && head != object) { return; } object->m_nextInLRUList = 0; object->m_prevInLRUList = 0; if (next) next->m_prevInLRUList = prev; else if (!uncacheable && list->m_tail == object) list->m_tail = prev; if (prev) prev->m_nextInLRUList = next; else if (head == object) head = next; --m_countOfLRUAndUncacheableLists; if (!uncacheable) m_totalSizeOfLRULists -= object->size();}void Cache::moveToHeadOfLRUList(CachedObject *object){ insertInLRUList(object);}void Cache::insertInLRUList(CachedObject *object){ removeFromLRUList(object); if (!object->allowInLRUList()) return; LRUList* list = getLRUListFor(object); bool uncacheable = object->status() == CachedObject::Uncacheable; CachedObject *&head = uncacheable ? m_headOfUncacheableList : list->m_head; object->m_nextInLRUList = head; if (head) head->m_prevInLRUList = object; head = object; if (object->m_nextInLRUList == 0 && !uncacheable) list->m_tail = object; ++m_countOfLRUAndUncacheableLists; if (!uncacheable) m_totalSizeOfLRULists += object->size();}bool Cache::adjustSize(CachedObject *object, int delta){ if (object->status() == CachedObject::Uncacheable) return false; if (object->m_nextInLRUList == 0 && object->m_prevInLRUList == 0 && getLRUListFor(object)->m_head != object) return false; m_totalSizeOfLRULists += delta; return delta != 0;}// --------------------------------------CachedObjectClient *CachedObjectClientWalker::next(){ // Only advance if we already returned this item. // This handles cases where the current item is removed, and prevents us from skipping the next item. // The iterator automatically gets advanced to the next item, and we make sure we return it. if (_current == _iterator.current()) ++_iterator; _current = _iterator.current(); return _current;}// --------------------------------------void CachedObjectClient::setPixmap(const QPixmap &, const QRect&, CachedImage *) {}void CachedObjectClient::setStyleSheet(const DOM::DOMString &/*url*/, const DOM::DOMString &/*sheet*/) {}#ifndef KHTML_NO_XBLvoid CachedObjectClient::setXBLDocument(const DOM::DOMString& url, XBL::XBLDocumentImpl* doc) {}#endifvoid CachedObjectClient::notifyFinished(CachedObject * /*finishedObj*/) {}#include "loader.moc"#if APPLE_CHANGESCache::Statistics Cache::getStatistics(){ Statistics stats; if (!cache) return stats; QDictIterator<CachedObject> i(*cache); for (i.toFirst(); i.current(); ++i) { CachedObject *o = i.current(); switch (o->type()) { case CachedObject::Image: if (static_cast<CachedImage *>(o)->m) { stats.movies.count++; stats.movies.size += o->size(); } else { stats.images.count++; stats.images.size += o->size(); } break; case CachedObject::CSSStyleSheet: stats.styleSheets.count++; stats.styleSheets.size += o->size(); break; case CachedObject::Script: stats.scripts.count++; stats.scripts.size += o->size(); break;#ifndef KHTML_NO_XBL case CachedObject::XBL: stats.xblDocs.count++; stats.xblDocs.size += o->size(); break;#endif default: stats.other.count++; stats.other.size += o->size(); } } return stats;}void Cache::flushAll(){ if (!cache) return; for (;;) { QDictIterator<CachedObject> i(*cache); CachedObject *o = i.toFirst(); if (!o) break; removeCacheEntry(o); }}void Cache::setCacheDisabled(bool disabled){ cacheDisabled = disabled; if (disabled) flushAll();}#endif // APPLE_CHANGES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -