📄 khtml_part.cpp
字号:
scheduleRedirection( delay, m_url.url(), delay <= 1);
#else
scheduleRedirection( delay, m_url.url());
#endif
}
else
{
int end_pos = qData.length();
delay = qData.left(pos).stripWhiteSpace().toDouble();
while ( qData[++pos] == ' ' );
if ( qData.find( "url", pos, false ) == pos )
{
pos += 3;
while (qData[pos] == ' ' || qData[pos] == '=' )
pos++;
if ( qData[pos] == '"' )
{
pos++;
int index = end_pos-1;
while( index > pos )
{
if ( qData[index] == '"' )
break;
index--;
}
if ( index > pos )
end_pos = index;
}
}
#if APPLE_CHANGES
// We want a new history item if the refresh timeout > 1 second
scheduleRedirection( delay, d->m_doc->completeURL( qData.mid( pos, end_pos ) ), delay <= 1);
#else
scheduleRedirection( delay, d->m_doc->completeURL( qData.mid( pos, end_pos ) ));
#endif
}
d->m_bHTTPRefresh = true;
}
// Support for http last-modified
d->m_lastModified = d->m_job->queryMetaData("modified");
//kdDebug() << "KHTMLPart::slotData metadata modified: " << d->m_lastModified << endl;
#if NOKIA_CHANGES
// force fast first display mode to be off
d->m_doc->setFastDisplayMode(false);
if (d->m_doc->isHTMLDocument())
static_cast<khtml::HTMLTokenizer*>(d->m_doc->tokenizer())->setForceSynchronous(true);
d->m_fastDisplayState = d->m_fastFirstDisplayMode ? ShowingInitialDocument : ShowingFinalDocument;
//d->m_fastDisplayState = ShowingFinalDocument;
d->m_pendingSrc = QString();
#endif
}
#if !APPLE_CHANGES
void KHTMLPart::slotData( KIO::Job* kio_job, const QByteArray &data )
{
assert ( d->m_job == kio_job );
//kdDebug( 6050 ) << "slotData: " << data.size() << endl;
// The first data ?
if ( !d->m_workingURL.isEmpty() )
receivedFirstData( );
KHTMLPageCache::self()->addData(d->m_cacheId, data);
write( data.data(), data.size() );
}
void KHTMLPart::slotRestoreData(const QByteArray &data )
{
// The first data ?
if ( !d->m_workingURL.isEmpty() )
{
long saveCacheId = d->m_cacheId;
begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
d->m_cacheId = saveCacheId;
d->m_workingURL = KURL();
}
//kdDebug( 6050 ) << "slotRestoreData: " << data.size() << endl;
write( data.data(), data.size() );
if (data.size() == 0)
{
//kdDebug( 6050 ) << "slotRestoreData: <<end of data>>" << endl;
// End of data.
if (d->m_doc && d->m_doc->parsing())
end(); //will emit completed()
}
}
void KHTMLPart::showError( KIO::Job* job )
{
kdDebug() << "KHTMLPart::showError d->m_bParsing=" << (d->m_doc && d->m_doc->parsing()) << " d->m_bComplete=" << d->m_bComplete
<< " d->m_bCleared=" << d->m_bCleared << endl;
if (job->error() == KIO::ERR_NO_CONTENT)
return;
if ( (d->m_doc && d->m_doc->parsing()) || d->m_workingURL.isEmpty() ) // if we got any data already
job->showErrorDialog( /*d->m_view*/ );
else
{
htmlError( job->error(), job->errorText(), d->m_workingURL );
}
}
// This is a protected method, placed here because of it's relevance to showError
void KHTMLPart::htmlError( int errorCode, const QString& text, const KURL& reqUrl )
{
kdDebug(6050) << "KHTMLPart::htmlError errorCode=" << errorCode << " text=" << text << endl;
// make sure we're not executing any embedded JS
bool bJSFO = d->m_bJScriptForce;
bool bJSOO = d->m_bJScriptOverride;
d->m_bJScriptForce = false;
d->m_bJScriptOverride = true;
begin();
QString errText = QString::fromLatin1( "<HTML><HEAD><TITLE>" );
errText += i18n( "Error while loading %1" ).arg( reqUrl.htmlURL() );
errText += QString::fromLatin1( "</TITLE></HEAD><BODY><P>" );
errText += i18n( "An error occured while loading <B>%1</B>:" ).arg( reqUrl.htmlURL() );
errText += QString::fromLatin1( "</P><P>" );
QString kioErrString = KIO::buildErrorString( errorCode, text );
kioErrString.replace(QRegExp("&"), QString("&"));
kioErrString.replace(QRegExp("<"), QString("<"));
kioErrString.replace(QRegExp(">"), QString(">"));
// In case the error string has '\n' in it, replace with <BR/>
kioErrString.replace( QRegExp("\n"), "<BR/>" );
errText += kioErrString;
errText += QString::fromLatin1( "</P></BODY></HTML>" );
write(errText);
end();
d->m_bJScriptForce = bJSFO;
d->m_bJScriptOverride = bJSOO;
// make the working url the current url, so that reload works and
// emit the progress signals to advance one step in the history
// (so that 'back' works)
m_url = reqUrl; // same as d->m_workingURL
d->m_workingURL = KURL();
emit started( 0 );
emit completed();
return;
// following disabled until 3.1
QString errorName, techName, description;
QStringList causes, solutions;
QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
QDataStream stream(raw, IO_ReadOnly);
stream >> errorName >> techName >> description >> causes >> solutions;
QString url, protocol, datetime;
url = reqUrl.prettyURL();
protocol = reqUrl.protocol();
datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
false );
QString doc = QString::fromLatin1( "<html><head><title>" );
doc += i18n( "Error: " );
doc += errorName;
doc += QString::fromLatin1( " - %1</title></head><body><h1>" ).arg( url );
doc += i18n( "The requested operation could not be completed" );
doc += QString::fromLatin1( "</h1><h2>" );
doc += errorName;
doc += QString::fromLatin1( "</h2>" );
if ( techName != QString::null ) {
doc += QString::fromLatin1( "<h2>" );
doc += i18n( "Technical Reason: " );
doc += techName;
doc += QString::fromLatin1( "</h2>" );
}
doc += QString::fromLatin1( "<h3>" );
doc += i18n( "Details of the Request:" );
doc += QString::fromLatin1( "</h3><ul><li>" );
doc += i18n( "URL: %1" ).arg( url );
doc += QString::fromLatin1( "</li><li>" );
if ( protocol != QString::null ) {
// uncomment for 3.1... i18n change
// doc += i18n( "Protocol: %1" ).arg( protocol ).arg( protocol );
doc += QString::fromLatin1( "</li><li>" );
}
doc += i18n( "Date and Time: %1" ).arg( datetime );
doc += QString::fromLatin1( "</li><li>" );
doc += i18n( "Additional Information: %1" ).arg( text );
doc += QString::fromLatin1( "</li></ul><h3>" );
doc += i18n( "Description:" );
doc += QString::fromLatin1( "</h3><p>" );
doc += description;
doc += QString::fromLatin1( "</p>" );
if ( causes.count() ) {
doc += QString::fromLatin1( "<h3>" );
doc += i18n( "Possible Causes:" );
doc += QString::fromLatin1( "</h3><ul><li>" );
doc += causes.join( "</li><li>" );
doc += QString::fromLatin1( "</li></ul>" );
}
if ( solutions.count() ) {
doc += QString::fromLatin1( "<h3>" );
doc += i18n( "Possible Solutions:" );
doc += QString::fromLatin1( "</h3><ul><li>" );
doc += solutions.join( "</li><li>" );
doc += QString::fromLatin1( "</li></ul>" );
}
doc += QString::fromLatin1( "</body></html>" );
write( doc );
end();
}
#endif
void KHTMLPart::slotFinished( KIO::Job * job )
{
if (job->error())
{
KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
d->m_job = 0L;
#if !APPLE_CHANGES
emit canceled( job->errorString() );
#endif
// TODO: what else ?
checkCompleted();
#if !APPLE_CHANGES
showError( job );
#endif
return;
}
//kdDebug( 6050 ) << "slotFinished" << endl;
KHTMLPageCache::self()->endData(d->m_cacheId);
if ( d->m_doc && d->m_doc->docLoader()->expireDate() && m_url.protocol().lower().startsWith("http"))
KIO::http_update_cache(m_url, false, d->m_doc->docLoader()->expireDate());
d->m_workingURL = KURL();
d->m_job = 0L;
if (d->m_doc->parsing())
end(); //will emit completed()
}
#if APPLE_CHANGES
void KHTMLPart::childBegin()
{
// We need to do this when the child is created so as to avoid the bogus state of the parent's
// child->m_bCompleted being false but the child's m_bComplete being true. If the child gets
// an error early on, we had trouble where checkingComplete on the child was a NOP because
// it thought it was already complete, and thus the parent was never signaled, and never set
// its child->m_bComplete.
d->m_bComplete = false;
}
#endif
void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset )
{
#if APPLE_CHANGES
// If we aren't loading an actual URL, then we need to make sure
// that we have at least an empty document. createEmptyDocument will
// do that if we don't have a document already.
if (d->m_workingURL.isEmpty()) {
KWQ(this)->createEmptyDocument();
}
#endif
clear();
#if APPLE_CHANGES
KWQ(this)->partClearedInBegin();
#endif
// Only do this after clearing the part, so that JavaScript can
// clean up properly if it was on for the last load.
#if !APPLE_CHANGES
d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
#else
d->m_bJScriptEnabled = d->m_settings->isJavaScriptEnabled(url.host());
#endif
d->m_bCleared = false;
d->m_cacheId = 0;
d->m_bComplete = false;
d->m_bLoadEventEmitted = false;
d->m_bLoadingMainResource = true;
if(url.isValid()) {
#if APPLE_CHANGES
KHTMLFactory::vLinks()->insert( KWQ(this)->requestedURLString() );
#else
QString urlString = url.url();
KHTMLFactory::vLinks()->insert( urlString );
QString urlString2 = url.prettyURL();
if ( urlString != urlString2 ) {
KHTMLFactory::vLinks()->insert( urlString2 );
}
#endif
}
// ###
//stopParser();
KParts::URLArgs args( d->m_extension->urlArgs() );
args.xOffset = xOffset;
args.yOffset = yOffset;
d->m_extension->setURLArgs( args );
KURL ref(url);
ref.setUser(QSTRING_NULL);
ref.setPass(QSTRING_NULL);
ref.setRef(QSTRING_NULL);
d->m_referrer = ref.url();
m_url = url;
KURL baseurl;
#if APPLE_CHANGES
// We don't need KDE chained URI handling or window caption setting
if ( !m_url.isEmpty() )
{
baseurl = m_url;
}
#else
if ( !m_url.isEmpty() )
{
KURL::List lst = KURL::split( m_url );
if ( !lst.isEmpty() )
baseurl = *lst.begin();
KURL title( baseurl );
title.setRef( QString::null );
title.setQuery( QString::null );
emit setWindowCaption( title.url() );
}
else
emit setWindowCaption( i18n( "no title", "* Unknown *" ) );
#endif
if (args.serviceType == "text/xml" || args.serviceType == "application/xml" || args.serviceType == "application/xhtml+xml" ||
args.serviceType == "text/xsl" || args.serviceType == "application/rss+xml" || args.serviceType == "application/atom+xml")
d->m_doc = DOMImplementationImpl::instance()->createDocument( d->m_view );
else
d->m_doc = DOMImplementationImpl::instance()->createHTMLDocument( d->m_view );
d->m_doc->ref();
if (!d->m_doc->attached())
d->m_doc->attach( );
d->m_doc->setURL( m_url.url() );
// We prefer m_baseURL over m_url because m_url changes when we are
// about to load a new page.
d->m_doc->setBaseURL( baseurl.url() );
#if APPLE_CHANGES
if (d->m_decoder)
d->m_doc->setDecoder(d->m_decoder);
#endif
#if !APPLE_CHANGES
d->m_doc->docLoader()->setShowAnimations( KHTMLFactory::defaultHTMLSettings()->showAnimations() );
#else
d->m_doc->docLoader()->setShowAnimations( d->m_settings->showAnimations() );
#endif
#if APPLE_CHANGES
KWQ(this)->updatePolicyBaseURL();
#endif
#if !APPLE_CHANGES
d->m_paUseStylesheet->setItems(QStringList());
d->m_paUseStylesheet->setEnabled( false );
#endif
#if !APPLE_CHANGES
setAutoloadImages( KHTMLFactory::defaultHTMLSettings()->autoLoadImages() );
QString userStyleSheet = KHTMLFactory::defaultHTMLSettings()->userStyleSheet();
#else
setAutoloadImages( d->m_settings->autoLoadImages() );
QString userStyleSheet = d->m_settings->userStyleSheet();
#endif
if ( !userStyleSheet.isEmpty() )
setUserStyleSheet( KURL( userStyleSheet ) );
#if APPLE_CHANGES
KWQ(this)->restoreDocumentState();
#else
d->m_doc->setRestoreState(args.docState);
#endif
d->m_doc->implicitOpen();
// clear widget
if (d->m_view)
d->m_view->resizeContents( 0, 0 );
connect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
#if !APPLE_CHANGES
emit d->m_extension->enableAction( "print", true );
#endif
}
void KHTMLPart::write( const char *str, int len )
{
if ( !d->m_decoder ) {
d->m_decoder = new Decoder;
if (!d->m_encoding.isNull())
d->m_decoder->setEncoding(d->m_encoding.latin1(),
d->m_haveEncoding ? Decoder::UserChosenEncoding : Decoder::EncodingFromHTTPHeader);
else {
// Inherit the default encoding from the parent frame if there is one.
const char *defaultEncoding = (parentPart() && parentPart()->d->m_decoder)
? parentPart()->d->m_decoder->encoding() : settings()->encoding().latin1();
d->m_decoder->setEncoding(defaultEncoding, Decoder::DefaultEncoding);
}
#if APPLE_CHANGES
if (d->m_doc)
d->m_doc->setDecoder(d->m_decoder);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -