📄 khtml_part.cpp
字号:
init( view, prof );}void KHTMLPart::init( KHTMLView *view, GUIProfile prof ){ if ( prof == DefaultGUI ) setXMLFile( "khtml.rc" ); else if ( prof == BrowserViewGUI ) setXMLFile( "khtml_browser.rc" ); d = new KHTMLPartPrivate(parent()); kdDebug(6050) << "KHTMLPart::init this=" << this << " d=" << d << endl; m_scalingFactor = 100; d->m_view = view; setWidget( d->m_view ); d->m_extension = new KHTMLPartBrowserExtension( this ); d->m_hostExtension = new KHTMLPartBrowserHostExtension( this ); d->m_paLoadImages = 0; d->m_bMousePressed = false; d->m_paViewDocument = new KAction( i18n( "View Document Source" ), 0, this, SLOT( slotViewDocumentSource() ), actionCollection(), "viewDocumentSource" ); d->m_paViewFrame = new KAction( i18n( "View Frame Source" ), 0, this, SLOT( slotViewFrameSource() ), actionCollection(), "viewFrameSource" ); d->m_paSaveBackground = new KAction( i18n( "Save &Background Image As..." ), 0, this, SLOT( slotSaveBackground() ), actionCollection(), "saveBackground" ); d->m_paSaveDocument = new KAction( i18n( "&Save As..." ), CTRL+Key_S, this, SLOT( slotSaveDocument() ), actionCollection(), "saveDocument" ); d->m_paSaveFrame = new KAction( i18n( "Save &Frame As..." ), 0, this, SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" ); d->m_paSecurity = new KAction( i18n( "Security..." ), "unlock", 0, this, SLOT( slotSecurity() ), actionCollection(), "security" ); d->m_paDebugRenderTree = new KAction( "print rendering tree to stdout", 0, this, SLOT( slotDebugRenderTree() ), actionCollection(), "debugRenderTree" ); d->m_paDebugDOMTree = new KAction( "print DOM tree to stdout", 0, this, SLOT( slotDebugDOMTree() ), actionCollection(), "debugDOMTree" ); QString foo1 = i18n("Show Images"); QString foo2 = i18n("Show Animated Images"); QString foo3 = i18n("Stop Animated Images"); d->m_paSetEncoding = new KSelectAction( i18n( "Set &Encoding" ), 0, this, SLOT( slotSetEncoding() ), actionCollection(), "setEncoding" ); QStringList encodings = KGlobal::charsets()->descriptiveEncodingNames(); encodings.prepend( i18n( "Auto" ) ); d->m_paSetEncoding->setItems( encodings ); d->m_paSetEncoding->setCurrentItem(0); d->m_paIncFontSizes = new KHTMLFontSizeAction( this, true, i18n( "Increase Font Sizes" ), "viewmag+", this, SLOT( slotIncFontSizes() ), actionCollection(), "incFontSizes" ); d->m_paDecFontSizes = new KHTMLFontSizeAction( this, false, i18n( "Decrease Font Sizes" ), "viewmag-", this, SLOT( slotDecFontSizes() ), actionCollection(), "decFontSizes" ); d->m_paDecFontSizes->setEnabled( false ); d->m_paFind = KStdAction::find( this, SLOT( slotFind() ), actionCollection(), "find" ); d->m_paPrintFrame = new KAction( i18n( "Print Frame" ), "frameprint", 0, this, SLOT( slotPrintFrame() ), actionCollection(), "printFrame" ); d->m_paSelectAll = KStdAction::selectAll( this, SLOT( slotSelectAll() ), actionCollection(), "selectAll" ); // set the default java(script) flags according to the current host. d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(); d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(); d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(); connect( this, SIGNAL( completed() ), this, SLOT( updateActions() ) ); connect( this, SIGNAL( completed( bool ) ), this, SLOT( updateActions() ) ); connect( this, SIGNAL( started( KIO::Job * ) ), this, SLOT( updateActions() ) ); d->m_popupMenuXML = KXMLGUIFactory::readConfigFile( locate( "data", "khtml/khtml_popupmenu.rc", KHTMLFactory::instance() ) ); connect( khtml::Cache::loader(), SIGNAL( requestDone( const DOM::DOMString &, khtml::CachedObject *) ), this, SLOT( slotLoaderRequestDone( const DOM::DOMString &, khtml::CachedObject *) ) ); connect( khtml::Cache::loader(), SIGNAL( requestFailed( const DOM::DOMString &, khtml::CachedObject *) ), this, SLOT( slotLoaderRequestDone( const DOM::DOMString &, khtml::CachedObject *) ) ); findTextBegin(); //reset find variables connect( &d->m_redirectionTimer, SIGNAL( timeout() ), this, SLOT( slotRedirect() ) ); d->m_view->viewport()->installEventFilter( this );}KHTMLPart::~KHTMLPart(){ if ( d->m_findDialog ) disconnect( d->m_findDialog, SIGNAL( destroyed() ), this, SLOT( slotFindDialogDestroyed() ) ); if ( d->m_manager ) { d->m_manager->setActivePart( 0 ); // Shouldn't we delete d->m_manager here ? (David) // No need to, I would say. We specify "this" as parent qobject // in ::partManager() (Simon) } stopAutoScroll(); d->m_redirectionTimer.stop(); if ( d->m_job ) d->m_job->kill(); khtml::Cache::loader()->cancelRequests( m_url.url() ); disconnect( khtml::Cache::loader(), SIGNAL( requestDone( const DOM::DOMString &, khtml::CachedObject * ) ), this, SLOT( slotLoaderRequestDone( const DOM::DOMString &, khtml::CachedObject * ) ) ); disconnect( khtml::Cache::loader(), SIGNAL( requestFailed( const DOM::DOMString &, khtml::CachedObject * ) ), this, SLOT( slotLoaderRequestDone( const DOM::DOMString &, khtml::CachedObject * ) ) ); clear(); if ( d->m_view ) { d->m_view->hide(); d->m_view->viewport()->hide(); d->m_view->m_part = 0; } delete d; d = 0; KHTMLFactory::deregisterPart( this );}bool KHTMLPart::restoreURL( const KURL &url ){ // Save charset setting (it was already restored!) QFont::CharSet charset = d->m_charset; kdDebug( 6050 ) << "KHTMLPart::restoreURL " << url.url() << endl; d->m_redirectionTimer.stop(); kdDebug( 6050 ) << "closing old URL" << endl; closeURL(); d->m_bComplete = false; d->m_bLoadEventEmitted = false; d->m_workingURL = url; // set the java(script) flags according to the current host. d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host()); d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host()); d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host()); d->m_haveCharset = true; d->m_charset = charset; d->m_settings->setCharset( d->m_charset ); m_url = url; KHTMLPageCache::self()->fetchData( d->m_cacheId, this, SLOT(slotRestoreData(const QByteArray &))); emit started( 0L ); return true;}bool KHTMLPart::openURL( const KURL &url ){ kdDebug( 6050 ) << "KHTMLPart::openURL " << url.url() << endl; d->m_redirectionTimer.stop();#ifdef SPEED_DEBUG d->m_parsetime.start();#endif KParts::URLArgs args( d->m_extension->urlArgs() ); // in case we have a) no frameset, 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_frames.count() == 0 && d->m_doc && d->m_bComplete && urlcmp( url.url(), m_url.url(), true, true ) && !url.encodedHtmlRef().isEmpty() && !args.doPost() && !args.reload ) { kdDebug( 6050 ) << "KHTMLPart::openURL now m_url = " << url.url() << endl; m_url = url; emit started( 0L ); gotoAnchor( url.encodedHtmlRef() ); d->m_bComplete = true; d->m_bParsing = false; emitLoadEvent(); kdDebug( 6050 ) << "completed..." << endl; if ( !d->m_redirectURL.isEmpty() ) emit completed(true); else emit completed(); return true; } kdDebug( 6050 ) << "closing old URL" << endl; closeURL(); 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" ); d->m_bReloading = args.reload; 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, args.reload, false ); d->m_job->addMetaData(args.metaData()); connect( d->m_job, SIGNAL( result( KIO::Job * ) ), SLOT( slotFinished( KIO::Job * ) ) ); connect( d->m_job, SIGNAL( data( KIO::Job*, const QByteArray &)), SLOT( slotData( KIO::Job*, const QByteArray &))); connect( d->m_job, SIGNAL(redirection(KIO::Job*, const KURL&) ), SLOT( slotRedirection(KIO::Job*,const KURL&) ) ); d->m_bComplete = false; d->m_bLoadEventEmitted = false; d->m_workingURL = url; // 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 d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host()); d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host()); d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host()); d->m_settings->resetCharset(); d->m_haveCharset = false; d->m_charset = d->m_settings->charset(); // 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) // That has been fixed by calling setBaseURL() in begin(). (Waldo) m_url = url; if(m_url.protocol().startsWith( "http" ) && !m_url.host().isEmpty() && m_url.path().isEmpty()) m_url.setPath("/"); kdDebug( 6050 ) << "KHTMLPart::openURL now (before started) m_url = " << m_url.url() << endl; emit started( d->m_job ); return true;}bool KHTMLPart::closeURL(){ //kdDebug( 6050 ) << "KHTMPart::closeURL called for: " << this << endl; if ( d->m_job ) { KHTMLPageCache::self()->cancelEntry(d->m_cacheId); d->m_job->kill(); d->m_job = 0; } d->m_bComplete = true; // to avoid emitting completed() in slotFinishedParsing() (David) d->m_bLoadEventEmitted = true; // don't want that one either d->m_bReloading = false; KHTMLPageCache::self()->cancelFetch(this); if ( d->m_bParsing ) { kdDebug( 6050 ) << " was still parsing... calling end " << endl; slotFinishedParsing(); d->m_bParsing = 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(); khtml::Cache::loader()->cancelRequests( m_url.url() ); // Stop any started redirections as well!! (DA) if ( d && d->m_redirectionTimer.isActive() ) d->m_redirectionTimer.stop(); // Force a ::closeURL on all the childern frames! // This should only work if the current part contains // child parts, ex: frames... (DA) if ( d->m_bPendingChildRedirection ) { d->m_bPendingChildRedirection = false; ConstFrameIt it = d->m_frames.begin(); ConstFrameIt end = d->m_frames.end(); for (; it != end; ++it ) { KParts::ReadOnlyPart *p = (*it).m_part; if ( p && p->inherits( "KHTMLPart" )) ((KHTMLPart*)p)->closeURL(); } } // 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::enableJScript( bool enable ){ setJScriptEnabled( enable );}void KHTMLPart::setJScriptEnabled( bool enable ){ 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::enableMetaRefresh( bool enable ){ d->m_metaRefreshEnabled = enable;}bool KHTMLPart::metaRefreshEnabled() const{ return d->m_metaRefreshEnabled;}KJSProxy *KHTMLPart::jScript(){ if ( d->m_bJScriptOverride && !d->m_bJScriptForce || !d->m_bJScriptOverride && !d->m_bJScriptEnabled) return 0; if ( !d->m_jscript ) { KLibrary *lib = KLibLoader::self()->library("kjs_html"); if ( !lib ) return 0; // look for plain C init function void *sym = lib->symbol("kjs_html_init"); if ( !sym ) { delete lib; return 0; } typedef KJSProxy* (*initFunction)(KHTMLPart *); initFunction initSym = (initFunction) sym; d->m_jscript = (*initSym)(this); d->m_kjs_lib = lib; kjs_lib_count++; } return d->m_jscript;}QVariant KHTMLPart::executeScript( const QString &script ){ return executeScript( DOM::Node(), script );}QVariant KHTMLPart::executeScript( const DOM::Node &n, const QString &script ){ //kdDebug(6050) << "KHTMLPart::executeScript n=" << n.nodeName().string().latin1() << "(" << n.nodeType() << ") " << script << endl; KJSProxy *proxy = jScript(); if (!proxy) return QVariant(); d->m_runningScripts++; QVariant ret = proxy->evaluate( script.unicode(), script.length(), n ); d->m_runningScripts--; if ( d->m_submitForm && !d->m_bParsing && !d->m_runningScripts) submitFormAgain(); if ( d->m_doc ) d->m_doc->updateRendering(); //kdDebug(6050) << "KHTMLPart::executeScript - done" << endl; 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::enableJava( bool enable ){ setJavaEnabled( enable );}void KHTMLPart::setJavaEnabled( bool enable ){ d->m_bJavaForce = enable; d->m_bJavaOverride = true;}bool KHTMLPart::javaEnabled() const{ if( d->m_bJavaOverride ) return d->m_bJavaForce; return d->m_bJavaEnabled;}KJavaAppletContext *KHTMLPart::javaContext(){ return d->m_javaContext;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -