📄 khtml_part.cpp
字号:
KJavaAppletContext *KHTMLPart::createJavaContext(){ if ( !d->m_javaContext ) { d->m_javaContext = new KJavaAppletContext(); 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&)) ); } return d->m_javaContext;}void KHTMLPart::enablePlugins( bool enable ){ setPluginsEnabled( enable );}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;}void 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 ); if ( !_frame ) { emit d->m_extension->openURLRequest( url, args ); return; } child = _frame; } } // TODO: handle child target correctly! currently the script are always executed fur the parent if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) { executeScript( url.right( url.length() - 11) ); return; } if ( child ) { requestObject( child, KURL(url), args ); } else if ( frameName==QString::fromLatin1("_self") ) // this is for embedded objects (via <object>) which want to replace the current document { KParts::URLArgs newArgs( args ); newArgs.frameName = QString::null; emit d->m_extension->openURLRequest( KURL(url), newArgs ); }}void KHTMLPart::slotDebugDOMTree(){ if ( d->m_doc ) d->m_doc->printTree();}void KHTMLPart::slotDebugRenderTree(){ if ( d->m_doc ) d->m_doc->renderer()->printTree();}void KHTMLPart::autoloadImages( bool enable ){ setAutoloadImages( enable );}void KHTMLPart::setAutoloadImages( bool enable ){ if ( d->m_doc && d->m_doc->docLoader()->autoloadImages() == enable ) return; if ( d->m_doc ) d->m_doc->docLoader()->setAutoloadImages( enable ); unplugActionList( "loadImages" ); if ( enable ) { delete d->m_paLoadImages; d->m_paLoadImages = 0; } else if ( !d->m_paLoadImages ) d->m_paLoadImages = new KAction( i18n( "Display Images on Page" ), "images_display", 0, this, SLOT( slotLoadImages() ), actionCollection(), "loadImages" ); if ( d->m_paLoadImages ) { QList<KAction> lst; lst.append( d->m_paLoadImages ); plugActionList( "loadImages", lst ); }}bool KHTMLPart::autoloadImages() const{ if ( d->m_doc ) return d->m_doc->docLoader()->autoloadImages(); return true;}void KHTMLPart::clear(){ kdDebug( 6090 ) << "KHTMLPart::clear() this = " << this << endl; if ( d->m_bCleared ) return; d->m_bCleared = true; d->m_bClearing = true; { ConstFrameIt it = d->m_frames.begin(); ConstFrameIt end = d->m_frames.end(); for(; it != end; ++it ) { // Stop HTMLRun jobs for frames if ( (*it).m_run ) delete (*it).m_run; } } { QValueList<khtml::ChildFrame>::ConstIterator it = d->m_objects.begin(); QValueList<khtml::ChildFrame>::ConstIterator end = d->m_objects.end(); for(; it != end; ++it ) { // Stop HTMLRun jobs for objects if ( (*it).m_run ) delete (*it).m_run; } } findTextBegin(); // resets d->m_findNode and d->m_findPos d->m_mousePressNode = DOM::Node(); if ( d->m_doc ) { kdDebug( 6090 ) << "KHTMLPart::clear(): dereferencing the document" << endl; d->m_doc->detach(); kdDebug( 6090 ) << "KHTMLPart::clear(): dereferencing done.." << endl; } // Moving past doc so that onUnload works. if ( d->m_jscript ) d->m_jscript->clear(); if ( d->m_view ) d->m_view->clear(); // do not dereference the document before the jscript and view are cleared, as some destructors // might still try to access the document. if ( d->m_doc ) d->m_doc->deref(); d->m_doc = 0; delete d->m_decoder; d->m_decoder = 0; { ConstFrameIt it = d->m_frames.begin(); ConstFrameIt end = d->m_frames.end(); for(; it != end; ++it ) { if ( (*it).m_part ) { partManager()->removePart( (*it).m_part ); delete (KParts::ReadOnlyPart *)(*it).m_part; } } } d->m_frames.clear(); d->m_objects.clear(); delete d->m_javaContext; d->m_javaContext = 0; d->m_baseURL = KURL(); d->m_baseTarget = QString::null; d->m_delayRedirect = 0; d->m_redirectURL = QString::null; d->m_bHTTPRefresh = false; d->m_bClearing = false; d->m_frameNameId = 1; d->m_bFirstData = true; d->m_bMousePressed = false; d->m_selectionStart = DOM::Node(); d->m_selectionEnd = DOM::Node(); d->m_startOffset = 0; d->m_endOffset = 0; d->m_totalImageCount = 0; d->m_loadedImages = 0; if ( !d->m_haveEncoding ) d->m_encoding = QString::null;}bool KHTMLPart::openFile(){ return true;}DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const{ if ( d && d->m_doc && d->m_doc->isHTMLDocument() ) return static_cast<HTMLDocumentImpl*>(d->m_doc); return 0;}DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const{ if ( d ) return d->m_doc; return 0;}/*bool KHTMLPart::isSSLInUse() const{ return d->m_ssl_in_use;}*/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() ) { //kdDebug( 6050 ) << "begin!" << endl; d->m_bParsing = true; begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset ); d->m_doc->docLoader()->setReloading(d->m_bReloading); d->m_workingURL = KURL(); d->m_cacheId = KHTMLPageCache::self()->createCacheEntry(); // When the first data arrives, the metadata has just been made available d->m_ssl_in_use = (d->m_job->queryMetaData("ssl_in_use") == "TRUE"); kdDebug(6050) << "SSL in use? " << d->m_job->queryMetaData("ssl_in_use") << endl; d->m_paSecurity->setIcon( d->m_ssl_in_use ? "lock" : "unlock" ); kdDebug(6050) << "setIcon " << ( d->m_ssl_in_use ? "lock" : "unlock" ) << " done." << endl; // Shouldn't all of this be done only if ssl_in_use == true ? (DF) d->m_ssl_peer_cert_subject = d->m_job->queryMetaData("ssl_peer_cert_subject"); d->m_ssl_peer_cert_issuer = d->m_job->queryMetaData("ssl_peer_cert_issuer"); d->m_ssl_peer_ip = d->m_job->queryMetaData("ssl_peer_ip"); d->m_ssl_cipher = d->m_job->queryMetaData("ssl_cipher"); d->m_ssl_cipher_desc = d->m_job->queryMetaData("ssl_cipher_desc"); d->m_ssl_cipher_version = d->m_job->queryMetaData("ssl_cipher_version"); d->m_ssl_cipher_used_bits = d->m_job->queryMetaData("ssl_cipher_used_bits"); d->m_ssl_cipher_bits = d->m_job->queryMetaData("ssl_cipher_bits"); d->m_ssl_good_from = d->m_job->queryMetaData("ssl_good_from"); d->m_ssl_good_until = d->m_job->queryMetaData("ssl_good_until"); d->m_ssl_cert_state = d->m_job->queryMetaData("ssl_cert_state"); // Check for charset meta-data QString qData = d->m_job->queryMetaData("charset"); if ( !qData.isEmpty() && !d->m_haveEncoding ) // only use information if the user didn't override the settings { d->m_charset = KGlobal::charsets()->charsetForEncoding(qData); d->m_settings->setCharset( d->m_charset ); d->m_settings->setScript( KGlobal::charsets()->charsetForEncoding(qData, true) ); d->m_haveCharset = true; d->m_encoding = qData; } // Support for http-refresh qData = d->m_job->queryMetaData("http-refresh"); if( !qData.isEmpty() && d->m_metaRefreshEnabled ) { kdDebug(6050) << "HTTP Refresh Request: " << qData << endl; int delay; int pos = qData.find( ';' ); if ( pos == -1 ) pos = qData.find( ',' ); if( pos == -1 ) { delay = qData.stripWhiteSpace().toInt(); scheduleRedirection( qData.toInt(), m_url.url() ); } else { int end_pos = qData.length(); delay = qData.left(pos).stripWhiteSpace().toInt(); 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; } } qData = KURL( d->m_baseURL, qData.mid(pos, end_pos) ).url(); scheduleRedirection( delay, qData ); } d->m_bHTTPRefresh = true; } } 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_bParsing ) { end(); //will emit completed() } }}void KHTMLPart::slotFinished( KIO::Job * job ){ if (job->error()) { KHTMLPageCache::self()->cancelEntry(d->m_cacheId); job->showErrorDialog( /*d->m_view*/ ); // TODO show the error text in this part, instead. d->m_job = 0L; emit canceled( job->errorString() ); // TODO: what else ? checkCompleted(); return; } //kdDebug( 6050 ) << "slotFinished" << endl; KHTMLPageCache::self()->endData(d->m_cacheId); if ( d->m_doc && d->m_doc->docLoader()->expireDate()) KIO::http_update_cache(m_url, false, d->m_doc->docLoader()->expireDate()); d->m_workingURL = KURL(); d->m_job = 0L; if ( d->m_bParsing ) end(); //will emit completed()}void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset ){ clear(); d->m_bCleared = false; d->m_cacheId = 0; d->m_bComplete = false; d->m_bLoadEventEmitted = false; // ### the setFontSizes in restore currently doesn't seem to work, // so let's also reset the font base here, so that the font buttons start // at 0 and not at the last used value (would make sense if the sizes // would be restored properly though) d->m_fontBase = 0; if(url.isValid()) KHTMLFactory::vLinks()->insert( url.url() ); // ### //stopParser(); KParts::URLArgs args( d->m_extension->urlArgs() ); args.xOffset = xOffset; args.yOffset = yOffset; d->m_extension->setURLArgs( args ); d->m_referrer = url.url(); m_url = url; if ( !m_url.isEmpty() ) { KURL::List lst = KURL::split( m_url ); KURL baseurl; if ( !lst.isEmpty() ) baseurl = *lst.begin(); // Use this for relative links. // We prefer m_baseURL over m_url because m_url changes when we are // about to load a new page. setBaseURL(baseurl); KURL title( baseurl ); title.setRef( QString::null ); title.setQuery( QString::null ); emit setWindowCaption( title.url() ); } else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -