📄 loader.cpp
字号:
#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
}
#ifdef KHTML_XSLT
CachedXSLStyleSheet* DocLoader::requestXSLStyleSheet(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
CachedXSLStyleSheet *cachedObject = Cache::requestXSLStyleSheet(this, url, reload, m_expireDate);
KWQCheckCacheObjectStatus(this, cachedObject);
return cachedObject;
#else
return Cache::requestXSLStyleSheet(this, url, reload, m_expireDate);
#endif
}
#endif
#ifndef KHTML_NO_XBL
CachedXBLDocument* 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
}
#endif
void 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()
{
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());
#if APPLE_CHANGES
KIO::TransferJob* job = KIO::get( u, false, false /*no GUI*/, true);
#else
KIO::TransferJob* job = KIO::get( u, false, false /*no GUI*/);
#endif
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");
}
#if NOKIA_CHANGES
connect( job, SIGNAL( result( KIO::Job *, const TDesC8 &) ), this, SLOT( slotFinished( KIO::Job *, const TDesC8 &) ) );
if (req->m_docLoader->doc()->part()->fastDisplayState() == KHTMLPart::ShowingFastDisplayDocument) {
// prefer other content over images (higher number==lower priority)
if (req->object->type()==CachedObject::Image)
job->addMetaData("priority","2");
else
job->addMetaData("priority","1");
}
#else
#if APPLE_CHANGES
connect( job, SIGNAL( result( KIO::Job *, NSData *) ), this, SLOT( slotFinished( KIO::Job *, NSData *) ) );
#else
connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotFinished( KIO::Job * ) ) );
#endif
#endif
#if APPLE_CHANGES
connect( job, SIGNAL( data( KIO::Job*, const char *, int)),
SLOT( slotData( KIO::Job*, const char *, int)));
#if NOKIA_CHANGES
connect( job, SIGNAL( receivedResponse( KIO::Job *, MWebCoreUrlResponseHeaderInfo *)), SLOT( slotReceivedResponse( KIO::Job *, MWebCoreUrlResponseHeaderInfo *)) );
#else
connect( job, SIGNAL( receivedResponse( KIO::Job *, NSURLResponse *)), SLOT( slotReceivedResponse( KIO::Job *, NSURLResponse *)) );
#endif
if (KWQServeRequest(this, req, job)) {
if (req->object->type() == CachedObject::Image) {
CachedImage *ci = static_cast<CachedImage*>(req->object);
if (ci->decoderCallback()) {
m_requestsBackgroundDecoding.append(req);
}
}
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
}
#if !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 );
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);
}
r->object->finish();
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "Loader:: JOB FINISHED " << r->object << ": " << r->object->url().string() << endl;
#endif
delete r;
servePendingRequests();
}
#else // APPLE_CHANGES
#if NOKIA_CHANGES
void Loader::slotFinished( KIO::Job* job, const TDesC8 &allData)
#else
void Loader::slotFinished( KIO::Job* job, NSData *allData)
#endif
{
Request *r = m_requestsLoading.take( job );
KIO::TransferJob* j = static_cast<KIO::TransferJob*>(job);
if ( !r )
return;
CachedObject *object = r->object;
DocLoader *docLoader = r->m_docLoader;
bool backgroundImageDecoding = (object->type() == CachedObject::Image &&
static_cast<CachedImage*>(object)->decoderCallback());
if (j->error() || j->isErrorPage()) {
// Use the background image decoder's callback to handle the error.
if (backgroundImageDecoding) {
CachedImageCallback *callback = static_cast<CachedImage*>(object)->decoderCallback();
callback->handleError();
}
else {
r->object->error( job->error(), job->errorText().ascii() );
emit requestFailed( docLoader, object );
Cache::removeCacheEntry( object );
}
}
else {
object->data(r->m_buffer, true);
#if !NOKIA_CHANGES
r->object->setAllData(allData);
#endif
// Let the background image decoder trigger the done signal.
if (!backgroundImageDecoding)
emit requestDone( docLoader, object );
object->finish();
}
// Let the background image decoder release the request when it is
// finished.
if (!backgroundImageDecoding) {
delete r;
}
servePendingRequests();
}
#endif
#if APPLE_CHANGES
#if NOKIA_CHANGES
void Loader::slotReceivedResponse(KIO::Job* job, MWebCoreUrlResponseHeaderInfo *response)
#else
void Loader::slotReceivedResponse(KIO::Job* job, NSURLResponse *response)
#endif
{
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_CHANGES
void Loader::slotData( KIO::Job*job, const char *data, int size )
#else
void Loader::slotData( KIO::Job*job, const QByteArray &data )
#endif
{
OOM_PRE_CHECK( size, size, "Loader::slotData" )
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 );
OOM_POST_CHECK_FAILED(return;)
}
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++;
#if APPLE_CHANGES
QPtrListIterator<Request> bdIt( m_requestsBackgroundDecoding );
for (; bdIt.current(); ++bdIt )
if ( bdIt.current()->m_docLoader == dl )
res++;
#endif
return res;
}
#if NOKIA_CHANGES
int Loader::numRequests( DocLoader* dl, CachedObject::Type type ) const
{
int res = 0;
QPtrListIterator<Request> pIt( m_requestsPending );
for (; pIt.current(); ++pIt )
if ( pIt.current()->m_docLoader == dl && pIt.current()->object->type() == type )
res++;
QPtrDictIterator<Request> lIt( m_requestsLoading );
for (; lIt.current(); ++lIt )
if ( lIt.current()->m_docLoader == dl && lIt.current()->object->type() == type )
res++;
#if APPLE_CHANGES
QPtrListIterator<Request> bdIt( m_requestsBackgroundDecoding );
for (; bdIt.current(); ++bdIt )
if ( bdIt.current()->m_docLoader == dl && bdIt.current()->object->type() == type )
res++;
#endif
return res;
}
#endif
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -