📄 khtml_part.cpp.orig
字号:
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 ) { hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT, false, false ); if ( d->m_doc ) d->m_doc->updateRendering(); d->m_bLoadEventEmitted = false; } } d->m_bComplete = true; // to avoid emitting completed() in slotFinishedParsing() (David) d->m_bLoadEventEmitted = true; // don't want that one either d->m_cachePolicy = KProtocolManager::cacheControl(); // reset cache policy disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition())); 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(); const ConstFrameIt end = d->m_frames.end(); for (; it != end; ++it ) { if ( (*it)->m_run ) (*it)->m_run->abort(); if ( !( *it )->m_part.isNull() ) ( *it )->m_part->closeURL(); } } // tell all objects to stop as well { ConstFrameIt it = d->m_objects.begin(); const ConstFrameIt end = d->m_objects.end(); for (; it != end; ++it) { if ( !( *it )->m_part.isNull() ) ( *it )->m_part->closeURL(); } } // Stop any started redirections as well!! (DA) if ( d && d->m_redirectionTimer.isActive() ) d->m_redirectionTimer.stop(); // null node activated. emit nodeActivated(Node()); // make sure before clear() runs, we pop out of a dialog's message loop if ( d->m_view ) d->m_view->closeChildDialogs(); 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;}QString KHTMLPart::documentSource() const{ QString sourceStr; if ( !( m_url.isLocalFile() ) && KHTMLPageCache::self()->isComplete( d->m_cacheId ) ) { QByteArray sourceArray; QDataStream dataStream( sourceArray, IO_WriteOnly ); KHTMLPageCache::self()->saveData( d->m_cacheId, &dataStream ); QTextStream stream( sourceArray, IO_ReadOnly ); stream.setCodec( QTextCodec::codecForName( encoding().latin1() ) ); sourceStr = stream.read(); } else { QString tmpFile; if( KIO::NetAccess::download( m_url, tmpFile, NULL ) ) { QFile f( tmpFile ); if ( f.open( IO_ReadOnly ) ) { QTextStream stream( &f ); stream.setCodec( QTextCodec::codecForName( encoding().latin1() ) ); sourceStr = stream.read(); f.close(); } KIO::NetAccess::removeTempFile( tmpFile ); } } return sourceStr;}KParts::BrowserExtension *KHTMLPart::browserExtension() const{ return d->m_extension;}KParts::BrowserHostExtension *KHTMLPart::browserHostExtension() const{ return d->m_hostExtension;}KHTMLView *KHTMLPart::view() const{ return d->m_view;}void KHTMLPart::setStatusMessagesEnabled( bool enable ){ d->m_statusMessagesEnabled = enable;}KJS::Interpreter *KHTMLPart::jScriptInterpreter(){ KJSProxy *proxy = jScript(); if (!proxy || proxy->paused()) return 0; return proxy->interpreter();}bool KHTMLPart::statusMessagesEnabled() const{ return d->m_statusMessagesEnabled;}void KHTMLPart::setJScriptEnabled( bool enable ){ if ( !enable && jScriptEnabled() && d->m_frame && d->m_frame->m_jscript ) { d->m_frame->m_jscript->clear(); } d->m_bJScriptForce = enable; d->m_bJScriptOverride = true;}bool KHTMLPart::jScriptEnabled() const{ if(onlyLocalReferences()) return false; 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)// Also, change the order of "ecma" and "." in khtml's SUBDIRS line.// OK - that's the default now, use the opposite of the above instructions to go back// to "dlopening it" - but it breaks exception catching in kjs_binding.cpp#define DIRECT_LINKAGE_TO_ECMA#ifdef DIRECT_LINKAGE_TO_ECMAextern "C" { KJSProxy *kjs_html_init(khtml::ChildFrame * childframe); }#endifstatic bool createJScript(khtml::ChildFrame *frame){#ifndef DIRECT_LINKAGE_TO_ECMA KLibrary *lib = KLibLoader::self()->library("kjs_html"); if ( !lib ) { setJScriptEnabled( false ); return false; } // look for plain C init function void *sym = lib->symbol("kjs_html_init"); if ( !sym ) { lib->unload(); setJScriptEnabled( false ); return false; } typedef KJSProxy* (*initFunction)(khtml::ChildFrame *); initFunction initSym = (initFunction) sym; frame->m_jscript = (*initSym)(d->m_frame); frame->m_kjs_lib = lib;#else frame->m_jscript = kjs_html_init(frame); // frame->m_kjs_lib remains 0L.#endif return true;}KJSProxy *KHTMLPart::jScript(){ if (!jScriptEnabled()) return 0; if ( !d->m_frame ) { KHTMLPart * p = parentPart(); if (!p) { d->m_frame = new khtml::ChildFrame; d->m_frame->m_part = this; } else { ConstFrameIt it = p->d->m_frames.begin(); const ConstFrameIt end = p->d->m_frames.end(); for (; it != end; ++it) if ((*it)->m_part.operator->() == this) { d->m_frame = *it; break; } } if ( !d->m_frame ) return 0; } if ( !d->m_frame->m_jscript ) if (!createJScript(d->m_frame)) return 0; if (d->m_bJScriptDebugEnabled) d->m_frame->m_jscript->setDebugEnabled(true); return d->m_frame->m_jscript;}QVariant KHTMLPart::crossFrameExecuteScript(const QString& target, const QString& script){ KHTMLPart* destpart = this; QString trg = target.lower(); if (target == "_top") { while (destpart->parentPart()) destpart = destpart->parentPart(); } else if (target == "_parent") { if (parentPart()) destpart = parentPart(); } else if (target == "_self" || target == "_blank") { // we always allow these } else { destpart = findFrame(target); if (!destpart) destpart = this; } // easy way out? if (destpart == this) return executeScript(DOM::Node(), script); // now compare the domains if (destpart->checkFrameAccess(this)) return destpart->executeScript(DOM::Node(), script); // eww, something went wrong. better execute it in our frame return executeScript(DOM::Node(), script);}//Enable this to see all JS scripts being executed//#define KJS_VERBOSEKJSErrorDlg *KHTMLPart::jsErrorExtension() {#ifndef KONQ_EMBEDDED if (!d->m_settings->jsErrorsEnabled()) { return 0L; } if (parentPart()) { return parentPart()->jsErrorExtension(); } if (!d->m_statusBarJSErrorLabel) { d->m_statusBarJSErrorLabel = new KURLLabel(d->m_statusBarExtension->statusBar()); d->m_statusBarJSErrorLabel->setFixedHeight(instance()->iconLoader()->currentSize(KIcon::Small)); d->m_statusBarJSErrorLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); d->m_statusBarJSErrorLabel->setUseCursor(false); d->m_statusBarExtension->addStatusBarItem(d->m_statusBarJSErrorLabel, 0, false); QToolTip::add(d->m_statusBarJSErrorLabel, i18n("This web page contains coding errors.")); d->m_statusBarJSErrorLabel->setPixmap(SmallIcon("bug", instance())); connect(d->m_statusBarJSErrorLabel, SIGNAL(leftClickedURL()), SLOT(launchJSErrorDialog())); connect(d->m_statusBarJSErrorLabel, SIGNAL(rightClickedURL()), SLOT(jsErrorDialogContextMenu())); } if (!d->m_jsedlg) { d->m_jsedlg = new KJSErrorDlg; d->m_jsedlg->setURL(m_url.prettyURL()); if (KGlobalSettings::showIconsOnPushButtons()) { d->m_jsedlg->_clear->setIconSet(SmallIconSet("locationbar_erase")); d->m_jsedlg->_close->setIconSet(SmallIconSet("fileclose")); } } return d->m_jsedlg;#else // KONQ_EMBEDDED return 0;#endif}void KHTMLPart::removeJSErrorExtension() {#ifndef KONQ_EMBEDDED if (parentPart()) { parentPart()->removeJSErrorExtension(); return; } if (d->m_statusBarJSErrorLabel != 0) { d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarJSErrorLabel ); delete d->m_statusBarJSErrorLabel; d->m_statusBarJSErrorLabel = 0; } delete d->m_jsedlg; d->m_jsedlg = 0;#endif // KONQ_EMBEDDED}void KHTMLPart::disableJSErrorExtension() {#ifndef KONQ_EMBEDDED removeJSErrorExtension(); // These two lines are really kind of hacky, and it sucks to do this inside // KHTML but I don't know of anything that's reasonably easy as an alternative // right now. It makes me wonder if there should be a more clean way to // contact all running "KHTML" instance as opposed to Konqueror instances too. d->m_settings->setJSErrorsEnabled(false); DCOPClient::mainClient()->send("konqueror*", "KonquerorIface", "reparseConfiguration()", QByteArray());#endif // KONQ_EMBEDDED}void KHTMLPart::jsErrorDialogContextMenu() { KPopupMenu *m = new KPopupMenu(0L); m->insertItem(i18n("&Hide Errors"), this, SLOT(removeJSErrorExtension())); m->insertItem(i18n("&Disable Error Reporting"), this, SLOT(disableJSErrorExtension())); m->popup(QCursor::pos());}void KHTMLPart::launchJSErrorDialog() { KJSErrorDlg *dlg = jsErrorExtension(); if (dlg) { dlg->show(); dlg->raise(); }}void KHTMLPart::launchJSConfigDialog() { QStringList args; args << "khtml_java_js"; KApplication::kdeinitExec( "kcmshell", args );}QVariant KHTMLPart::executeScript(const QString& filename, int baseLine, const DOM::Node& n, const QString& script){#ifdef KJS_VERBOSE // The script is now printed by KJS's Parser::parse kdDebug(6070) << "executeScript: caller='" << name() << "' filename=" << filename << " baseLine=" << baseLine /*<< " script=" << script*/ << endl;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -