📄 khtml_part.cpp
字号:
// 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_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;}bool KHTMLPart::closeURL(){ 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_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()); 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_ECMAextern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }#endifKJSProxy *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_VERBOSEQVariant 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; return true;}QVariant KHTMLPart::executeScheduledScript(){ if( d->scheduledScript.isEmpty() ) return QVariant(); //kdDebug(6050) << "executing delayed " << d->scheduledScript << endl; QVariant ret = executeScript( d->scheduledScriptNode, d->scheduledScript ); d->scheduledScript = QString(); d->scheduledScriptNode = DOM::Node(); return ret;}void KHTMLPart::setJavaEnabled( bool enable ){ d->m_bJavaForce = enable; d->m_bJavaOverride = true;}bool KHTMLPart::javaEnabled() const{#ifndef Q_WS_QWS if( d->m_bJavaOverride ) return d->m_bJavaForce; return d->m_bJavaEnabled;#else return false;#endif}KJavaAppletContext *KHTMLPart::javaContext(){#ifndef Q_WS_QWS return d->m_javaContext;#else return 0;#endif}KJavaAppletContext *KHTMLPart::createJavaContext(){#ifndef Q_WS_QWS if ( !d->m_javaContext ) {#if APPLE_CHANGES d->m_javaContext = new KJavaAppletContext(d->m_dcopobject, this);#else d->m_javaContext = new KJavaAppletContext(d->m_dcopobject); connect( d->m_javaContext, SIGNAL(showStatus(const QString&)), this, SIGNAL(setStatusBarText(const QString&)) ); connect( d->m_javaContext, SIGNAL(showDocument(const QString&, const QString&)), this, SLOT(slotShowDocument(const QString&, const QString&)) );#endif } return d->m_javaContext;#else return 0;#endif}void KHTMLPart::setPluginsEnabled( bool enable ){ d->m_bPluginsForce = enable; d->m_bPluginsOverride = true;}bool KHTMLPart::pluginsEnabled() const{ if ( d->m_bPluginsOverride ) return d->m_bPluginsForce; return d->m_bPluginsEnabled;}#if !APPLE_CHANGESvoid KHTMLPart::slotShowDocument( const QString &url, const QString &target ){ // this is mostly copied from KHTMLPart::slotChildURLRequest. The better approach // would be to put those functions into a single one. khtml::ChildFrame *child = 0; KParts::URLArgs args; args.frameName = target; QString frameName = args.frameName.lower(); if ( !frameName.isEmpty() ) { if ( frameName == QString::fromLatin1( "_top" ) ) { emit d->m_extension->openURLRequest( url, args ); return; } else if ( frameName == QString::fromLatin1( "_blank" ) ) { emit d->m_extension->createNewWindow( url, args ); return; } else if ( frameName == QString::fromLatin1( "_parent" ) ) { KParts::URLArgs newArgs( args ); newArgs.frameName = QString::null; emit d->m_extension->openURLRequest( url, newArgs ); return; } else if ( frameName != QString::fromLatin1( "_self" ) ) { khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -