📄 khtml_part.cpp
字号:
d->m_bPluginsEnabled = d->m_settings->isPluginsEnabled(url.host());
#endif
m_url = url;
KHTMLPageCache::self()->fetchData( d->m_cacheId, this, SLOT(slotRestoreData(const QByteArray &)));
emit started( 0L );
return true;
}
#if APPLE_CHANGES
bool KHTMLPart::didOpenURL(const KURL &url)
#else
bool KHTMLPart::openURL( const KURL &url )
#endif
{
kdDebug( 6050 ) << "KHTMLPart(" << this << ")::openURL " << url.url() << endl;
if (d->m_scheduledRedirection == locationChangeScheduledDuringLoad) {
// We're about to get a redirect that happened before the document was
// created. This can happen when one frame may change the location of a
// sibling.
return false;
}
cancelRedirection();
// clear last edit command
d->m_lastEditCommand = EditCommandPtr();
#if APPLE_CHANGES
KWQ(this)->clearUndoRedoOperations();
#endif
#if !APPLE_CHANGES
// check to see if this is an "error://" URL. This is caused when an error
// occurs before this part was loaded (e.g. KonqRun), and is passed to
// khtmlpart so that it can display the error.
if ( url.protocol() == "error" && url.hasSubURL() ) {
closeURL();
/**
* The format of the error url is that two variables are passed in the query:
* error = int kio error code, errText = QString error text from kio
* and the URL where the error happened is passed as a sub URL.
*/
KURL::List urls = KURL::split( url );
//kdDebug() << "Handling error URL. URL count:" << urls.count() << endl;
if ( urls.count() > 1 ) {
KURL mainURL = urls.first();
int error = mainURL.queryItem( "error" ).toInt();
// error=0 isn't a valid error code, so 0 means it's missing from the URL
if ( error == 0 ) error = KIO::ERR_UNKNOWN;
QString errorText = mainURL.queryItem( "errText" );
urls.pop_front();
d->m_workingURL = KURL::join( urls );
//kdDebug() << "Emitting fixed URL " << d->m_workingURL.prettyURL() << endl;
emit d->m_extension->setLocationBarURL( d->m_workingURL.prettyURL() );
htmlError( error, errorText, d->m_workingURL );
return true;
}
}
#endif // APPLE_CHANGES
KParts::URLArgs args( d->m_extension->urlArgs() );
#if !APPLE_CHANGES
// in case we have a) no frameset (don't test m_frames.count(), iframes get in there)
// b) the url is identical with the currently
// displayed one (except for the htmlref!) , c) the url request is not a POST
// operation and d) the caller did not request to reload the page we try to
// be smart and instead of reloading the whole document we just jump to the
// request html anchor
if (d->m_doc) {
bool isFrameSet = false;
if ( d->m_doc->isHTMLDocument() ) {
HTMLDocumentImpl* htmlDoc = static_cast<HTMLDocumentImpl*>(d->m_doc);
isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
}
if ( !isFrameSet &&
urlcmp( url.url(), m_url.url(), true, true ) &&
url.hasRef() && !args.doPost() && !args.reload )
{
kdDebug( 6050 ) << "KHTMLPart::openURL, jumping to anchor. m_url = " << url.url() << endl;
m_url = url;
emit started( 0L );
gotoAnchor();
d->m_bComplete = true;
d->m_doc->setParsing(false);
kdDebug( 6050 ) << "completed..." << endl;
emit completed();
return true;
}
}
#endif // APPLE_CHANGES
if (!d->m_restored)
{
kdDebug( 6050 ) << "closing old URL" << endl;
closeURL();
}
#if !APPLE_CHANGES
args.metaData().insert("main_frame_request", parentPart() == 0 ? "TRUE" : "FALSE" );
args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE" : "FALSE" );
args.metaData().insert("ssl_activate_warnings", "TRUE" );
#endif
if (d->m_restored)
d->m_cachePolicy = KIO::CC_Cache;
else if (args.reload)
d->m_cachePolicy = KIO::CC_Refresh;
else
d->m_cachePolicy = KIO::CC_Verify;
if ( args.doPost() && (url.protocol().startsWith("http")) )
{
d->m_job = KIO::http_post( url, args.postData, false );
d->m_job->addMetaData("content-type", args.contentType() );
}
else
{
d->m_job = KIO::get( url, false, false );
d->m_job->addMetaData("cache", KIO::getCacheControlString(d->m_cachePolicy));
}
d->m_job->addMetaData(args.metaData());
connect( d->m_job, SIGNAL( result( KIO::Job * ) ),
SLOT( slotFinished( KIO::Job * ) ) );
#if !APPLE_CHANGES
connect( d->m_job, SIGNAL( data( KIO::Job*, const QByteArray &)),
SLOT( slotData( KIO::Job*, const QByteArray &)));
#endif
connect( d->m_job, SIGNAL(redirection(KIO::Job*, const KURL&) ),
SLOT( slotRedirection(KIO::Job*,const KURL&) ) );
d->m_bComplete = false;
d->m_bLoadingMainResource = true;
d->m_bLoadEventEmitted = false;
// delete old status bar msg's from kjs (if it _was_ activated on last URL)
if( d->m_bJScriptEnabled )
{
d->m_kjsStatusBarText = QString::null;
d->m_kjsDefaultStatusBarText = QString::null;
}
// set the javascript flags according to the current url
#if !APPLE_CHANGES
d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
#else
d->m_bJScriptDebugEnabled = d->m_settings->isJavaScriptDebugEnabled();
d->m_bJavaEnabled = d->m_settings->isJavaEnabled(url.host());
d->m_bPluginsEnabled = d->m_settings->isPluginsEnabled(url.host());
#endif
// initializing m_url to the new url breaks relative links when opening such a link after this call and _before_ begin() is called (when the first
// data arrives) (Simon)
m_url = url;
if(m_url.protocol().startsWith( "http" ) && !m_url.host().isEmpty() &&
m_url.path().isEmpty()) {
m_url.setPath("/");
emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
}
// copy to m_workingURL after fixing m_url above
d->m_workingURL = m_url;
kdDebug( 6050 ) << "KHTMLPart::openURL now (before started) m_url = " << m_url.url() << endl;
connect( d->m_job, SIGNAL( speed( KIO::Job*, unsigned long ) ),
this, SLOT( slotJobSpeed( KIO::Job*, unsigned long ) ) );
connect( d->m_job, SIGNAL( percent( KIO::Job*, unsigned long ) ),
this, SLOT( slotJobPercent( KIO::Job*, unsigned long ) ) );
emit started( 0L );
return true;
}
void KHTMLPart::didExplicitOpen()
{
d->m_bComplete = false;
d->m_bLoadEventEmitted = false;
}
bool KHTMLPart::closeURL()
{
if (d->m_doc && d->m_doc->tokenizer()) {
d->m_doc->tokenizer()->stopParsing();
}
if ( d->m_job )
{
KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
d->m_job->kill();
d->m_job = 0;
}
if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
HTMLDocumentImpl* hdoc = static_cast<HTMLDocumentImpl*>( d->m_doc );
if ( hdoc->body() && d->m_bLoadEventEmitted && !d->m_bUnloadEventEmitted ) {
hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT, false, false );
if ( d->m_doc )
d->m_doc->updateRendering();
d->m_bUnloadEventEmitted = true;
}
}
d->m_bComplete = true; // to avoid emitting completed() in slotFinishedParsing() (David)
d->m_bLoadingMainResource = false;
d->m_bLoadEventEmitted = true; // don't want that one either
d->m_cachePolicy = KIO::CC_Verify; // Why here?
KHTMLPageCache::self()->cancelFetch(this);
if ( d->m_doc && d->m_doc->parsing() )
{
kdDebug( 6050 ) << " was still parsing... calling end " << endl;
slotFinishedParsing();
d->m_doc->setParsing(false);
}
if ( !d->m_workingURL.isEmpty() )
{
// Aborted before starting to render
kdDebug( 6050 ) << "Aborted before starting to render, reverting location bar to " << m_url.prettyURL() << endl;
emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
}
d->m_workingURL = KURL();
if ( d->m_doc && d->m_doc->docLoader() )
khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
// tell all subframes to stop as well
ConstFrameIt it = d->m_frames.begin();
ConstFrameIt end = d->m_frames.end();
for (; it != end; ++it )
if ( !( *it ).m_part.isNull() )
( *it ).m_part->closeURL();
d->m_bPendingChildRedirection = false;
// Stop any started redirections as well!! (DA)
cancelRedirection();
// null node activated.
emit nodeActivated(Node());
#if NOKIA_CHANGES
if ( d->m_doc )
{
d->m_doc->setFastDisplayMode( false );
d->m_fastDisplayState = ShowingFinalDocument;
}
#endif
return true;
}
DOM::HTMLDocument KHTMLPart::htmlDocument() const
{
if (d->m_doc && d->m_doc->isHTMLDocument())
return static_cast<HTMLDocumentImpl*>(d->m_doc);
else
return static_cast<HTMLDocumentImpl*>(0);
}
DOM::Document KHTMLPart::document() const
{
return d->m_doc;
}
KParts::BrowserExtension *KHTMLPart::browserExtension() const
{
return d->m_extension;
}
KHTMLView *KHTMLPart::view() const
{
return d->m_view;
}
void KHTMLPart::setJScriptEnabled( bool enable )
{
if ( !enable && jScriptEnabled() && d->m_jscript ) {
d->m_jscript->clear();
}
d->m_bJScriptForce = enable;
d->m_bJScriptOverride = true;
}
bool KHTMLPart::jScriptEnabled() const
{
if ( d->m_bJScriptOverride )
return d->m_bJScriptForce;
return d->m_bJScriptEnabled;
}
void KHTMLPart::setMetaRefreshEnabled( bool enable )
{
d->m_metaRefreshEnabled = enable;
}
bool KHTMLPart::metaRefreshEnabled() const
{
return d->m_metaRefreshEnabled;
}
// Define this to disable dlopening kjs_html, when directly linking to it.
// You need to edit khtml/Makefile.am to add ./ecma/libkjs_html.la to LIBADD
// and to edit khtml/ecma/Makefile.am to s/kjs_html/libkjs_html/, remove libkhtml from LIBADD,
// remove LDFLAGS line, and replace kde_module with either lib (shared) or noinst (static)
//#define DIRECT_LINKAGE_TO_ECMA
#ifdef DIRECT_LINKAGE_TO_ECMA
extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
#endif
KJSProxy *KHTMLPart::jScript()
{
if (!jScriptEnabled()){
return 0;
}
if ( !d->m_jscript )
{
#ifndef DIRECT_LINKAGE_TO_ECMA
KLibrary *lib = KLibLoader::self()->library("kjs_html");
if ( !lib ) {
setJScriptEnabled( false );
return 0;
}
// look for plain C init function
void *sym = lib->symbol("kjs_html_init");
if ( !sym ) {
lib->unload();
setJScriptEnabled( false );
return 0;
}
typedef KJSProxy* (*initFunction)(KHTMLPart *);
initFunction initSym = (initFunction) sym;
d->m_jscript = (*initSym)(this);
d->m_kjs_lib = lib;
#else
d->m_jscript = kjs_html_init(this);
// d->m_kjs_lib remains 0L.
#endif
if (d->m_bJScriptDebugEnabled)
d->m_jscript->setDebugEnabled(true);
}
return d->m_jscript;
}
void KHTMLPart::replaceContentsWithScriptResult( const KURL &url )
{
QString script = KURL::decode_string(url.url().mid(strlen("javascript:")));
QVariant ret = executeScript(script);
if (ret.type() == QVariant::String) {
begin();
write(ret.asString());
end();
}
}
QVariant KHTMLPart::executeScript( const QString &script, bool forceUserGesture )
{
return executeScript( DOM::Node(), script, forceUserGesture );
}
//Enable this to see all JS scripts being executed
//#define KJS_VERBOSE
QVariant KHTMLPart::executeScript( const DOM::Node &n, const QString &script, bool forceUserGesture )
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "KHTMLPart::executeScript n=" << n.nodeName().string().latin1() << "(" << (n.isNull() ? 0 : n.nodeType()) << ") " << script << endl;
#endif
KJSProxy *proxy = jScript();
if (!proxy || proxy->paused())
return QVariant();
d->m_runningScripts++;
// If forceUserGesture is true, then make the script interpreter
// treat it as if triggered by a user gesture even if there is no
// current DOM event being processed.
QVariant ret = proxy->evaluate( forceUserGesture ? QString::null : m_url.url(), 0, script, n );
d->m_runningScripts--;
if (!d->m_runningScripts && d->m_doc && !d->m_doc->parsing() && d->m_submitForm )
submitFormAgain();
DocumentImpl::updateDocumentsRendering();
#ifdef KJS_VERBOSE
kdDebug(6070) << "KHTMLPart::executeScript - done" << endl;
#endif
return ret;
}
bool KHTMLPart::scheduleScript(const DOM::Node &n, const QString& script)
{
//kdDebug(6050) << "KHTMLPart::scheduleScript "<< script << endl;
d->scheduledScript = script;
d->scheduledScriptNode = n;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -