📄 khtml_part.cpp.orig
字号:
d->m_paFindPrev->setWhatsThis( i18n( "Find previous<p>" "Find the previous occurrence of the text that you " "have found using the <b>Find Text</b> function" ) ); d->m_paFindAheadText = new KAction( i18n("Find Text as You Type"), KShortcut( '/' ), this, SLOT( slotFindAheadText()), actionCollection(), "findAheadText"); d->m_paFindAheadLinks = new KAction( i18n("Find Links as You Type"), KShortcut( '\'' ), this, SLOT( slotFindAheadLink()), actionCollection(), "findAheadLink"); d->m_paFindAheadText->setEnabled( false ); d->m_paFindAheadLinks->setEnabled( false ); if ( parentPart() ) { d->m_paFind->setShortcut( KShortcut() ); // avoid clashes d->m_paFindNext->setShortcut( KShortcut() ); // avoid clashes d->m_paFindPrev->setShortcut( KShortcut() ); // avoid clashes d->m_paFindAheadText->setShortcut( KShortcut()); d->m_paFindAheadLinks->setShortcut( KShortcut()); } d->m_paPrintFrame = new KAction( i18n( "Print Frame..." ), "frameprint", 0, this, SLOT( slotPrintFrame() ), actionCollection(), "printFrame" ); d->m_paPrintFrame->setWhatsThis( i18n( "Print Frame<p>" "Some pages have several frames. To print only a single frame, click " "on it and then use this function." ) ); d->m_paSelectAll = KStdAction::selectAll( this, SLOT( slotSelectAll() ), actionCollection(), "selectAll" ); if ( parentPart() ) d->m_paSelectAll->setShortcut( KShortcut() ); // avoid clashes d->m_paToggleCaretMode = new KToggleAction(i18n("Toggle Caret Mode"), Key_F7, this, SLOT(slotToggleCaretMode()), actionCollection(), "caretMode"); d->m_paToggleCaretMode->setChecked(isCaretMode()); if (parentPart()) d->m_paToggleCaretMode->setShortcut(KShortcut()); // avoid clashes // set the default java(script) flags according to the current host. d->m_bOpenMiddleClick = d->m_settings->isOpenMiddleClickEnabled(); d->m_bBackRightClick = d->m_settings->isBackRightClickEnabled(); d->m_bJScriptEnabled = d->m_settings->isJavaScriptEnabled(); setDebugScript( d->m_settings->isJavaScriptDebugEnabled() ); d->m_bJavaEnabled = d->m_settings->isJavaEnabled(); d->m_bPluginsEnabled = d->m_settings->isPluginsEnabled(); // Set the meta-refresh flag... d->m_metaRefreshEnabled = d->m_settings->isAutoDelayedActionsEnabled (); connect( view, SIGNAL( zoomView( int ) ), SLOT( slotZoomView( int ) ) ); 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( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ), this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) ); connect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ), this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) ); connect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ), this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) ); connect ( &d->m_progressUpdateTimer, SIGNAL( timeout() ), this, SLOT( slotProgressUpdate() ) ); findTextBegin(); //reset find variables connect( &d->m_redirectionTimer, SIGNAL( timeout() ), this, SLOT( slotRedirect() ) ); d->m_dcopobject = new KHTMLPartIface(this); // TODO KDE4 - load plugins now (see also the constructors) //if ( prof == BrowserViewGUI && !parentPart() ) // loadPlugins( partObject(), this, instance() ); // "khtml" catalog does not exist, our translations are in kdelibs. // removing this catalog from KGlobal::locale() prevents problems // with changing the language in applications at runtime -Thomas Reitelbach KGlobal::locale()->removeCatalogue("khtml");}KHTMLPart::~KHTMLPart(){ //kdDebug(6050) << "KHTMLPart::~KHTMLPart " << this << endl; KConfig *config = KGlobal::config(); config->setGroup( "HTML Settings" ); config->writeEntry( "AutomaticDetectionLanguage", d->m_autoDetectLanguage ); delete d->m_automaticDetection; delete d->m_manualDetection; slotWalletClosed(); if (!parentPart()) { // only delete it if the top khtml_part closes removeJSErrorExtension(); delete d->m_statusBarPopupLabel; } d->m_find = 0; // deleted by its parent, the view. if ( d->m_manager ) { d->m_manager->setActivePart( 0 ); // We specify "this" as parent qobject for d->manager, so no need to delete it. } stopAutoScroll(); d->m_redirectionTimer.stop(); if (!d->m_bComplete) closeURL(); disconnect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ), this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) ); disconnect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ), this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) ); disconnect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ), this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) ); clear(); if ( d->m_view ) { d->m_view->hide(); d->m_view->viewport()->hide(); d->m_view->m_part = 0; } // Have to delete this here since we forward declare it in khtmlpart_p and // at least some compilers won't call the destructor in this case. delete d->m_jsedlg; d->m_jsedlg = 0; if (!parentPart()) // only delete d->m_frame if the top khtml_part closes delete d->m_frame; delete d; d = 0; KHTMLFactory::deregisterPart( this );}bool KHTMLPart::restoreURL( const KURL &url ){ kdDebug( 6050 ) << "KHTMLPart::restoreURL " << url.url() << endl; d->m_redirectionTimer.stop(); /* * That's not a good idea as it will call closeURL() on all * child frames, preventing them from further loading. This * method gets called from restoreState() in case of a full frameset * restoral, and restoreState() calls closeURL() before restoring * anyway. 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()); setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() ); d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host()); d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host()); m_url = url; d->m_restoreScrollPosition = true; disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition())); connect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition())); 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(" << this << ")::openURL " << url.url() << endl; d->m_redirectionTimer.stop(); // 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(); if( d->m_bJScriptEnabled ) d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = QString::null; /** * 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(6050) << "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", HINT_UTF8 ); urls.pop_front(); d->m_workingURL = KURL::join( urls ); //kdDebug(6050) << "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; } } if (!parentPart()) { // only do it for toplevel part QString host = url.isLocalFile() ? "localhost" : url.host(); QString userAgent = KProtocolManager::userAgentForHost(host); if (userAgent != KProtocolManager::userAgentForHost(QString::null)) { if (!d->m_statusBarUALabel) { d->m_statusBarUALabel = new KURLLabel(d->m_statusBarExtension->statusBar()); d->m_statusBarUALabel->setFixedHeight(instance()->iconLoader()->currentSize(KIcon::Small)); d->m_statusBarUALabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); d->m_statusBarUALabel->setUseCursor(false); d->m_statusBarExtension->addStatusBarItem(d->m_statusBarUALabel, 0, false); d->m_statusBarUALabel->setPixmap(SmallIcon("agent", instance())); } else { QToolTip::remove(d->m_statusBarUALabel); } QToolTip::add(d->m_statusBarUALabel, i18n("The fake user-agent '%1' is in use.").arg(userAgent)); } else if (d->m_statusBarUALabel) { d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarUALabel); delete d->m_statusBarUALabel; d->m_statusBarUALabel = 0L; } } KParts::URLArgs args( d->m_extension->urlArgs() ); // in case // a) we have 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 // e) there was no HTTP redirection meanwhile (testcase: webmin's software/tree.cgi) // => we don't reload the whole document and // we just jump to the requested html anchor bool isFrameSet = false; if ( d->m_doc && d->m_doc->isHTMLDocument() ) { HTMLDocumentImpl* htmlDoc = static_cast<HTMLDocumentImpl*>(d->m_doc); isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET); } if ( url.hasRef() && !isFrameSet ) { bool noReloadForced = !args.reload && !args.redirectedRequest() && !args.doPost(); if (noReloadForced && urlcmp( url.url(), m_url.url(), true, true )) { kdDebug( 6050 ) << "KHTMLPart::openURL, jumping to anchor. m_url = " << url.url() << endl; m_url = url; emit started( 0L ); if ( !gotoAnchor( url.encodedHtmlRef()) ) gotoAnchor( url.htmlRef() ); d->m_bComplete = true; if (d->m_doc) d->m_doc->setParsing(false); kdDebug( 6050 ) << "completed..." << endl; emit completed(); return true; } } // Save offset of viewport when page is reloaded to be compliant // to every other capable browser out there. if (args.reload) { args.xOffset = d->m_view->contentsX(); args.yOffset = d->m_view->contentsY(); d->m_extension->setURLArgs(args); } if (!d->m_restored) closeURL(); d->m_restoreScrollPosition = d->m_restored; disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition())); connect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition())); // 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; args.metaData().insert("main_frame_request", parentPart() == 0 ? "TRUE" : "FALSE" ); args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip); args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert); args.metaData().insert("PropagateHttpHeader", "true"); args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE" : "FALSE" ); args.metaData().insert("ssl_activate_warnings", "TRUE" ); args.metaData().insert("cross-domain", toplevelURL().url()); if (d->m_restored) { args.metaData().insert("referrer", d->m_pageReferrer); d->m_cachePolicy = KIO::CC_Cache; } else if (args.reload) d->m_cachePolicy = KIO::CC_Reload; else d->m_cachePolicy = KProtocolManager::cacheControl(); if ( args.doPost() && (m_url.protocol().startsWith("http")) ) { d->m_job = KIO::http_post( m_url, args.postData, false ); d->m_job->addMetaData("content-type", args.contentType() ); } else { d->m_job = KIO::get( m_url, false, false ); d->m_job->addMetaData("cache", KIO::getCacheControlString(d->m_cachePolicy)); } if (widget()) d->m_job->setWindow(widget()->topLevelWidget()); 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( infoMessage( KIO::Job*, const QString& ) ), SLOT( slotInfoMessage(KIO::Job*, const QString& ) ) ); 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_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = QString::null; // set the javascript flags according to the current url d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host()); setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() ); d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host()); d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host()); 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 ) ) ); connect( d->m_job, SIGNAL( result( KIO::Job* ) ), this, SLOT( slotJobDone( KIO::Job* ) ) ); d->m_jobspeed = 0;#ifndef KONQ_EMBEDDED // If this was an explicit reload and the user style sheet should be used, // do a stat to see whether the stylesheet was changed in the meanwhile. if ( args.reload && !settings()->userStyleSheet().isEmpty() ) { KURL url( settings()->userStyleSheet() ); KIO::StatJob *job = KIO::stat( url, false /* don't show progress */ ); connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotUserSheetStatDone( KIO::Job * ) ) ); }#endif // KONQ_EMBEDDED emit started( 0L ); return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -