00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "khtml_part.h"
00031
00032 #include "khtml_pagecache.h"
00033
00034 #include "dom/dom_string.h"
00035 #include "dom/dom_element.h"
00036 #include "html/html_documentimpl.h"
00037 #include "html/html_baseimpl.h"
00038 #include "html/html_miscimpl.h"
00039 #include "html/html_imageimpl.h"
00040 #include "html/html_objectimpl.h"
00041 #include "rendering/render_text.h"
00042 #include "rendering/render_frames.h"
00043 #include "rendering/render_layer.h"
00044 #include "misc/htmlhashes.h"
00045 #include "misc/loader.h"
00046 #include "xml/dom2_eventsimpl.h"
00047 #include "xml/dom2_rangeimpl.h"
00048 #include "xml/xml_tokenizer.h"
00049 #include "css/cssstyleselector.h"
00050 #include "css/csshelper.h"
00051 using namespace DOM;
00052
00053 #include "khtmlview.h"
00054 #include <kparts/partmanager.h>
00055 #include "ecma/kjs_proxy.h"
00056 #include "khtml_settings.h"
00057 #include "kjserrordlg.h"
00058
00059 #include <kjs/function.h>
00060 #include <kjs/interpreter.h>
00061
00062 #include "htmlpageinfo.h"
00063
00064 #include <sys/types.h>
00065 #include <assert.h>
00066 #include <unistd.h>
00067
00068 #include <config.h>
00069
00070 #include <dcopclient.h>
00071 #include <dcopref.h>
00072 #include <kstandarddirs.h>
00073 #include <kstringhandler.h>
00074 #include <kio/job.h>
00075 #include <kio/global.h>
00076 #include <kprotocolmanager.h>
00077 #include <kdebug.h>
00078 #include <kiconloader.h>
00079 #include <klocale.h>
00080 #include <kcharsets.h>
00081 #include <kmessagebox.h>
00082 #include <kstdaction.h>
00083 #include <kfiledialog.h>
00084 #include <ktrader.h>
00085 #include <kdatastream.h>
00086 #include <ktempfile.h>
00087 #include <kglobalsettings.h>
00088 #include <kurldrag.h>
00089 #include <kapplication.h>
00090 #include <kparts/browserinterface.h>
00091 #if !defined(QT_NO_DRAGANDDROP)
00092 #include <kmultipledrag.h>
00093 #endif
00094 #include "../kutils/kfinddialog.h"
00095 #include "../kutils/kfind.h"
00096
00097 #include <ksslcertchain.h>
00098 #include <ksslinfodlg.h>
00099
00100 #include <kfileitem.h>
00101 #include <kurifilter.h>
00102 #include <kstatusbar.h>
00103 #include <kurllabel.h>
00104
00105 #include <qclipboard.h>
00106 #include <qfile.h>
00107 #include <qtooltip.h>
00108 #include <qmetaobject.h>
00109 #include <private/qucomextra_p.h>
00110
00111 #include "khtmlpart_p.h"
00112 #include "kpopupmenu.h"
00113 #include "rendering/render_form.h"
00114 #include <kwin.h>
00115
00116 #define HINT_UTF8 106
00117
00118 namespace khtml {
00119 class PartStyleSheetLoader : public CachedObjectClient
00120 {
00121 public:
00122 PartStyleSheetLoader(KHTMLPart *part, DOM::DOMString url, DocLoader* dl)
00123 {
00124 m_part = part;
00125 m_cachedSheet = dl->requestStyleSheet(url, QString::null, "text/css",
00126 true );
00127 if (m_cachedSheet)
00128 m_cachedSheet->ref( this );
00129 }
00130 virtual ~PartStyleSheetLoader()
00131 {
00132 if ( m_cachedSheet ) m_cachedSheet->deref(this);
00133 }
00134 virtual void setStyleSheet(const DOM::DOMString&, const DOM::DOMString &sheet)
00135 {
00136 if ( m_part )
00137 m_part->setUserStyleSheet( sheet.string() );
00138
00139 delete this;
00140 }
00141 virtual void error( int, const QString& ) {
00142 delete this;
00143 }
00144 QGuardedPtr<KHTMLPart> m_part;
00145 khtml::CachedCSSStyleSheet *m_cachedSheet;
00146 };
00147 }
00148
00149
00150 KHTMLFrameList::Iterator KHTMLFrameList::find( const QString &name )
00151 {
00152 Iterator it = begin();
00153 Iterator e = end();
00154
00155 for (; it!=e; ++it )
00156 if ( (*it).m_name==name )
00157 break;
00158
00159 return it;
00160 }
00161
00162 KHTMLPart::KHTMLPart( QWidget *parentWidget, const char *widgetname, QObject *parent, const char *name, GUIProfile prof )
00163 : KParts::ReadOnlyPart( parent, name )
00164 {
00165 d = 0;
00166 KHTMLFactory::registerPart( this );
00167 setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
00168 init( new KHTMLView( this, parentWidget, widgetname ), prof );
00169 }
00170
00171 KHTMLPart::KHTMLPart( KHTMLView *view, QObject *parent, const char *name, GUIProfile prof )
00172 : KParts::ReadOnlyPart( parent, name )
00173 {
00174 d = 0;
00175 KHTMLFactory::registerPart( this );
00176 setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
00177 assert( view );
00178 init( view, prof );
00179 }
00180
00181 void KHTMLPart::init( KHTMLView *view, GUIProfile prof )
00182 {
00183 if ( prof == DefaultGUI )
00184 setXMLFile( "khtml.rc" );
00185 else if ( prof == BrowserViewGUI )
00186 setXMLFile( "khtml_browser.rc" );
00187
00188 d = new KHTMLPartPrivate(parent());
00189
00190 d->m_view = view;
00191 setWidget( d->m_view );
00192
00193 d->m_guiProfile = prof;
00194 d->m_extension = new KHTMLPartBrowserExtension( this );
00195 d->m_hostExtension = new KHTMLPartBrowserHostExtension( this );
00196 d->m_statusBarExtension = new KParts::StatusBarExtension( this );
00197 d->m_statusBarIconLabel = 0L;
00198
00199 d->m_bSecurityInQuestion = false;
00200 d->m_paLoadImages = 0;
00201 d->m_paDebugScript = 0;
00202 d->m_bMousePressed = false;
00203 d->m_bRightMousePressed = false;
00204 d->m_paViewDocument = new KAction( i18n( "View Do&cument Source" ), CTRL + Key_U, this, SLOT( slotViewDocumentSource() ), actionCollection(), "viewDocumentSource" );
00205 d->m_paViewFrame = new KAction( i18n( "View Frame Source" ), 0, this, SLOT( slotViewFrameSource() ), actionCollection(), "viewFrameSource" );
00206 d->m_paViewInfo = new KAction( i18n( "View Document Information" ), CTRL+Key_I, this, SLOT( slotViewPageInfo() ), actionCollection(), "viewPageInfo" );
00207 d->m_paSaveBackground = new KAction( i18n( "Save &Background Image As..." ), 0, this, SLOT( slotSaveBackground() ), actionCollection(), "saveBackground" );
00208 d->m_paSaveDocument = KStdAction::saveAs( this, SLOT( slotSaveDocument() ), actionCollection(), "saveDocument" );
00209 if ( parentPart() )
00210 d->m_paSaveDocument->setShortcut( KShortcut() );
00211 d->m_paSaveFrame = new KAction( i18n( "Save &Frame As..." ), 0, this, SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" );
00212 d->m_paSecurity = new KAction( i18n( "Security..." ), "decrypted", 0, this, SLOT( slotSecurity() ), actionCollection(), "security" );
00213 d->m_paSecurity->setWhatsThis( i18n( "Security Settings<p>"
00214 "Shows the certificate of the displayed page. Only "
00215 "pages that have been transmitted using a secure, encrypted connection have a "
00216 "certificate.<p> "
00217 "Hint: If the image shows a closed lock, the page has been transmitted over a "
00218 "secure connection.") );
00219 d->m_paDebugRenderTree = new KAction( i18n( "Print Rendering Tree to STDOUT" ), 0, this, SLOT( slotDebugRenderTree() ), actionCollection(), "debugRenderTree" );
00220 d->m_paDebugDOMTree = new KAction( i18n( "Print DOM Tree to STDOUT" ), 0, this, SLOT( slotDebugDOMTree() ), actionCollection(), "debugDOMTree" );
00221 d->m_paStopAnimations = new KAction( i18n( "Stop Animated Images" ), 0, this, SLOT( slotStopAnimations() ), actionCollection(), "stopAnimations" );
00222
00223 d->m_paSetEncoding = new KActionMenu( i18n( "Set &Encoding" ), "charset", actionCollection(), "setEncoding" );
00224 d->m_paSetEncoding->setDelayed( false );
00225
00226 d->m_automaticDetection = new KPopupMenu( 0L );
00227
00228 d->m_automaticDetection->insertItem( i18n( "Semi-Automatic" ), 0 );
00229 d->m_automaticDetection->insertItem( i18n( "Arabic" ), 1 );
00230 d->m_automaticDetection->insertItem( i18n( "Baltic" ), 2 );
00231 d->m_automaticDetection->insertItem( i18n( "Central European" ), 3 );
00232
00233 d->m_automaticDetection->insertItem( i18n( "Greek" ), 5 );
00234 d->m_automaticDetection->insertItem( i18n( "Hebrew" ), 6 );
00235 d->m_automaticDetection->insertItem( i18n( "Japanese" ), 7 );
00236
00237 d->m_automaticDetection->insertItem( i18n( "Russian" ), 9 );
00238
00239 d->m_automaticDetection->insertItem( i18n( "Turkish" ), 11 );
00240 d->m_automaticDetection->insertItem( i18n( "Ukrainian" ), 12 );
00241
00242 d->m_automaticDetection->insertItem( i18n( "Western European" ), 14 );
00243
00244 connect( d->m_automaticDetection, SIGNAL( activated( int ) ), this, SLOT( slotAutomaticDetectionLanguage( int ) ) );
00245
00246 d->m_paSetEncoding->popupMenu()->insertItem( i18n( "Automatic Detection" ), d->m_automaticDetection, 0 );
00247
00248 d->m_paSetEncoding->insert( new KActionSeparator( actionCollection() ) );
00249
00250
00251 d->m_manualDetection = new KSelectAction( i18n( "short for Manual Detection", "Manual" ), 0, this, SLOT( slotSetEncoding() ), actionCollection(), "manualDetection" );
00252 QStringList encodings = KGlobal::charsets()->descriptiveEncodingNames();
00253 d->m_manualDetection->setItems( encodings );
00254 d->m_manualDetection->setCurrentItem( -1 );
00255 d->m_paSetEncoding->insert( d->m_manualDetection );
00256
00257
00258 KConfig *config = KGlobal::config();
00259 if ( config->hasGroup( "HTML Settings" ) ) {
00260 config->setGroup( "HTML Settings" );
00261 khtml::Decoder::AutoDetectLanguage language;
00262 QCString name = QTextCodec::codecForLocale()->name();
00263 name = name.lower();
00264
00265 if ( name == "cp1256" || name == "iso-8859-6" ) {
00266 language = khtml::Decoder::Arabic;
00267 }
00268 else if ( name == "cp1257" || name == "iso-8859-13" || name == "iso-8859-4" ) {
00269 language = khtml::Decoder::Baltic;
00270 }
00271 else if ( name == "cp1250" || name == "ibm852" || name == "iso-8859-2" || name == "iso-8859-3" ) {
00272 language = khtml::Decoder::CentralEuropean;
00273 }
00274 else if ( name == "cp1251" || name == "koi8-r" || name == "iso-8859-5" ) {
00275 language = khtml::Decoder::Russian;
00276 }
00277 else if ( name == "koi8-u" ) {
00278 language = khtml::Decoder::Ukrainian;
00279 }
00280 else if ( name == "cp1253" || name == "iso-8859-7" ) {
00281 language = khtml::Decoder::Greek;
00282 }
00283 else if ( name == "cp1255" || name == "iso-8859-8" || name == "iso-8859-8-i" ) {
00284 language = khtml::Decoder::Hebrew;
00285 }
00286 else if ( name == "jis7" || name == "eucjp" || name == "sjis" ) {
00287 language = khtml::Decoder::Japanese;
00288 }
00289 else if ( name == "cp1254" || name == "iso-8859-9" ) {
00290 language = khtml::Decoder::Turkish;
00291 }
00292 else if ( name == "cp1252" || name == "iso-8859-1" || name == "iso-8859-15" ) {
00293 language = khtml::Decoder::WesternEuropean;
00294 }
00295 else
00296 language = khtml::Decoder::SemiautomaticDetection;
00297
00298 int _id = config->readNumEntry( "AutomaticDetectionLanguage", language );
00299 d->m_automaticDetection->setItemChecked( _id, true );
00300 d->m_paSetEncoding->popupMenu()->setItemChecked( 0, true );
00301
00302 d->m_autoDetectLanguage = static_cast< khtml::Decoder::AutoDetectLanguage >( _id );
00303 }
00304
00305
00306 d->m_paUseStylesheet = new KSelectAction( i18n( "Use S&tylesheet"), 0, this, SLOT( slotUseStylesheet() ), actionCollection(), "useStylesheet" );
00307
00308 if ( prof == BrowserViewGUI ) {
00309 d->m_paIncZoomFactor = new KHTMLZoomFactorAction( this, true, i18n(
00310 "Increase Font Sizes" ), "viewmag+", "CTRL++;CTRL+=", this,
00311 SLOT( slotIncZoomFast() ), actionCollection(), "incFontSizes" );
00312 d->m_paIncZoomFactor->setWhatsThis( i18n( "Increase Font Size<p>"
00313 "Make the font in this window bigger. "
00314 "Click and hold down the mouse button for a menu with all available font sizes." ) );
00315 d->m_paDecZoomFactor = new KHTMLZoomFactorAction( this, false, i18n(
00316 "Decrease Font Sizes" ), "viewmag-", CTRL + Key_Minus, this,
00317 SLOT( slotDecZoomFast() ), actionCollection(), "decFontSizes" );
00318 d->m_paDecZoomFactor->setWhatsThis( i18n( "Decrease Font Size<p>"
00319 "Make the font in this window smaller. "
00320 "Click and hold down the mouse button for a menu with all available font sizes." ) );
00321 }
00322
00323 d->m_paFind = KStdAction::find( this, SLOT( slotFind() ), actionCollection(), "find" );
00324 d->m_paFind->setWhatsThis( i18n( "Find text<p>"
00325 "Shows a dialog that allows you to find text on the displayed page." ) );
00326
00327 d->m_paFindNext = KStdAction::findNext( this, SLOT( slotFindNext() ), actionCollection(), "findNext" );
00328 d->m_paFindNext->setWhatsThis( i18n( "Find next<p>"
00329 "Find the next occurrence of the text that you "
00330 "have found using the <b>Find Text</b> function" ) );
00331 if ( parentPart() )
00332 {
00333 d->m_paFind->setShortcut( KShortcut() );
00334 d->m_paFindNext->setShortcut( KShortcut() );
00335 }
00336
00337 d->m_paPrintFrame = new KAction( i18n( "Print Frame..." ), "frameprint", 0, this, SLOT( slotPrintFrame() ), actionCollection(), "printFrame" );
00338 d->m_paPrintFrame->setWhatsThis( i18n( "Print Frame<p>"
00339 "Some pages have several frames. To print only a single frame, click "
00340 "on it and then use this function." ) );
00341
00342 d->m_paSelectAll = KStdAction::selectAll( this, SLOT( slotSelectAll() ), actionCollection(), "selectAll" );
00343 if ( parentPart() )
00344 d->m_paSelectAll->setShortcut( KShortcut() );
00345
00346 d->m_paToggleCaretMode = new KToggleAction(i18n("Toggle Caret Mode"),
00347 Key_F7, this, SLOT(slotToggleCaretMode()),
00348 actionCollection(), "caretMode");
00349 d->m_paToggleCaretMode->setChecked(isCaretMode());
00350 if (parentPart())
00351 d->m_paToggleCaretMode->setShortcut(KShortcut());
00352
00353
00354 d->m_bOpenMiddleClick = d->m_settings->isOpenMiddleClickEnabled();
00355 d->m_bBackRightClick = d->m_settings->isBackRightClickEnabled();
00356 d->m_bJScriptEnabled = d->m_settings->isJavaScriptEnabled();
00357 setDebugScript( d->m_settings->isJavaScriptDebugEnabled() );
00358 d->m_bJavaEnabled = d->m_settings->isJavaEnabled();
00359 d->m_bPluginsEnabled = d->m_settings->isPluginsEnabled();
00360
00361
00362 d->m_metaRefreshEnabled = d->m_settings->isAutoDelayedActionsEnabled ();
00363
00364 connect( view, SIGNAL( zoomView( int ) ), SLOT( slotZoomView( int ) ) );
00365
00366 connect( this, SIGNAL( completed() ),
00367 this, SLOT( updateActions() ) );
00368 connect( this, SIGNAL( completed( bool ) ),
00369 this, SLOT( updateActions() ) );
00370 connect( this, SIGNAL( started( KIO::Job * ) ),
00371 this, SLOT( updateActions() ) );
00372
00373 d->m_popupMenuXML = KXMLGUIFactory::readConfigFile( locate( "data", "khtml/khtml_popupmenu.rc", KHTMLFactory::instance() ) );
00374
00375 connect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
00376 this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
00377 connect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
00378 this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
00379 connect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
00380 this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
00381
00382 connect ( &d->m_progressUpdateTimer, SIGNAL( timeout() ), this, SLOT( slotProgressUpdate() ) );
00383
00384 findTextBegin();
00385
00386 connect( &d->m_redirectionTimer, SIGNAL( timeout() ),
00387 this, SLOT( slotRedirect() ) );
00388
00389 d->m_dcopobject = new KHTMLPartIface(this);
00390
00391
00392
00393
00394 KGlobal::locale()->removeCatalogue("khtml");
00395 }
00396
00397 KHTMLPart::~KHTMLPart()
00398 {
00399
00400
00401 KConfig *config = KGlobal::config();
00402 config->setGroup( "HTML Settings" );
00403 config->writeEntry( "AutomaticDetectionLanguage", d->m_autoDetectLanguage );
00404
00405 delete d->m_automaticDetection;
00406 delete d->m_manualDetection;
00407
00408 slotWalletClosed();
00409 if (!parentPart()) {
00410 removeJSErrorExtension();
00411 }
00412
00413 d->m_find = 0;
00414
00415 if ( d->m_manager )
00416 {
00417 d->m_manager->setActivePart( 0 );
00418
00419 }
00420
00421 stopAutoScroll();
00422 d->m_redirectionTimer.stop();
00423
00424 if (!d->m_bComplete)
00425 closeURL();
00426
00427 disconnect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
00428 this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
00429 disconnect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
00430 this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
00431 disconnect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
00432 this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
00433
00434 clear();
00435
00436 if ( d->m_view )
00437 {
00438 d->m_view->hide();
00439 d->m_view->viewport()->hide();
00440 d->m_view->m_part = 0;
00441 }
00442
00443
00444
00445 delete d->m_jsedlg;
00446 d->m_jsedlg = 0;
00447
00448 delete d; d = 0;
00449 KHTMLFactory::deregisterPart( this );
00450 }
00451
00452 bool KHTMLPart::restoreURL( const KURL &url )
00453 {
00454 kdDebug( 6050 ) << "KHTMLPart::restoreURL " << url.url() << endl;
00455
00456 d->m_redirectionTimer.stop();
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468 d->m_bComplete = false;
00469 d->m_bLoadEventEmitted = false;
00470 d->m_workingURL = url;
00471
00472
00473 d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
00474 setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
00475 d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
00476 d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
00477
00478 m_url = url;
00479
00480 KHTMLPageCache::self()->fetchData( d->m_cacheId, this, SLOT(slotRestoreData(const QByteArray &)));
00481
00482 emit started( 0L );
00483
00484 return true;
00485 }
00486
00487
00488 bool KHTMLPart::openURL( const KURL &url )
00489 {
00490 kdDebug( 6050 ) << "KHTMLPart(" << this << ")::openURL " << url.url() << endl;
00491
00492 d->m_redirectionTimer.stop();
00493
00494
00495
00496
00497 if ( url.protocol() == "error" && url.hasSubURL() ) {
00498 closeURL();
00499
00500 if( d->m_bJScriptEnabled )
00501 d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = QString::null;
00502
00508 KURL::List urls = KURL::split( url );
00509
00510
00511 if ( urls.count() > 1 ) {
00512 KURL mainURL = urls.first();
00513 int error = mainURL.queryItem( "error" ).toInt();
00514
00515 if ( error == 0 ) error = KIO::ERR_UNKNOWN;
00516 QString errorText = mainURL.queryItem( "errText", HINT_UTF8 );
00517 urls.pop_front();
00518 d->m_workingURL = KURL::join( urls );
00519
00520 emit d->m_extension->setLocationBarURL( d->m_workingURL.prettyURL() );
00521 htmlError( error, errorText, d->m_workingURL );
00522 return true;
00523 }
00524 }
00525
00526 KParts::URLArgs args( d->m_extension->urlArgs() );
00527
00528
00529
00530
00531
00532
00533 bool isFrameSet = false;
00534 if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
00535 HTMLDocumentImpl* htmlDoc = static_cast<HTMLDocumentImpl*>(d->m_doc);
00536 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
00537 }
00538
00539 if ( url.hasRef() && !isFrameSet )
00540 {
00541
00542
00543
00544 bool noReloadForced = !args.reload && !args.redirectedRequest() && !args.doPost();
00545 if (urlcmp( url.url(), m_url.url(), true, true ) && noReloadForced)
00546 {
00547 kdDebug( 6050 ) << "KHTMLPart::openURL, jumping to anchor. m_url = " << url.url() << endl;
00548 m_url = url;
00549 emit started( 0L );
00550
00551 if ( !gotoAnchor( url.encodedHtmlRef()) )
00552 gotoAnchor( url.htmlRef() );
00553
00554 d->m_bComplete = true;
00555 if (d->m_doc)
00556 d->m_doc->setParsing(false);
00557
00558 kdDebug( 6050 ) << "completed..." << endl;
00559 emit completed();
00560 return true;
00561 }
00562
00563
00564 else
00565 {
00566 disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(gotoAnchor()));
00567 if ( !url.encodedHtmlRef().isEmpty() )
00568 connect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(gotoAnchor()));
00569 }
00570 }
00571
00572
00573
00574 if (args.reload) {
00575 args.xOffset = d->m_view->contentsX();
00576 args.yOffset = d->m_view->contentsY();
00577 d->m_extension->setURLArgs(args);
00578 connect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition()));
00579 }
00580
00581 if (!d->m_restored)
00582 closeURL();
00583
00584
00585
00586 m_url = url;
00587 if(m_url.protocol().startsWith( "http" ) && !m_url.host().isEmpty() &&
00588 m_url.path().isEmpty()) {
00589 m_url.setPath("/");
00590 emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
00591 }
00592
00593 d->m_workingURL = m_url;
00594
00595 args.metaData().insert("main_frame_request", parentPart() == 0 ? "TRUE" : "FALSE" );
00596 args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
00597 args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
00598 args.metaData().insert("PropagateHttpHeader", "true");
00599 args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE" : "FALSE" );
00600 args.metaData().insert("ssl_activate_warnings", "TRUE" );
00601 args.metaData().insert("cross-domain", toplevelURL().url());
00602
00603 if (d->m_restored)
00604 {
00605 args.metaData().insert("referrer", d->m_pageReferrer);
00606 d->m_cachePolicy = KIO::CC_Cache;
00607 }
00608 else if (args.reload)
00609 d->m_cachePolicy = KIO::CC_Reload;
00610 else
00611 d->m_cachePolicy = KProtocolManager::cacheControl();
00612
00613 if ( args.doPost() && (m_url.protocol().startsWith("http")) )
00614 {
00615 d->m_job = KIO::http_post( m_url, args.postData, false );
00616 d->m_job->addMetaData("content-type", args.contentType() );
00617 }
00618 else
00619 {
00620 d->m_job = KIO::get( m_url, false, false );
00621 d->m_job->addMetaData("cache", KIO::getCacheControlString(d->m_cachePolicy));
00622 }
00623
00624 if (widget())
00625 d->m_job->setWindow(widget()->topLevelWidget());
00626 d->m_job->addMetaData(args.metaData());
00627
00628 connect( d->m_job, SIGNAL( result( KIO::Job* ) ),
00629 SLOT( slotFinished( KIO::Job* ) ) );
00630 connect( d->m_job, SIGNAL( data( KIO::Job*, const QByteArray& ) ),
00631 SLOT( slotData( KIO::Job*, const QByteArray& ) ) );
00632 connect ( d->m_job, SIGNAL( infoMessage( KIO::Job*, const QString& ) ),
00633 SLOT( slotInfoMessage(KIO::Job*, const QString& ) ) );
00634 connect( d->m_job, SIGNAL(redirection(KIO::Job*, const KURL& ) ),
00635 SLOT( slotRedirection(KIO::Job*, const KURL&) ) );
00636
00637 d->m_bComplete = false;
00638 d->m_bLoadEventEmitted = false;
00639
00640
00641 if( d->m_bJScriptEnabled )
00642 d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = QString::null;
00643
00644
00645 d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
00646 setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
00647 d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
00648 d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
00649
00650
00651 connect( d->m_job, SIGNAL( speed( KIO::Job*, unsigned long ) ),
00652 this, SLOT( slotJobSpeed( KIO::Job*, unsigned long ) ) );
00653
00654 connect( d->m_job, SIGNAL( percent( KIO::Job*, unsigned long ) ),
00655 this, SLOT( slotJobPercent( KIO::Job*, unsigned long ) ) );
00656
00657 connect( d->m_job, SIGNAL( result( KIO::Job* ) ),
00658 this, SLOT( slotJobDone( KIO::Job* ) ) );
00659
00660 d->m_jobspeed = 0;
00661
00662
00663
00664 if ( args.reload && !settings()->userStyleSheet().isEmpty() ) {
00665 KURL url( settings()->userStyleSheet() );
00666 KIO::StatJob *job = KIO::stat( url, false );
00667 connect( job, SIGNAL( result( KIO::Job * ) ),
00668 this, SLOT( slotUserSheetStatDone( KIO::Job * ) ) );
00669 }
00670 emit started( 0L );
00671
00672 return true;
00673 }
00674
00675 bool KHTMLPart::closeURL()
00676 {
00677 if ( d->m_job )
00678 {
00679 KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
00680 d->m_job->kill();
00681 d->m_job = 0;
00682 }
00683
00684 if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
00685 HTMLDocumentImpl* hdoc = static_cast<HTMLDocumentImpl*>( d->m_doc );
00686
00687 if ( hdoc->body() && d->m_bLoadEventEmitted ) {
00688 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT, false, false );
00689 if ( d->m_doc )
00690 d->m_doc->updateRendering();
00691 d->m_bLoadEventEmitted = false;
00692 }
00693 }
00694
00695 d->m_bComplete = true;
00696 d->m_bLoadEventEmitted = true;
00697 d->m_cachePolicy = KProtocolManager::cacheControl();
00698
00699 KHTMLPageCache::self()->cancelFetch(this);
00700 if ( d->m_doc && d->m_doc->parsing() )
00701 {
00702 kdDebug( 6050 ) << " was still parsing... calling end " << endl;
00703 slotFinishedParsing();
00704 d->m_doc->setParsing(false);
00705 }
00706
00707 if ( !d->m_workingURL.isEmpty() )
00708 {
00709
00710 kdDebug( 6050 ) << "Aborted before starting to render, reverting location bar to " << m_url.prettyURL() << endl;
00711 emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
00712 }
00713
00714 d->m_workingURL = KURL();
00715
00716 if ( d->m_doc && d->m_doc->docLoader() )
00717 khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
00718
00719
00720 ConstFrameIt it = d->m_frames.begin();
00721 ConstFrameIt end = d->m_frames.end();
00722 for (; it != end; ++it )
00723 {
00724 if ( (*it).m_run )
00725 (*it).m_run->abort();
00726 if ( !( *it ).m_part.isNull() )
00727 ( *it ).m_part->closeURL();
00728 }
00729
00730 for (it = d->m_objects.begin(); it != d->m_objects.end(); ++it )
00731 {
00732 if ( !( *it ).m_part.isNull() )
00733 ( *it ).m_part->closeURL();
00734 }
00735
00736
00737 if ( d && d->m_redirectionTimer.isActive() )
00738 d->m_redirectionTimer.stop();
00739
00740
00741 emit nodeActivated(Node());
00742
00743
00744 if ( d->m_view )
00745 d->m_view->closeChildDialogs();
00746
00747 return true;
00748 }
00749
00750 DOM::HTMLDocument KHTMLPart::htmlDocument() const
00751 {
00752 if (d->m_doc && d->m_doc->isHTMLDocument())
00753 return static_cast<HTMLDocumentImpl*>(d->m_doc);
00754 else
00755 return static_cast<HTMLDocumentImpl*>(0);
00756 }
00757
00758 DOM::Document KHTMLPart::document() const
00759 {
00760 return d->m_doc;
00761 }
00762
00763 KParts::BrowserExtension *KHTMLPart::browserExtension() const
00764 {
00765 return d->m_extension;
00766 }
00767
00768 KParts::BrowserHostExtension *KHTMLPart::browserHostExtension() const
00769 {
00770 return d->m_hostExtension;
00771 }
00772
00773 KHTMLView *KHTMLPart::view() const
00774 {
00775 return d->m_view;
00776 }
00777
00778 void KHTMLPart::setStatusMessagesEnabled( bool enable )
00779 {
00780 d->m_statusMessagesEnabled = enable;
00781 }
00782
00783 KJS::Interpreter *KHTMLPart::jScriptInterpreter()
00784 {
00785 KJSProxy *proxy = jScript();
00786 if (!proxy || proxy->paused())
00787 return 0;
00788
00789 return proxy->interpreter();
00790 }
00791
00792 bool KHTMLPart::statusMessagesEnabled() const
00793 {
00794 return d->m_statusMessagesEnabled;
00795 }
00796
00797 void KHTMLPart::setJScriptEnabled( bool enable )
00798 {
00799 if ( !enable && jScriptEnabled() && d->m_jscript ) {
00800 d->m_jscript->clear();
00801 }
00802 d->m_bJScriptForce = enable;
00803 d->m_bJScriptOverride = true;
00804 }
00805
00806 bool KHTMLPart::jScriptEnabled() const
00807 {
00808 if(onlyLocalReferences()) return false;
00809
00810 if ( d->m_bJScriptOverride )
00811 return d->m_bJScriptForce;
00812 return d->m_bJScriptEnabled;
00813 }
00814
00815 void KHTMLPart::setMetaRefreshEnabled( bool enable )
00816 {
00817 d->m_metaRefreshEnabled = enable;
00818 }
00819
00820 bool KHTMLPart::metaRefreshEnabled() const
00821 {
00822 return d->m_metaRefreshEnabled;
00823 }
00824
00825
00826
00827
00828
00829
00830
00831
00832 #define DIRECT_LINKAGE_TO_ECMA
00833
00834 #ifdef DIRECT_LINKAGE_TO_ECMA
00835 extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
00836 #endif
00837
00838 KJSProxy *KHTMLPart::jScript()
00839 {
00840 if (!jScriptEnabled()) return 0;
00841
00842 if ( !d->m_jscript )
00843 {
00844 #ifndef DIRECT_LINKAGE_TO_ECMA
00845 KLibrary *lib = KLibLoader::self()->library("kjs_html");
00846 if ( !lib ) {
00847 setJScriptEnabled( false );
00848 return 0;
00849 }
00850
00851 void *sym = lib->symbol("kjs_html_init");
00852 if ( !sym ) {
00853 lib->unload();
00854 setJScriptEnabled( false );
00855 return 0;
00856 }
00857 typedef KJSProxy* (*initFunction)(KHTMLPart *);
00858 initFunction initSym = (initFunction) sym;
00859 d->m_jscript = (*initSym)(this);
00860 d->m_kjs_lib = lib;
00861 #else
00862 d->m_jscript = kjs_html_init(this);
00863
00864 #endif
00865 if (d->m_bJScriptDebugEnabled)
00866 d->m_jscript->setDebugEnabled(true);
00867 }
00868
00869 return d->m_jscript;
00870 }
00871
00872 QVariant KHTMLPart::crossFrameExecuteScript(const QString& target, const QString& script)
00873 {
00874 KHTMLPart* destpart = this;
00875
00876 QString trg = target.lower();
00877
00878 if (target == "_top") {
00879 while (destpart->parentPart())
00880 destpart = destpart->parentPart();
00881 }
00882 else if (target == "_parent") {
00883 if (parentPart())
00884 destpart = parentPart();
00885 }
00886 else if (target == "_self" || target == "_blank") {
00887
00888 }
00889 else {
00890 destpart = findFrame(target);
00891 if (!destpart)
00892 destpart = this;
00893 }
00894
00895
00896 if (destpart == this)
00897 return executeScript(DOM::Node(), script);
00898
00899
00900 if (destpart->checkFrameAccess(this))
00901 return destpart->executeScript(DOM::Node(), script);
00902
00903
00904 return executeScript(DOM::Node(), script);
00905 }
00906
00907
00908
00909
00910 KJSErrorDlg *KHTMLPart::jsErrorExtension() {
00911 if (!d->m_settings->jsErrorsEnabled()) {
00912 return 0L;
00913 }
00914
00915 if (parentPart()) {
00916 return parentPart()->jsErrorExtension();
00917 }
00918
00919 if (!d->m_statusBarJSErrorLabel) {
00920 d->m_statusBarJSErrorLabel = new KURLLabel(d->m_statusBarExtension->statusBar());
00921 d->m_statusBarJSErrorLabel->setFixedHeight(instance()->iconLoader()->currentSize(KIcon::Small));
00922 d->m_statusBarJSErrorLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
00923 d->m_statusBarJSErrorLabel->setUseCursor(false);
00924 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarJSErrorLabel, 0, false);
00925 QToolTip::add(d->m_statusBarJSErrorLabel, i18n("This web page contains coding errors."));
00926 d->m_statusBarJSErrorLabel->setPixmap(SmallIcon("bug", instance()));
00927 connect(d->m_statusBarJSErrorLabel, SIGNAL(leftClickedURL()), SLOT(launchJSErrorDialog()));
00928 connect(d->m_statusBarJSErrorLabel, SIGNAL(rightClickedURL()), SLOT(jsErrorDialogContextMenu()));
00929 }
00930 if (!d->m_jsedlg) {
00931 d->m_jsedlg = new KJSErrorDlg;
00932 d->m_jsedlg->setURL(m_url.prettyURL());
00933 if (KGlobalSettings::showIconsOnPushButtons()) {
00934 d->m_jsedlg->_clear->setIconSet(SmallIconSet("locationbar_erase"));
00935 d->m_jsedlg->_close->setIconSet(SmallIconSet("fileclose"));
00936 }
00937 }
00938 return d->m_jsedlg;
00939 }
00940
00941 void KHTMLPart::removeJSErrorExtension() {
00942 if (parentPart()) {
00943 parentPart()->removeJSErrorExtension();
00944 return;
00945 }
00946 if (d->m_statusBarJSErrorLabel != 0) {
00947 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarJSErrorLabel );
00948 delete d->m_statusBarJSErrorLabel;
00949 d->m_statusBarJSErrorLabel = 0;
00950 }
00951 delete d->m_jsedlg;
00952 d->m_jsedlg = 0;
00953 }
00954
00955 void KHTMLPart::disableJSErrorExtension() {
00956 removeJSErrorExtension();
00957
00958
00959
00960
00961 d->m_settings->setJSErrorsEnabled(false);
00962 DCOPClient::mainClient()->send("konqueror*", "KonquerorIface", "reparseConfiguration()", QByteArray());
00963 }
00964
00965 void KHTMLPart::jsErrorDialogContextMenu() {
00966 KPopupMenu *m = new KPopupMenu(0L);
00967 m->insertItem(i18n("&Hide Errors"), this, SLOT(removeJSErrorExtension()));
00968 m->insertItem(i18n("&Disable Error Reporting"), this, SLOT(disableJSErrorExtension()));
00969 m->popup(QCursor::pos());
00970 }
00971
00972 void KHTMLPart::launchJSErrorDialog() {
00973 KJSErrorDlg *dlg = jsErrorExtension();
00974 if (dlg) {
00975 dlg->show();
00976 dlg->raise();
00977 }
00978 }
00979
00980 QVariant KHTMLPart::executeScript(const QString& filename, int baseLine, const DOM::Node& n, const QString& script)
00981 {
00982 #ifdef KJS_VERBOSE
00983 kdDebug(6070) << "executeScript: caller='" << name() << "' filename=" << filename << " baseLine=" << baseLine << " script=" << script << endl;
00984 #endif
00985 KJSProxy *proxy = jScript();
00986
00987 if (!proxy || proxy->paused())
00988 return QVariant();
00989
00990 KJS::Completion comp;
00991
00992 QVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
00993
00994
00995
00996
00997 if (comp.complType() == KJS::Throw && !comp.value().isNull()) {
00998 KJSErrorDlg *dlg = jsErrorExtension();
00999 if (dlg) {
01000 KJS::UString msg = comp.value().toString(proxy->interpreter()->globalExec());
01001 dlg->addError(i18n("<b>Error</b>: %1: %2").arg(filename, msg.qstring()));
01002 }
01003 }
01004
01005 return ret;
01006 }
01007
01008 QVariant KHTMLPart::executeScript( const QString &script )
01009 {
01010 return executeScript( DOM::Node(), script );
01011 }
01012
01013 QVariant KHTMLPart::executeScript( const DOM::Node &n, const QString &script )
01014 {
01015 #ifdef KJS_VERBOSE
01016 kdDebug(6070) << "KHTMLPart::executeScript caller='" << name() << "' node=" << n.nodeName().string().latin1() << "(" << (n.isNull() ? 0 : n.nodeType()) << ") " << script << endl;
01017 #endif
01018 KJSProxy *proxy = jScript();
01019
01020 if (!proxy || proxy->paused())
01021 return QVariant();
01022 d->m_runningScripts++;
01023 KJS::Completion comp;
01024 QVariant ret = proxy->evaluate( QString::null, 1, script, n, &comp );
01025 d->m_runningScripts--;
01026
01027
01028
01029
01030 if (comp.complType() == KJS::Throw && !comp.value().isNull()) {
01031 KJSErrorDlg *dlg = jsErrorExtension();
01032 if (dlg) {
01033 KJS::UString msg = comp.value().toString(proxy->interpreter()->globalExec());
01034 dlg->addError(i18n("<b>Error</b>: node %1: %2").arg(n.nodeName().string()).arg(msg.qstring()));
01035 }
01036 }
01037
01038 if (!d->m_runningScripts && d->m_doc && !d->m_doc->parsing() && d->m_submitForm )
01039 submitFormAgain();
01040
01041 #ifdef KJS_VERBOSE
01042 kdDebug(6070) << "KHTMLPart::executeScript - done" << endl;
01043 #endif
01044 return ret;
01045 }
01046
01047 bool KHTMLPart::scheduleScript(const DOM::Node &n, const QString& script)
01048 {
01049
01050
01051 d->scheduledScript = script;
01052 d->scheduledScriptNode = n;
01053
01054 return true;
01055 }
01056
01057 QVariant KHTMLPart::executeScheduledScript()
01058 {
01059 if( d->scheduledScript.isEmpty() )
01060 return QVariant();
01061
01062
01063
01064 QVariant ret = executeScript( d->scheduledScriptNode, d->scheduledScript );
01065 d->scheduledScript = QString();
01066 d->scheduledScriptNode = DOM::Node();
01067
01068 return ret;
01069 }
01070
01071 void KHTMLPart::setJavaEnabled( bool enable )
01072 {
01073 d->m_bJavaForce = enable;
01074 d->m_bJavaOverride = true;
01075 }
01076
01077 bool KHTMLPart::javaEnabled() const
01078 {
01079 if (onlyLocalReferences()) return false;
01080
01081 #ifndef Q_WS_QWS
01082 if( d->m_bJavaOverride )
01083 return d->m_bJavaForce;
01084 return d->m_bJavaEnabled;
01085 #else
01086 return false;
01087 #endif
01088 }
01089
01090 KJavaAppletContext *KHTMLPart::javaContext()
01091 {
01092 return 0;
01093 }
01094
01095 KJavaAppletContext *KHTMLPart::createJavaContext()
01096 {
01097 return 0;
01098 }
01099
01100 void KHTMLPart::setPluginsEnabled( bool enable )
01101 {
01102 d->m_bPluginsForce = enable;
01103 d->m_bPluginsOverride = true;
01104 }
01105
01106 bool KHTMLPart::pluginsEnabled() const
01107 {
01108 if (onlyLocalReferences()) return false;
01109
01110 if ( d->m_bPluginsOverride )
01111 return d->m_bPluginsForce;
01112 return d->m_bPluginsEnabled;
01113 }
01114
01115 void KHTMLPart::slotDebugDOMTree()
01116 {
01117 if ( d->m_doc && d->m_doc->firstChild() )
01118 qDebug("%s", d->m_doc->firstChild()->toString().string().latin1());
01119 }
01120
01121 void KHTMLPart::slotDebugScript()
01122 {
01123 if (jScript())
01124 jScript()->showDebugWindow();
01125 }
01126
01127 void KHTMLPart::slotDebugRenderTree()
01128 {
01129 #ifndef NDEBUG
01130 if ( d->m_doc ) {
01131 d->m_doc->renderer()->printTree();
01132
01133
01134
01135
01136
01137 }
01138 #endif
01139 }
01140
01141 void KHTMLPart::slotStopAnimations()
01142 {
01143 stopAnimations();
01144 }
01145
01146 void KHTMLPart::setAutoloadImages( bool enable )
01147 {
01148 if ( d->m_doc && d->m_doc->docLoader()->autoloadImages() == enable )
01149 return;
01150
01151 if ( d->m_doc )
01152 d->m_doc->docLoader()->setAutoloadImages( enable );
01153
01154 unplugActionList( "loadImages" );
01155
01156 if ( enable ) {
01157 delete d->m_paLoadImages;
01158 d->m_paLoadImages = 0;
01159 }
01160 else if ( !d->m_paLoadImages )
01161 d->m_paLoadImages = new KAction( i18n( "Display Images on Page" ), "images_display", 0, this, SLOT( slotLoadImages() ), actionCollection(), "loadImages" );
01162
01163 if ( d->m_paLoadImages ) {
01164 QPtrList<KAction> lst;
01165 lst.append( d->m_paLoadImages );
01166 plugActionList( "loadImages", lst );
01167 }
01168 }
01169
01170 bool KHTMLPart::autoloadImages() const
01171 {
01172 if ( d->m_doc )
01173 return d->m_doc->docLoader()->autoloadImages();
01174
01175 return true;
01176 }
01177
01178 void KHTMLPart::clear()
01179 {
01180 if ( d->m_bCleared )
01181 return;
01182
01183 d->m_bCleared = true;
01184
01185 d->m_bClearing = true;
01186
01187 {
01188 ConstFrameIt it = d->m_frames.begin();
01189 ConstFrameIt end = d->m_frames.end();
01190 for(; it != end; ++it )
01191 {
01192
01193 if ( (*it).m_run )
01194 (*it).m_run->abort();
01195 }
01196 }
01197
01198 {
01199 QValueList<khtml::ChildFrame>::ConstIterator it = d->m_objects.begin();
01200 QValueList<khtml::ChildFrame>::ConstIterator end = d->m_objects.end();
01201 for(; it != end; ++it )
01202 {
01203
01204 if ( (*it).m_run )
01205 (*it).m_run->abort();
01206 }
01207 }
01208
01209
01210 findTextBegin();
01211 d->m_mousePressNode = DOM::Node();
01212
01213
01214 if ( d->m_doc )
01215 d->m_doc->detach();
01216
01217
01218 if ( d->m_jscript )
01219 d->m_jscript->clear();
01220
01221
01222 if (d->m_doc && d->m_doc->renderer() && d->m_doc->renderer()->layer())
01223 d->m_doc->renderer()->layer()->suspendMarquees();
01224
01225 if ( d->m_view )
01226 d->m_view->clear();
01227
01228
01229
01230 if ( d->m_doc ) {
01231 d->m_doc->deref();
01232 }
01233 d->m_doc = 0;
01234
01235 delete d->m_decoder;
01236 d->m_decoder = 0;
01237
01238 {
01239 ConstFrameIt it = d->m_frames.begin();
01240 ConstFrameIt end = d->m_frames.end();
01241 for(; it != end; ++it )
01242 {
01243 if ( (*it).m_part )
01244 {
01245 partManager()->removePart( (*it).m_part );
01246 delete (KParts::ReadOnlyPart *)(*it).m_part;
01247 }
01248 }
01249 }
01250
01251 d->m_frames.clear();
01252 d->m_objects.clear();
01253
01254 d->m_delayRedirect = 0;
01255 d->m_redirectURL = QString::null;
01256 d->m_redirectionTimer.stop();
01257 d->m_redirectLockHistory = true;
01258 d->m_bClearing = false;
01259 d->m_frameNameId = 1;
01260 d->m_bFirstData = true;
01261
01262 d->m_bMousePressed = false;
01263
01264 d->m_selectionStart = DOM::Node();
01265 d->m_selectionEnd = DOM::Node();
01266 d->m_startOffset = 0;
01267 d->m_endOffset = 0;
01268 #ifndef QT_NO_CLIPBOARD
01269 connect( kapp->clipboard(), SIGNAL( selectionChanged()), SLOT( slotClearSelection()));
01270 #endif
01271
01272 d->m_jobPercent = 0;
01273
01274 if ( !d->m_haveEncoding )
01275 d->m_encoding = QString::null;
01276 #ifdef SPEED_DEBUG
01277 d->m_parsetime.restart();
01278 #endif
01279 }
01280
01281 bool KHTMLPart::openFile()
01282 {
01283 return true;
01284 }
01285
01286 DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const
01287 {
01288 if ( d && d->m_doc && d->m_doc->isHTMLDocument() )
01289 return static_cast<HTMLDocumentImpl*>(d->m_doc);
01290 return 0;
01291 }
01292
01293 DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const
01294 {
01295 if ( d )
01296 return d->m_doc;
01297 return 0;
01298 }
01299
01300 void KHTMLPart::slotInfoMessage(KIO::Job* kio_job, const QString& msg)
01301 {
01302 assert(d->m_job == kio_job);
01303
01304 if (!parentPart())
01305 setStatusBarText(msg, BarDefaultText);
01306 }
01307
01308 void KHTMLPart::setPageSecurity( PageSecurity sec )
01309 {
01310 if ( sec != NotCrypted && !d->m_statusBarIconLabel && !parentPart() ) {
01311 d->m_statusBarIconLabel = new KURLLabel( d->m_statusBarExtension->statusBar() );
01312 d->m_statusBarIconLabel->setFixedHeight( instance()->iconLoader()->currentSize(KIcon::Small) );
01313 d->m_statusBarIconLabel->setSizePolicy(QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ));
01314 d->m_statusBarIconLabel->setUseCursor( false );
01315 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarIconLabel, 0, false );
01316 connect( d->m_statusBarIconLabel, SIGNAL( leftClickedURL() ), SLOT( slotSecurity() ) );
01317 } else if (d->m_statusBarIconLabel) {
01318 QToolTip::remove(d->m_statusBarIconLabel);
01319 }
01320
01321 if (d->m_statusBarIconLabel) {
01322 if (d->m_ssl_in_use)
01323 QToolTip::add(d->m_statusBarIconLabel,
01324 i18n("Session is secured with %1 bit %2.").arg(d->m_ssl_cipher_used_bits).arg(d->m_ssl_cipher));
01325 else QToolTip::add(d->m_statusBarIconLabel, i18n("Session is not secured."));
01326 }
01327
01328 QString iconName;
01329 switch (sec) {
01330 case NotCrypted:
01331 iconName = "decrypted";
01332 if ( d->m_statusBarIconLabel ) {
01333 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarIconLabel );
01334 delete d->m_statusBarIconLabel;
01335 d->m_statusBarIconLabel = 0L;
01336 }
01337 break;
01338 case Encrypted:
01339 iconName = "encrypted";
01340 break;
01341 case Mixed:
01342 iconName = "halfencrypted";
01343 break;
01344 }
01345 d->m_paSecurity->setIcon( iconName );
01346 if ( d->m_statusBarIconLabel )
01347 d->m_statusBarIconLabel->setPixmap( SmallIcon( iconName, instance() ) );
01348 }
01349
01350 void KHTMLPart::slotData( KIO::Job* kio_job, const QByteArray &data )
01351 {
01352 assert ( d->m_job == kio_job );
01353
01354
01355
01356 if ( !d->m_workingURL.isEmpty() )
01357 {
01358
01359
01360
01361
01362
01363 d->m_job->suspend();
01364 begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
01365 d->m_job->resume();
01366
01367 if (d->m_cachePolicy == KIO::CC_Refresh)
01368 d->m_doc->docLoader()->setCachePolicy(KIO::CC_Verify);
01369 else
01370 d->m_doc->docLoader()->setCachePolicy(d->m_cachePolicy);
01371
01372 d->m_workingURL = KURL();
01373
01374 d->m_cacheId = KHTMLPageCache::self()->createCacheEntry();
01375
01376
01377 d->m_httpHeaders = d->m_job->queryMetaData("HTTP-Headers");
01378 time_t cacheCreationDate = d->m_job->queryMetaData("cache-creation-date").toLong();
01379 d->m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
01380
01381 d->m_pageServices = d->m_job->queryMetaData("PageServices");
01382 d->m_pageReferrer = d->m_job->queryMetaData("referrer");
01383
01384 d->m_bSecurityInQuestion = false;
01385 d->m_ssl_in_use = (d->m_job->queryMetaData("ssl_in_use") == "TRUE");
01386
01387 {
01388 KHTMLPart *p = parentPart();
01389 if (p && p->d->m_ssl_in_use != d->m_ssl_in_use) {
01390 while (p->parentPart()) p = p->parentPart();
01391
01392 p->setPageSecurity( Mixed );
01393 p->d->m_bSecurityInQuestion = true;
01394 }
01395 }
01396
01397 setPageSecurity( d->m_ssl_in_use ? Encrypted : NotCrypted );
01398
01399
01400 d->m_ssl_parent_ip = d->m_job->queryMetaData("ssl_parent_ip");
01401 d->m_ssl_parent_cert = d->m_job->queryMetaData("ssl_parent_cert");
01402 d->m_ssl_peer_certificate = d->m_job->queryMetaData("ssl_peer_certificate");
01403 d->m_ssl_peer_chain = d->m_job->queryMetaData("ssl_peer_chain");
01404 d->m_ssl_peer_ip = d->m_job->queryMetaData("ssl_peer_ip");
01405 d->m_ssl_cipher = d->m_job->queryMetaData("ssl_cipher");
01406 d->m_ssl_cipher_desc = d->m_job->queryMetaData("ssl_cipher_desc");
01407 d->m_ssl_cipher_version = d->m_job->queryMetaData("ssl_cipher_version");
01408 d->m_ssl_cipher_used_bits = d->m_job->queryMetaData("ssl_cipher_used_bits");
01409 d->m_ssl_cipher_bits = d->m_job->queryMetaData("ssl_cipher_bits");
01410 d->m_ssl_cert_state = d->m_job->queryMetaData("ssl_cert_state");
01411
01412 if (d->m_statusBarIconLabel) {
01413 QToolTip::remove(d->m_statusBarIconLabel);
01414 if (d->m_ssl_in_use) {
01415 QToolTip::add(d->m_statusBarIconLabel, i18n("Session is secured with %1 bit %2.").arg(d->m_ssl_cipher_used_bits).arg(d->m_ssl_cipher));
01416 } else {
01417 QToolTip::add(d->m_statusBarIconLabel, i18n("Session is not secured."));
01418 }
01419 }
01420
01421
01422 QString qData = d->m_job->queryMetaData("charset");
01423 if ( !qData.isEmpty() && !d->m_haveEncoding )
01424 d->m_encoding = qData;
01425
01426
01427 qData = d->m_job->queryMetaData("http-refresh");
01428 if( !qData.isEmpty())
01429 d->m_doc->processHttpEquiv("refresh", qData);
01430
01431
01432 QString baseURL = d->m_job->queryMetaData ("content-location");
01433 if (!baseURL.isEmpty())
01434 d->m_doc->setBaseURL(KURL( d->m_doc->completeURL(baseURL) ));
01435
01436
01437 if ( !m_url.isLocalFile() ) {
01438
01439 d->m_lastModified = d->m_job->queryMetaData("modified");
01440 } else
01441 d->m_lastModified = QString::null;
01442
01443
01444 d->m_view->setContentsPos( 0, 0 );
01445 }
01446
01447 KHTMLPageCache::self()->addData(d->m_cacheId, data);
01448 write( data.data(), data.size() );
01449 if (d->m_jscript)
01450 d->m_jscript->dataReceived();
01451 }
01452
01453 void KHTMLPart::slotRestoreData(const QByteArray &data )
01454 {
01455
01456 if ( !d->m_workingURL.isEmpty() )
01457 {
01458 long saveCacheId = d->m_cacheId;
01459 QString savePageReferrer = d->m_pageReferrer;
01460 begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
01461 d->m_pageReferrer = savePageReferrer;
01462 d->m_cacheId = saveCacheId;
01463 d->m_workingURL = KURL();
01464 }
01465
01466
01467 write( data.data(), data.size() );
01468
01469 if (data.size() == 0)
01470 {
01471
01472
01473 if (d->m_doc && d->m_doc->parsing())
01474 end();
01475 }
01476 }
01477
01478 void KHTMLPart::showError( KIO::Job* job )
01479 {
01480 kdDebug(6050) << "KHTMLPart::showError d->m_bParsing=" << (d->m_doc && d->m_doc->parsing()) << " d->m_bComplete=" << d->m_bComplete
01481 << " d->m_bCleared=" << d->m_bCleared << endl;
01482
01483 if (job->error() == KIO::ERR_NO_CONTENT)
01484 return;
01485
01486 if ( (d->m_doc && d->m_doc->parsing()) || d->m_workingURL.isEmpty() )
01487 job->showErrorDialog( );
01488 else
01489 {
01490 htmlError( job->error(), job->errorText(), d->m_workingURL );
01491 }
01492 }
01493
01494
01495 void KHTMLPart::htmlError( int errorCode, const QString& text, const KURL& reqUrl )
01496 {
01497 kdDebug(6050) << "KHTMLPart::htmlError errorCode=" << errorCode << " text=" << text << endl;
01498
01499 bool bJSFO = d->m_bJScriptForce;
01500 bool bJSOO = d->m_bJScriptOverride;
01501 d->m_bJScriptForce = false;
01502 d->m_bJScriptOverride = true;
01503 begin();
01504 QString errText = QString::fromLatin1( "<HTML dir=%1><HEAD><TITLE>" )
01505 .arg(QApplication::reverseLayout() ? "rtl" : "ltr");
01506 errText += i18n( "Error while loading %1" ).arg( reqUrl.htmlURL() );
01507 errText += QString::fromLatin1( "</TITLE></HEAD><BODY><P>" );
01508 errText += i18n( "An error occurred while loading <B>%1</B>:" ).arg( reqUrl.htmlURL() );
01509 errText += QString::fromLatin1( "</P><P>" );
01510 QString kioErrString = KIO::buildErrorString( errorCode, text );
01511
01512 kioErrString.replace('&', QString("&"));
01513 kioErrString.replace('<', QString("<"));
01514 kioErrString.replace('>', QString(">"));
01515
01516
01517 kioErrString.replace( '\n', "<BR/>" );
01518
01519 errText += kioErrString;
01520 errText += QString::fromLatin1( "</P></BODY></HTML>" );
01521 write(errText);
01522 end();
01523
01524 d->m_bJScriptForce = bJSFO;
01525 d->m_bJScriptOverride = bJSOO;
01526
01527
01528
01529
01530 m_url = reqUrl;
01531 d->m_workingURL = KURL();
01532 emit started( 0 );
01533 emit completed();
01534 return;
01535
01536
01537 QString errorName, techName, description;
01538 QStringList causes, solutions;
01539
01540 QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
01541 QDataStream stream(raw, IO_ReadOnly);
01542
01543 stream >> errorName >> techName >> description >> causes >> solutions;
01544
01545 QString url, protocol, datetime;
01546 url = reqUrl.prettyURL();
01547 protocol = reqUrl.protocol();
01548 datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
01549 false );
01550
01551 QString doc = QString::fromLatin1( "<html><head><title>" );
01552 doc += i18n( "Error: " );
01553 doc += errorName;
01554 doc += QString::fromLatin1( " - %1</title></head><body><h1>" ).arg( url );
01555 doc += i18n( "The requested operation could not be completed" );
01556 doc += QString::fromLatin1( "</h1><h2>" );
01557 doc += errorName;
01558 doc += QString::fromLatin1( "</h2>" );
01559 if ( !techName.isNull() ) {
01560 doc += QString::fromLatin1( "<h2>" );
01561 doc += i18n( "Technical Reason: " );
01562 doc += techName;
01563 doc += QString::fromLatin1( "</h2>" );
01564 }
01565 doc += QString::fromLatin1( "<h3>" );
01566 doc += i18n( "Details of the Request:" );
01567 doc += QString::fromLatin1( "</h3><ul><li>" );
01568 doc += i18n( "URL: %1" ).arg( url );
01569 doc += QString::fromLatin1( "</li><li>" );
01570 if ( !protocol.isNull() ) {
01571
01572
01573 doc += QString::fromLatin1( "</li><li>" );
01574 }
01575 doc += i18n( "Date and Time: %1" ).arg( datetime );
01576 doc += QString::fromLatin1( "</li><li>" );
01577 doc += i18n( "Additional Information: %1" ).arg( text );
01578 doc += QString::fromLatin1( "</li></ul><h3>" );
01579 doc += i18n( "Description:" );
01580 doc += QString::fromLatin1( "</h3><p>" );
01581 doc += description;
01582 doc += QString::fromLatin1( "</p>" );
01583 if ( causes.count() ) {
01584 doc += QString::fromLatin1( "<h3>" );
01585 doc += i18n( "Possible Causes:" );
01586 doc += QString::fromLatin1( "</h3><ul><li>" );
01587 doc += causes.join( "</li><li>" );
01588 doc += QString::fromLatin1( "</li></ul>" );
01589 }
01590 if ( solutions.count() ) {
01591 doc += QString::fromLatin1( "<h3>" );
01592 doc += i18n( "Possible Solutions:" );
01593 doc += QString::fromLatin1( "</h3><ul><li>" );
01594 doc += solutions.join( "</li><li>" );
01595 doc += QString::fromLatin1( "</li></ul>" );
01596 }
01597 doc += QString::fromLatin1( "</body></html>" );
01598
01599 write( doc );
01600 end();
01601 }
01602
01603 void KHTMLPart::slotFinished( KIO::Job * job )
01604 {
01605 d->m_job = 0L;
01606 d->m_jobspeed = 0L;
01607
01608 if (job->error())
01609 {
01610 KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
01611
01612
01613
01614
01615
01616
01617 if (job->error() == KIO::ERR_IS_DIRECTORY)
01618 {
01619 KParts::URLArgs args;
01620 emit d->m_extension->openURLRequest( d->m_workingURL, args );
01621 }
01622 else
01623 {
01624 emit canceled( job->errorString() );
01625
01626 checkCompleted();
01627 showError( job );
01628 }
01629
01630 return;
01631 }
01632
01633
01634 KHTMLPageCache::self()->endData(d->m_cacheId);
01635 if (d->m_jscript)
01636 d->m_jscript->dataReceived();
01637
01638 if ( d->m_doc && d->m_doc->docLoader()->expireDate() && m_url.protocol().lower().startsWith("http"))
01639 KIO::http_update_cache(m_url, false, d->m_doc->docLoader()->expireDate());
01640
01641 d->m_workingURL = KURL();
01642
01643 if ( d->m_doc && d->m_doc->parsing())
01644 end();
01645 }
01646
01647 void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset )
01648 {
01649 clear();
01650 d->m_bCleared = false;
01651 d->m_cacheId = 0;
01652 d->m_bComplete = false;
01653 d->m_bLoadEventEmitted = false;
01654 d->m_bWalletOpened = false;
01655
01656 if(url.isValid()) {
01657 QString urlString = url.url();
01658 KHTMLFactory::vLinks()->insert( urlString );
01659 QString urlString2 = url.prettyURL();
01660 if ( urlString != urlString2 ) {
01661 KHTMLFactory::vLinks()->insert( urlString2 );
01662 }
01663 }
01664
01665
01666 if (!parentPart()) {
01667 removeJSErrorExtension();
01668 }
01669
01670
01671
01672
01673 KParts::URLArgs args( d->m_extension->urlArgs() );
01674 args.xOffset = xOffset;
01675 args.yOffset = yOffset;
01676 d->m_extension->setURLArgs( args );
01677
01678 d->m_pageReferrer = QString::null;
01679
01680 KURL ref(url);
01681 d->m_referrer = ref.protocol().startsWith("http") ? ref.url() : "";
01682
01683 m_url = url;
01684 KURL baseurl;
01685
01686 if ( !m_url.isEmpty() )
01687 {
01688 KURL title( baseurl );
01689 title.setRef( QString::null );
01690 title.setQuery( QString::null );
01691 emit setWindowCaption( title.prettyURL() );
01692 }
01693 else
01694 emit setWindowCaption( i18n( "[Untitled]" ) );
01695
01696
01697 if (args.serviceType == "text/xml")
01698 d->m_doc = DOMImplementationImpl::instance()->createDocument( d->m_view );
01699 else
01700 d->m_doc = DOMImplementationImpl::instance()->createHTMLDocument( d->m_view );
01701 #ifndef KHTML_NO_CARET
01702
01703 #endif
01704
01705 d->m_doc->ref();
01706 d->m_doc->setURL( m_url.url() );
01707 if (!d->m_doc->attached())
01708 d->m_doc->attach( );
01709
01710
01711 d->m_doc->setBaseURL( baseurl );
01712 d->m_doc->docLoader()->setShowAnimations( KHTMLFactory::defaultHTMLSettings()->showAnimations() );
01713 emit docCreated();
01714
01715 d->m_paUseStylesheet->setItems(QStringList());
01716 d->m_paUseStylesheet->setEnabled( false );
01717
01718 setAutoloadImages( KHTMLFactory::defaultHTMLSettings()->autoLoadImages() );
01719 QString userStyleSheet = KHTMLFactory::defaultHTMLSettings()->userStyleSheet();
01720 if ( !userStyleSheet.isEmpty() )
01721 setUserStyleSheet( KURL( userStyleSheet ) );
01722
01723 d->m_doc->setRestoreState(args.docState);
01724 d->m_doc->open();
01725 connect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
01726
01727 emit d->m_extension->enableAction( "print", true );
01728
01729 d->m_doc->setParsing(true);
01730 }
01731
01732 void KHTMLPart::write( const char *str, int len )
01733 {
01734 if ( !d->m_decoder )
01735 d->m_decoder = createDecoder();
01736
01737 if ( len == -1 )
01738 len = strlen( str );
01739
01740 if ( len == 0 )
01741 return;
01742
01743 QString decoded = d->m_decoder->decode( str, len );
01744
01745 if(decoded.isEmpty()) return;
01746
01747 if(d->m_bFirstData) {
01748
01749 d->m_doc->determineParseMode( decoded );
01750 d->m_bFirstData = false;
01751
01752
01753
01754 if(d->m_decoder->visuallyOrdered()) d->m_doc->setVisuallyOrdered();
01755 d->m_doc->setDecoderCodec(d->m_decoder->codec());
01756 d->m_doc->recalcStyle( NodeImpl::Force );
01757 }
01758
01759 khtml::Tokenizer* t = d->m_doc->tokenizer();
01760 if(t)
01761 t->write( decoded, true );
01762 }
01763
01764 void KHTMLPart::write( const QString &str )
01765 {
01766 if ( str.isNull() )
01767 return;
01768
01769 if(d->m_bFirstData) {
01770
01771 d->m_doc->setParseMode( DocumentImpl::Strict );
01772 d->m_bFirstData = false;
01773 }
01774 khtml::Tokenizer* t = d->m_doc->tokenizer();
01775 if(t)
01776 t->write( str, true );
01777 }
01778
01779 void KHTMLPart::end()
01780 {
01781
01782 if(d->m_decoder)
01783 write(d->m_decoder->flush());
01784 if (d->m_doc)
01785 d->m_doc->finishParsing();
01786 }
01787
01788 bool KHTMLPart::doOpenStream( const QString& mimeType )
01789 {
01790 if ( mimeType == "text/html" || mimeType == "text/xml" || mimeType == "application/xhtml+xml" )
01791 {
01792 begin( url() );
01793 return true;
01794 }
01795 return false;
01796 }
01797
01798 bool KHTMLPart::doWriteStream( const QByteArray& data )
01799 {
01800 write( data.data(), data.size() );
01801 return true;
01802 }
01803
01804 bool KHTMLPart::doCloseStream()
01805 {
01806 end();
01807 return true;
01808 }
01809
01810
01811 void KHTMLPart::paint(QPainter *p, const QRect &rc, int yOff, bool *more)
01812 {
01813 if (!d->m_view) return;
01814 d->m_view->paint(p, rc, yOff, more);
01815 }
01816
01817 void KHTMLPart::stopAnimations()
01818 {
01819 if ( d->m_doc )
01820 d->m_doc->docLoader()->setShowAnimations( KHTMLSettings::KAnimationDisabled );
01821
01822 ConstFrameIt it = d->m_frames.begin();
01823 ConstFrameIt end = d->m_frames.end();
01824 for (; it != end; ++it )
01825 if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
01826 KParts::ReadOnlyPart* p = ( *it ).m_part;
01827 static_cast<KHTMLPart*>( p )->stopAnimations();
01828 }
01829 }
01830
01831 void KHTMLPart::slotFinishedParsing()
01832 {
01833 d->m_doc->setParsing(false);
01834 checkEmitLoadEvent();
01835 disconnect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
01836
01837 if (!d->m_view)
01838 return;
01839
01840
01841
01842 d->m_view->restoreScrollBar();
01843
01844 checkCompleted();
01845 }
01846
01847 void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
01848 {
01849 if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
01850 KHTMLPart* p = this;
01851 while ( p ) {
01852 KHTMLPart* op = p;
01853 p->d->m_totalObjectCount++;
01854 p = p->parentPart();
01855 if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount
01856 && !op->d->m_progressUpdateTimer.isActive())
01857 op->d->m_progressUpdateTimer.start( 200, true );
01858 }
01859 }
01860 }
01861
01862 void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
01863 {
01864 if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
01865 KHTMLPart* p = this;
01866 while ( p ) {
01867 KHTMLPart* op = p;
01868 p->d->m_loadedObjects++;
01869 p = p->parentPart();
01870 if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount && op->d->m_jobPercent <= 100
01871 && !op->d->m_progressUpdateTimer.isActive())
01872 op->d->m_progressUpdateTimer.start( 200, true );
01873 }
01874 }
01875
01876 checkCompleted();
01877 }
01878
01879 void KHTMLPart::slotProgressUpdate()
01880 {
01881 int percent;
01882 if ( d->m_loadedObjects < d->m_totalObjectCount )
01883 percent = d->m_jobPercent / 4 + ( d->m_loadedObjects*300 ) / ( 4*d->m_totalObjectCount );
01884 else
01885 percent = d->m_jobPercent;
01886
01887 if( d->m_bComplete )
01888 percent = 100;
01889
01890 if (d->m_statusMessagesEnabled) {
01891 if( d->m_bComplete )
01892 emit d->m_extension->infoMessage( i18n( "Page loaded." ));
01893 else if ( d->m_loadedObjects < d->m_totalObjectCount && percent >= 75 )
01894 emit d->m_extension->infoMessage( i18n( "%n Image of %1 loaded.", "%n Images of %1 loaded.", d->m_loadedObjects).arg(d->m_totalObjectCount) );
01895 }
01896
01897 emit d->m_extension->loadingProgress( percent );
01898 }
01899
01900 void KHTMLPart::slotJobSpeed( KIO::Job* , unsigned long speed )
01901 {
01902 d->m_jobspeed = speed;
01903 if (!parentPart())
01904 setStatusBarText(jsStatusBarText(), BarOverrideText);
01905 }
01906
01907 void KHTMLPart::slotJobPercent( KIO::Job* , unsigned long percent )
01908 {
01909 d->m_jobPercent = percent;
01910
01911 if ( !parentPart() )
01912 d->m_progressUpdateTimer.start( 0, true );
01913 }
01914
01915 void KHTMLPart::slotJobDone( KIO::Job* )
01916 {
01917 d->m_jobPercent = 100;
01918
01919 if ( !parentPart() )
01920 d->m_progressUpdateTimer.start( 0, true );
01921 }
01922
01923 void KHTMLPart::slotUserSheetStatDone( KIO::Job *_job )
01924 {
01925 using namespace KIO;
01926
01927 if ( _job->error() ) {
01928 showError( _job );
01929 return;
01930 }
01931
01932 const UDSEntry entry = dynamic_cast<KIO::StatJob *>( _job )->statResult();
01933 UDSEntry::ConstIterator it = entry.begin();
01934 UDSEntry::ConstIterator end = entry.end();
01935 for ( ; it != end; ++it ) {
01936 if ( ( *it ).m_uds == UDS_MODIFICATION_TIME ) {
01937 break;
01938 }
01939 }
01940
01941
01942
01943 if ( it != end ) {
01944 const time_t lastModified = static_cast<time_t>( ( *it ).m_long );
01945 if ( d->m_userStyleSheetLastModified >= lastModified ) {
01946 return;
01947 }
01948 d->m_userStyleSheetLastModified = lastModified;
01949 }
01950
01951 setUserStyleSheet( KURL( settings()->userStyleSheet() ) );
01952 }
01953
01954 void KHTMLPart::checkCompleted()
01955 {
01956
01957
01958
01959
01960
01961 if (d->m_doc && !d->m_doc->parsing() && !d->m_focusNodeRestored)
01962 {
01963 if (d->m_focusNodeNumber >= 0)
01964 d->m_doc->setFocusNode(d->m_doc->nodeWithAbsIndex(d->m_focusNodeNumber));
01965
01966 d->m_focusNodeRestored = true;
01967 }
01968
01969 bool bPendingChildRedirection = false;
01970
01971 ConstFrameIt it = d->m_frames.begin();
01972 ConstFrameIt end = d->m_frames.end();
01973 for (; it != end; ++it ) {
01974 if ( !(*it).m_bCompleted )
01975 {
01976
01977 return;
01978 }
01979
01980 if ( (*it).m_bPendingRedirection )
01981 bPendingChildRedirection = true;
01982 }
01983
01984
01985 for (it = d->m_objects.begin(); it != d->m_objects.end(); ++it )
01986 if ( !(*it).m_bCompleted )
01987 return;
01988
01989
01990 if ( d->m_bComplete || (d->m_doc && d->m_doc->parsing()) )
01991 return;
01992
01993
01994 int requests = 0;
01995 if ( d->m_doc && d->m_doc->docLoader() )
01996 requests = khtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
01997
01998 if ( requests > 0 )
01999 {
02000
02001 return;
02002 }
02003
02004
02005
02006 d->m_bComplete = true;
02007 d->m_cachePolicy = KProtocolManager::cacheControl();
02008 d->m_totalObjectCount = 0;
02009 d->m_loadedObjects = 0;
02010
02011 KHTMLPart* p = this;
02012 while ( p ) {
02013 KHTMLPart* op = p;
02014 p = p->parentPart();
02015 if ( !p && !op->d->m_progressUpdateTimer.isActive())
02016 op->d->m_progressUpdateTimer.start( 0, true );
02017 }
02018
02019 checkEmitLoadEvent();
02020
02021
02022
02023 if ( m_url.encodedHtmlRef().isEmpty() && d->m_view->contentsY() == 0 )
02024 d->m_view->setContentsPos( d->m_extension->urlArgs().xOffset,
02025 d->m_extension->urlArgs().yOffset );
02026
02027 d->m_view->complete();
02028
02029 if ( !d->m_redirectURL.isEmpty() )
02030 {
02031
02032
02033 if ( parentPart() == 0 )
02034 d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
02035
02036 emit completed( true );
02037 }
02038 else
02039 {
02040 if ( bPendingChildRedirection )
02041 emit completed( true );
02042 else
02043 emit completed();
02044 }
02045
02046
02047 QStringList sheets;
02048 if (d->m_doc)
02049 sheets = d->m_doc->availableStyleSheets();
02050 sheets.prepend( i18n( "Automatic Detection" ) );
02051 d->m_paUseStylesheet->setItems( sheets );
02052
02053 d->m_paUseStylesheet->setEnabled( sheets.count() > 2);
02054 if (sheets.count() > 2)
02055 {
02056 d->m_paUseStylesheet->setCurrentItem(kMax(sheets.findIndex(d->m_sheetUsed), 0));
02057 slotUseStylesheet();
02058 }
02059
02060 setJSDefaultStatusBarText(QString::null);
02061
02062 #ifdef SPEED_DEBUG
02063 kdDebug(6050) << "DONE: " <<d->m_parsetime.elapsed() << endl;
02064 #endif
02065 }
02066
02067 void KHTMLPart::checkEmitLoadEvent()
02068 {
02069 if ( d->m_bLoadEventEmitted || !d->m_doc || d->m_doc->parsing() ) return;
02070
02071 ConstFrameIt it = d->m_frames.begin();
02072 ConstFrameIt end = d->m_frames.end();
02073 for (; it != end; ++it )
02074 if ( !(*it).m_bCompleted )
02075 return;
02076
02077 for (it = d->m_objects.begin(); it != d->m_objects.end(); ++it )
02078 if ( !(*it).m_bCompleted )
02079 return;
02080
02081
02082
02083
02084 int requests = 0;
02085 if ( d->m_doc && d->m_doc->docLoader() )
02086 requests = khtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
02087
02088 if ( requests > 0 )
02089 return;
02090
02091 d->m_bLoadEventEmitted = true;
02092 if (d->m_doc)
02093 d->m_doc->close();
02094 }
02095
02096 const KHTMLSettings *KHTMLPart::settings() const
02097 {
02098 return d->m_settings;
02099 }
02100
02101 #ifndef KDE_NO_COMPAT
02102 KURL KHTMLPart::baseURL() const
02103 {
02104 if ( !d->m_doc ) return KURL();
02105
02106 return d->m_doc->baseURL();
02107 }
02108
02109 QString KHTMLPart::baseTarget() const
02110 {
02111 if ( !d->m_doc ) return QString::null;
02112
02113 return d->m_doc->baseTarget();
02114 }
02115 #endif
02116
02117 KURL KHTMLPart::completeURL( const QString &url )
02118 {
02119 if ( !d->m_doc ) return KURL( url );
02120
02121 if (d->m_decoder)
02122 return KURL(d->m_doc->completeURL(url), d->m_decoder->codec()->mibEnum());
02123
02124 return KURL( d->m_doc->completeURL( url ) );
02125 }
02126
02127 void KHTMLPart::scheduleRedirection( int delay, const QString &url, bool doLockHistory )
02128 {
02129 kdDebug(6050) << "KHTMLPart::scheduleRedirection delay=" << delay << " url=" << url << endl;
02130 kdDebug(6050) << "current redirectURL=" << d->m_redirectURL << " with delay " << d->m_delayRedirect << endl;
02131 if( delay < 24*60*60 &&
02132 ( d->m_redirectURL.isEmpty() || delay <= d->m_delayRedirect) ) {
02133 d->m_delayRedirect = delay;
02134 d->m_redirectURL = url;
02135 d->m_redirectLockHistory = doLockHistory;
02136 kdDebug(6050) << " d->m_bComplete=" << d->m_bComplete << endl;
02137 if ( d->m_bComplete ) {
02138 d->m_redirectionTimer.stop();
02139 d->m_redirectionTimer.start( kMax(0, 1000 * d->m_delayRedirect), true );
02140 }
02141 }
02142 }
02143
02144 void KHTMLPart::slotRedirect()
02145 {
02146 kdDebug() << k_funcinfo << endl;
02147 QString u = d->m_redirectURL;
02148 d->m_delayRedirect = 0;
02149 d->m_redirectURL = QString::null;
02150
02151
02152 if ( u.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
02153 {
02154 QString script = KURL::decode_string( u.right( u.length() - 11 ) );
02155 kdDebug( 6050 ) << "KHTMLPart::slotRedirect script=" << script << endl;
02156 QVariant res = executeScript( DOM::Node(), script );
02157 if ( res.type() == QVariant::String ) {
02158 begin( url() );
02159 write( res.asString() );
02160 end();
02161 }
02162 return;
02163 }
02164 KParts::URLArgs args;
02165
02166
02167 KURL cUrl( m_url );
02168 KURL url( u );
02169
02170
02171 if ( openedByJS() && d->m_opener )
02172 cUrl = d->m_opener->url();
02173
02174 if (!kapp || !kapp->authorizeURLAction("redirect", cUrl, url))
02175 {
02176 kdWarning(6050) << "KHTMLPart::scheduleRedirection: Redirection from " << cUrl.prettyURL() << " to " << url.prettyURL() << " REJECTED!" << endl;
02177 return;
02178 }
02179
02180 if ( urlcmp( u, m_url.url(), true, true ) )
02181 {
02182 args.metaData().insert("referrer", d->m_pageReferrer);
02183 }
02184
02185
02186 args.setRedirectedRequest(true);
02187
02188 args.setLockHistory( d->m_redirectLockHistory );
02189
02190 urlSelected( u, 0, 0, "_self", args );
02191 }
02192
02193 void KHTMLPart::slotRedirection(KIO::Job*, const KURL& url)
02194 {
02195
02196
02197 emit d->m_extension->setLocationBarURL( url.prettyURL() );
02198 d->m_workingURL = url;
02199 }
02200
02201 bool KHTMLPart::setEncoding( const QString &name, bool override )
02202 {
02203 d->m_encoding = name;
02204 d->m_haveEncoding = override;
02205
02206 if( !m_url.isEmpty() ) {
02207
02208 closeURL();
02209 KURL url = m_url;
02210 m_url = 0;
02211 d->m_restored = true;
02212 openURL(url);
02213 d->m_restored = false;
02214 }
02215
02216 return true;
02217 }
02218
02219 QString KHTMLPart::encoding() const
02220 {
02221 if(d->m_haveEncoding && !d->m_encoding.isEmpty())
02222 return d->m_encoding;
02223
02224 if(d->m_decoder && d->m_decoder->encoding())
02225 return QString(d->m_decoder->encoding());
02226
02227 return(settings()->encoding());
02228 }
02229
02230 void KHTMLPart::setUserStyleSheet(const KURL &url)
02231 {
02232 if ( d->m_doc && d->m_doc->docLoader() )
02233 (void) new khtml::PartStyleSheetLoader(this, url.url(), d->m_doc->docLoader());
02234 }
02235
02236 void KHTMLPart::setUserStyleSheet(const QString &styleSheet)
02237 {
02238 if ( d->m_doc )
02239 d->m_doc->setUserStyleSheet( styleSheet );
02240 }
02241
02242 void KHTMLPart::gotoAnchor()
02243 {
02244 disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(gotoAnchor()));
02245 if ( !gotoAnchor( m_url.encodedHtmlRef()) )
02246 gotoAnchor( m_url.htmlRef() );
02247 }
02248
02249 bool KHTMLPart::gotoAnchor( const QString &name )
02250 {
02251 if (!d->m_doc)
02252 return false;
02253
02254 HTMLCollectionImpl *anchors =
02255 new HTMLCollectionImpl( d->m_doc, HTMLCollectionImpl::DOC_ANCHORS);
02256 anchors->ref();
02257 NodeImpl *n = anchors->namedItem(name);
02258 anchors->deref();
02259
02260 if(!n) {
02261 n = d->m_doc->getElementById( name );
02262 }
02263
02264 if(!n) {
02265 kdDebug(6050) << "KHTMLPart::gotoAnchor node '" << name << "' not found" << endl;
02266 return false;
02267 }
02268
02269 int x = 0, y = 0;
02270 int gox, dummy;
02271 HTMLElementImpl *a = static_cast<HTMLElementImpl *>(n);
02272
02273 a->getUpperLeftCorner(x, y);
02274 if (x <= d->m_view->contentsX())
02275 gox = x - 10;
02276 else {
02277 gox = d->m_view->contentsX();
02278 if ( x + 10 > d->m_view->contentsX()+d->m_view->visibleWidth()) {
02279 a->getLowerRightCorner(x, dummy);
02280 gox = x - d->m_view->visibleWidth() + 10;
02281 }
02282 }
02283
02284 d->m_view->setContentsPos(gox, y-20);
02285
02286 return true;
02287 }
02288
02289 bool KHTMLPart::nextAnchor()
02290 {
02291 if (!d->m_doc)
02292 return false;
02293 d->m_view->focusNextPrevNode ( true );
02294
02295 return true;
02296 }
02297
02298 bool KHTMLPart::prevAnchor()
02299 {
02300 if (!d->m_doc)
02301 return false;
02302 d->m_view->focusNextPrevNode ( false );
02303
02304 return true;
02305 }
02306
02307 void KHTMLPart::setStandardFont( const QString &name )
02308 {
02309 d->m_settings->setStdFontName(name);
02310 }
02311
02312 void KHTMLPart::setFixedFont( const QString &name )
02313 {
02314 d->m_settings->setFixedFontName(name);
02315 }
02316
02317 void KHTMLPart::setURLCursor( const QCursor &c )
02318 {
02319 d->m_linkCursor = c;
02320 }
02321
02322 QCursor KHTMLPart::urlCursor() const
02323 {
02324 return d->m_linkCursor;
02325 }
02326
02327 bool KHTMLPart::onlyLocalReferences() const
02328 {
02329 return d->m_onlyLocalReferences;
02330 }
02331
02332 void KHTMLPart::setOnlyLocalReferences(bool enable)
02333 {
02334 d->m_onlyLocalReferences = enable;
02335 }
02336
02337 void KHTMLPartPrivate::setFlagRecursively(
02338 bool KHTMLPartPrivate::*flag, bool value)
02339 {
02340
02341 this->*flag = value;
02342
02343
02344 QValueList<khtml::ChildFrame>::Iterator it = m_frames.begin();
02345 for (; it != m_frames.end(); ++it) {
02346 KHTMLPart *part = static_cast<KHTMLPart *>((KParts::ReadOnlyPart *)(*it).m_part);
02347 if (part->inherits("KHTMLPart"))
02348 part->d->setFlagRecursively(flag, value);
02349 }
02350
02351
02352 it = m_objects.begin();
02353 for (; it != m_objects.end(); ++it) {
02354 KHTMLPart *part = static_cast<KHTMLPart *>((KParts::ReadOnlyPart *)(*it).m_part);
02355 if (part->inherits("KHTMLPart"))
02356 part->d->setFlagRecursively(flag, value);
02357 }
02358 }
02359
02360 void KHTMLPart::setCaretMode(bool enable)
02361 {
02362 #ifndef KHTML_NO_CARET
02363 kdDebug(6200) << "setCaretMode(" << enable << ")" << endl;
02364 if (isCaretMode() == enable) return;
02365 d->setFlagRecursively(&KHTMLPartPrivate::m_caretMode, enable);
02366
02367 if (!isEditable()) {
02368 if (enable) {
02369 view()->initCaret(true);
02370 view()->ensureCaretVisible();
02371 } else
02372 view()->caretOff();
02373 }
02374 #endif // KHTML_NO_CARET
02375 }
02376
02377 bool KHTMLPart::isCaretMode() const
02378 {
02379 return d->m_caretMode;
02380 }
02381
02382 void KHTMLPart::setEditable(bool enable)
02383 {
02384 #ifndef KHTML_NO_CARET
02385 if (isEditable() == enable) return;
02386 d->setFlagRecursively(&KHTMLPartPrivate::m_designMode, enable);
02387
02388 if (!isCaretMode()) {
02389 if (enable) {
02390 view()->initCaret(true);
02391 view()->ensureCaretVisible();
02392 } else
02393 view()->caretOff();
02394 }
02395 #endif // KHTML_NO_CARET
02396 }
02397
02398 bool KHTMLPart::isEditable() const
02399 {
02400 return d->m_designMode;
02401 }
02402
02403 void KHTMLPart::setCaretPosition(DOM::Node node, long offset, bool extendSelection)
02404 {
02405 #ifndef KHTML_NO_CARET
02406 #if 0
02407 kdDebug(6200) << k_funcinfo << "node: " << node.handle() << " nodeName: "
02408 << node.nodeName().string() << " offset: " << offset
02409 << " extendSelection " << extendSelection << endl;
02410 #endif
02411 if (view()->moveCaretTo(node.handle(), offset, !extendSelection))
02412 emitSelectionChanged();
02413 view()->ensureCaretVisible();
02414 #endif // KHTML_NO_CARET
02415 }
02416
02417 KHTMLPart::CaretDisplayPolicy KHTMLPart::caretDisplayPolicyNonFocused() const
02418 {
02419 #ifndef KHTML_NO_CARET
02420 return (CaretDisplayPolicy)view()->caretDisplayPolicyNonFocused();
02421 #else // KHTML_NO_CARET
02422 return CaretInvisible;
02423 #endif // KHTML_NO_CARET
02424 }
02425
02426 void KHTMLPart::setCaretDisplayPolicyNonFocused(CaretDisplayPolicy policy)
02427 {
02428 #ifndef KHTML_NO_CARET
02429 view()->setCaretDisplayPolicyNonFocused(policy);
02430 #endif // KHTML_NO_CARET
02431 }
02432
02433 void KHTMLPart::setCaretVisible(bool show)
02434 {
02435 #ifndef KHTML_NO_CARET
02436 if (show) {
02437
02438 NodeImpl *caretNode = xmlDocImpl()->focusNode();
02439 if (isCaretMode() || isEditable()
02440 || (caretNode && caretNode->contentEditable())) {
02441 view()->caretOn();
02442 }
02443
02444 } else {
02445
02446 view()->caretOff();
02447
02448 }
02449 #endif // KHTML_NO_CARET
02450 }
02451
02452 void KHTMLPart::findTextBegin()
02453 {
02454 d->m_findPos = -1;
02455 d->m_findNode = 0;
02456 d->m_findPosEnd = -1;
02457 d->m_findNodeEnd= 0;
02458 delete d->m_find;
02459 d->m_find = 0L;
02460 }
02461
02462 bool KHTMLPart::initFindNode( bool selection, bool reverse, bool fromCursor )
02463 {
02464 if ( !d->m_doc )
02465 return false;
02466
02467 DOM::NodeImpl* firstNode = 0L;
02468 if (d->m_doc->isHTMLDocument())
02469 firstNode = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
02470 else
02471 firstNode = d->m_doc;
02472
02473 if ( !firstNode )
02474 {
02475
02476 return false;
02477 }
02478 if ( firstNode->id() == ID_FRAMESET )
02479 {
02480
02481 return false;
02482 }
02483
02484 if ( selection && hasSelection() )
02485 {
02486
02487 if ( !fromCursor )
02488 {
02489 d->m_findNode = reverse ? d->m_selectionEnd.handle() : d->m_selectionStart.handle();
02490 d->m_findPos = reverse ? d->m_endOffset : d->m_startOffset;
02491 }
02492 d->m_findNodeEnd = reverse ? d->m_selectionStart.handle() : d->m_selectionEnd.handle();
02493 d->m_findPosEnd = reverse ? d->m_startOffset : d->m_endOffset;
02494 }
02495 else
02496 {
02497
02498 if ( !fromCursor )
02499 {
02500 d->m_findNode = firstNode;
02501 d->m_findPos = reverse ? -1 : 0;
02502 }
02503 d->m_findNodeEnd = reverse ? firstNode : 0;
02504 d->m_findPosEnd = reverse ? 0 : -1;
02505 if ( reverse )
02506 {
02507
02508 khtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
02509 if ( obj )
02510 {
02511
02512 while ( obj->lastChild() )
02513 {
02514 obj = obj->lastChild();
02515 }
02516
02517 while ( !obj->element() && obj->objectAbove() )
02518 {
02519 obj = obj->objectAbove();
02520 }
02521 d->m_findNode = obj->element();
02522 }
02523 }
02524 }
02525 return true;
02526 }
02527
02528
02529 bool KHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive, bool isRegExp )
02530 {
02531 if ( !initFindNode( false, !forward, false ) )
02532 return false;
02533 while(1)
02534 {
02535 if( (d->m_findNode->nodeType() == Node::TEXT_NODE || d->m_findNode->nodeType() == Node::CDATA_SECTION_NODE) && d->m_findNode->renderer() )
02536 {
02537 DOMString nodeText = d->m_findNode->nodeValue();
02538 DOMStringImpl *t = nodeText.implementation();
02539 QConstString s(t->s, t->l);
02540
02541 int matchLen = 0;
02542 if ( isRegExp ) {
02543 QRegExp matcher( str );
02544 matcher.setCaseSensitive( caseSensitive );
02545 d->m_findPos = matcher.search(s.string(), d->m_findPos+1);
02546 if ( d->m_findPos != -1 )
02547 matchLen = matcher.matchedLength();
02548 }
02549 else {
02550 d->m_findPos = s.string().find(str, d->m_findPos+1, caseSensitive);
02551 matchLen = str.length();
02552 }
02553
02554 if(d->m_findPos != -1)
02555 {
02556 int x = 0, y = 0;
02557 if(static_cast<khtml::RenderText *>(d->m_findNode->renderer())
02558 ->posOfChar(d->m_findPos, x, y))
02559 d->m_view->setContentsPos(x-50, y-50);
02560
02561 d->m_selectionStart = d->m_findNode;
02562 d->m_startOffset = d->m_findPos;
02563 d->m_selectionEnd = d->m_findNode;
02564 d->m_endOffset = d->m_findPos + matchLen;
02565 d->m_startBeforeEnd = true;
02566
02567 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
02568 d->m_selectionEnd.handle(), d->m_endOffset );
02569 emitSelectionChanged();
02570 return true;
02571 }
02572 }
02573 d->m_findPos = -1;
02574
02575 NodeImpl *next;
02576
02577 if ( forward )
02578 {
02579 next = d->m_findNode->firstChild();
02580
02581 if(!next) next = d->m_findNode->nextSibling();
02582 while(d->m_findNode && !next) {
02583 d->m_findNode = d->m_findNode->parentNode();
02584 if( d->m_findNode ) {
02585 next = d->m_findNode->nextSibling();
02586 }
02587 }
02588 }
02589 else
02590 {
02591 next = d->m_findNode->lastChild();
02592
02593 if (!next ) next = d->m_findNode->previousSibling();
02594 while ( d->m_findNode && !next )
02595 {
02596 d->m_findNode = d->m_findNode->parentNode();
02597 if( d->m_findNode )
02598 {
02599 next = d->m_findNode->previousSibling();
02600 }
02601 }
02602 }
02603
02604 d->m_findNode = next;
02605 if(!d->m_findNode) return false;
02606 }
02607 }
02608
02609
02610 void KHTMLPart::slotFind()
02611 {
02612 KParts::ReadOnlyPart *part = currentFrame();
02613 if (!part)
02614 return;
02615 if (!part->inherits("KHTMLPart") )
02616 {
02617 kdError(6000) << "slotFind: part is a " << part->className() << ", can't do a search into it" << endl;
02618 return;
02619 }
02620 static_cast<KHTMLPart *>( part )->findText();
02621 }
02622
02623 void KHTMLPart::slotFindNext()
02624 {
02625 KParts::ReadOnlyPart *part = currentFrame();
02626 if (!part)
02627 return;
02628 if (!part->inherits("KHTMLPart") )
02629 {
02630 kdError(6000) << "slotFindNext: part is a " << part->className() << ", can't do a search into it" << endl;
02631 return;
02632 }
02633 static_cast<KHTMLPart *>( part )->findTextNext();
02634 }
02635
02636 void KHTMLPart::slotFindDone()
02637 {
02638
02639 }
02640
02641 void KHTMLPart::slotFindDialogDestroyed()
02642 {
02643 d->m_lastFindState.options = d->m_findDialog->options();
02644 d->m_lastFindState.history = d->m_findDialog->findHistory();
02645 d->m_findDialog->deleteLater();
02646 d->m_findDialog = 0L;
02647 }
02648
02649 void KHTMLPart::findText()
02650 {
02651
02652 if ( !d->m_doc )
02653 return;
02654
02655
02656 if ( d->m_findDialog )
02657 {
02658 KWin::activateWindow( d->m_findDialog->winId() );
02659 return;
02660 }
02661
02662
02663 #ifndef QT_NO_CLIPBOARD
02664 disconnect( kapp->clipboard(), SIGNAL(selectionChanged()), this, SLOT(slotClearSelection()) );
02665 #endif
02666
02667
02668 d->m_findDialog = new KFindDialog( false , widget(), "khtmlfind" );
02669 d->m_findDialog->setHasSelection( hasSelection() );
02670 d->m_findDialog->setHasCursor( d->m_findNode != 0 );
02671 if ( d->m_findNode )
02672 d->m_lastFindState.options |= KFindDialog::FromCursor;
02673
02674
02675 d->m_findDialog->setFindHistory( d->m_lastFindState.history );
02676 d->m_findDialog->setOptions( d->m_lastFindState.options );
02677
02678 d->m_lastFindState.options = -1;
02679
02680 d->m_findDialog->show();
02681 connect( d->m_findDialog, SIGNAL(okClicked()), this, SLOT(slotFindNext()) );
02682 connect( d->m_findDialog, SIGNAL(finished()), this, SLOT(slotFindDialogDestroyed()) );
02683
02684 findText( d->m_findDialog->pattern(), 0 , widget(), d->m_findDialog );
02685 }
02686
02687 void KHTMLPart::findText( const QString &str, long options, QWidget *parent, KFindDialog *findDialog )
02688 {
02689
02690 if ( !d->m_doc )
02691 return;
02692
02693 #ifndef QT_NO_CLIPBOARD
02694 connect( kapp->clipboard(), SIGNAL(selectionChanged()), SLOT(slotClearSelection()) );
02695 #endif
02696
02697
02698 delete d->m_find;
02699 d->m_find = new KFind( str, options, parent, findDialog );
02700 d->m_find->closeFindNextDialog();
02701 connect( d->m_find, SIGNAL( highlight( const QString &, int, int ) ),
02702 this, SLOT( slotHighlight( const QString &, int, int ) ) );
02703
02704
02705
02706 if ( !findDialog )
02707 {
02708 d->m_lastFindState.options = options;
02709 initFindNode( options & KFindDialog::SelectedText,
02710 options & KFindDialog::FindBackwards,
02711 options & KFindDialog::FromCursor );
02712 }
02713 }
02714
02715
02716 bool KHTMLPart::findTextNext()
02717 {
02718 if (!d->m_find)
02719 {
02720
02721 findText();
02722 return false;
02723 }
02724
02725 long options = 0;
02726 if ( d->m_findDialog )
02727 {
02728 if ( d->m_find->pattern() != d->m_findDialog->pattern() ) {
02729 d->m_find->setPattern( d->m_findDialog->pattern() );
02730 d->m_find->resetCounts();
02731 }
02732 options = d->m_findDialog->options();
02733 if ( d->m_lastFindState.options != options )
02734 {
02735 d->m_find->setOptions( options );
02736
02737 if ( options & KFindDialog::SelectedText )
02738 Q_ASSERT( hasSelection() );
02739
02740 long difference = d->m_lastFindState.options ^ options;
02741 if ( difference & (KFindDialog::SelectedText | KFindDialog::FromCursor ) )
02742 {
02743
02744 (void) initFindNode( options & KFindDialog::SelectedText,
02745 options & KFindDialog::FindBackwards,
02746 options & KFindDialog::FromCursor );
02747 }
02748 d->m_lastFindState.options = options;
02749 }
02750 } else
02751 options = d->m_lastFindState.options;
02752
02753 KFind::Result res = KFind::NoMatch;
02754 khtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
02755 khtml::RenderObject* end = d->m_findNodeEnd ? d->m_findNodeEnd->renderer() : 0;
02756 khtml::RenderTextArea *tmpTextArea=0L;
02757
02758 while( res == KFind::NoMatch )
02759 {
02760 if ( d->m_find->needData() )
02761 {
02762 if ( !obj ) {
02763
02764 break;
02765 }
02766
02767
02768
02769
02770
02771 d->m_stringPortions.clear();
02772 int newLinePos = -1;
02773 QString str;
02774 DOM::NodeImpl* lastNode = d->m_findNode;
02775 while ( obj && newLinePos == -1 )
02776 {
02777
02778 QString s;
02779 bool renderAreaText = obj->parent() && (QCString(obj->parent()->renderName())== "RenderTextArea");
02780 bool renderLineText = (QCString(obj->renderName())== "RenderLineEdit");
02781 if ( renderAreaText )
02782 {
02783 khtml::RenderTextArea *parent= static_cast<khtml::RenderTextArea *>(obj->parent());
02784 s = parent->text();
02785 s = s.replace(0xa0, ' ');
02786 tmpTextArea = parent;
02787 }
02788 else if ( renderLineText )
02789 {
02790 khtml::RenderLineEdit *parentLine= static_cast<khtml::RenderLineEdit *>(obj);
02791 s = parentLine->widget()->text();
02792 s = s.replace(0xa0, ' ');
02793 }
02794 else if ( obj->isText() )
02795 {
02796 bool isLink = false;
02797
02798
02799 if ( options & FindLinksOnly )
02800 {
02801 DOM::NodeImpl *parent = obj->element();
02802 while ( parent )
02803 {
02804 if ( parent->nodeType() == Node::ELEMENT_NODE && parent->id() == ID_A )
02805 {
02806 isLink = true;
02807 break;
02808 }
02809 parent = parent->parentNode();
02810 }
02811 }
02812 else
02813 {
02814 isLink = true;
02815 }
02816
02817 if ( isLink && obj->parent()!=tmpTextArea )
02818 {
02819 s = static_cast<khtml::RenderText *>(obj)->data().string();
02820 s = s.replace(0xa0, ' ');
02821 }
02822 }
02823 else if ( obj->isBR() )
02824 s = '\n';
02825 else if ( !obj->isInline() && !str.isEmpty() )
02826 s = '\n';
02827
02828 if ( lastNode == d->m_findNodeEnd )
02829 s.truncate( d->m_findPosEnd );
02830 if ( !s.isEmpty() )
02831 {
02832 newLinePos = s.find( '\n' );
02833 int index = str.length();
02834 if ( newLinePos != -1 )
02835 newLinePos += index;
02836 str += s;
02837
02838 d->m_stringPortions.append( KHTMLPartPrivate::StringPortion( index, lastNode ) );
02839 }
02840
02841 if ( obj == end )
02842 obj = 0L;
02843 else
02844 {
02845
02846
02847 do {
02848
02849
02850
02851 obj = (options & KFindDialog::FindBackwards) ? obj->objectAbove() : obj->objectBelow();
02852 } while ( obj && !obj->element() );
02853 }
02854 if ( obj )
02855 lastNode = obj->element();
02856 else
02857 lastNode = 0;
02858 }
02859
02860 if ( !str.isEmpty() )
02861 {
02862 d->m_find->setData( str, d->m_findPos );
02863 }
02864
02865 d->m_findPos = -1;
02866 d->m_findNode = lastNode;
02867 }
02868 if ( !d->m_find->needData() )
02869 {
02870
02871 res = d->m_find->find();
02872 }
02873 }
02874
02875 if ( res == KFind::NoMatch )
02876 {
02877 kdDebug() << "No more matches." << endl;
02878 if ( !(options & FindNoPopups) && d->m_find->shouldRestart() )
02879 {
02880
02881 initFindNode( false, options & KFindDialog::FindBackwards, false );
02882 findTextNext();
02883 }
02884 else
02885 {
02886
02887
02888
02889 initFindNode( false, options & KFindDialog::FindBackwards, false );
02890 d->m_find->resetCounts();
02891 slotClearSelection();
02892 }
02893 kdDebug() << "Dialog closed." << endl;
02894 }
02895
02896 return res == KFind::Match;
02897 }
02898
02899 void KHTMLPart::slotHighlight( const QString& , int index, int length )
02900 {
02901
02902 QValueList<KHTMLPartPrivate::StringPortion>::Iterator it = d->m_stringPortions.begin();
02903 QValueList<KHTMLPartPrivate::StringPortion>::Iterator prev = it;
02904
02905 while ( it != d->m_stringPortions.end() && (*it).index <= index )
02906 {
02907 prev = it;
02908 ++it;
02909 }
02910 Q_ASSERT ( prev != d->m_stringPortions.end() );
02911 DOM::NodeImpl* node = (*prev).node;
02912 Q_ASSERT( node );
02913
02914 d->m_selectionStart = node;
02915 d->m_startOffset = index - (*prev).index;
02916
02917 khtml::RenderObject* obj = node->renderer();
02918 khtml::RenderTextArea *parent = 0L;
02919 khtml::RenderLineEdit *parentLine = 0L;
02920 bool renderLineText =false;
02921
02922 QRect highlightedRect;
02923 bool renderAreaText =false;
02924 Q_ASSERT( obj );
02925 if ( obj )
02926 {
02927 int x = 0, y = 0;
02928 renderAreaText = (QCString(obj->parent()->renderName())== "RenderTextArea");
02929 renderLineText = (QCString(obj->renderName())== "RenderLineEdit");
02930
02931
02932 if( renderAreaText )
02933 parent= static_cast<khtml::RenderTextArea *>(obj->parent());
02934 if ( renderLineText )
02935 parentLine= static_cast<khtml::RenderLineEdit *>(obj);
02936 if ( !renderLineText )
02937
02938
02939 {
02940 int dummy;
02941 static_cast<khtml::RenderText *>(node->renderer())
02942 ->caretPos( d->m_startOffset, false, x, y, dummy, dummy );
02943
02944 if ( x != -1 || y != -1 )
02945 {
02946 d->m_view->setContentsPos(x-50, y-50);
02947 highlightedRect.setTopLeft( d->m_view->mapToGlobal(QPoint(x, y)) );
02948 }
02949 }
02950 }
02951
02952 it = prev;
02953 while ( it != d->m_stringPortions.end() && (*it).index < index + length )
02954 {
02955 prev = it;
02956 ++it;
02957 }
02958 Q_ASSERT ( prev != d->m_stringPortions.end() );
02959
02960 d->m_selectionEnd = (*prev).node;
02961 d->m_endOffset = index + length - (*prev).index;
02962 d->m_startBeforeEnd = true;
02963
02964
02965 if(d->m_selectionStart == d->m_selectionEnd)
02966 {
02967 bool isLink = false;
02968
02969
02970 DOM::NodeImpl *parent = d->m_selectionStart.handle();
02971 while ( parent )
02972 {
02973 if ( parent->nodeType() == Node::ELEMENT_NODE && parent->id() == ID_A )
02974 {
02975 isLink = true;
02976 break;
02977 }
02978 parent = parent->parentNode();
02979 }
02980
02981 if(isLink == true)
02982 {
02983 d->m_doc->setFocusNode( parent );
02984 }
02985 }
02986
02987 #if 0
02988 kdDebug(6050) << "slotHighlight: " << d->m_selectionStart.handle() << "," << d->m_startOffset << " - " <<
02989 d->m_selectionEnd.handle() << "," << d->m_endOffset << endl;
02990 it = d->m_stringPortions.begin();
02991 for ( ; it != d->m_stringPortions.end() ; ++it )
02992 kdDebug(6050) << " StringPortion: from index=" << (*it).index << " -> node=" << (*it).node << endl;
02993 #endif
02994 if( renderAreaText )
02995 {
02996 if( parent )
02997 parent->highLightWord( length, d->m_endOffset-length );
02998 }
02999 else if ( renderLineText )
03000 {
03001 if( parentLine )
03002 parentLine->highLightWord( length, d->m_endOffset-length );
03003 }
03004 else
03005 {
03006 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
03007 d->m_selectionEnd.handle(), d->m_endOffset );
03008 if (d->m_selectionEnd.handle()->renderer() )
03009 {
03010 int x, y, height, dummy;
03011 static_cast<khtml::RenderText *>(d->m_selectionEnd.handle()->renderer())
03012 ->caretPos( d->m_endOffset, false, x, y, dummy, height );
03013
03014 if ( x != -1 || y != -1 )
03015 {
03016
03017
03018 highlightedRect.setBottomRight( d->m_view->mapToGlobal( QPoint(x, y+height) ) );
03019 }
03020 }
03021 }
03022 emitSelectionChanged();
03023
03024
03025 if ( d->m_findDialog && !highlightedRect.isNull() )
03026 {
03027 highlightedRect.moveBy( -d->m_view->contentsX(), -d->m_view->contentsY() );
03028
03029 KDialog::avoidArea( d->m_findDialog, highlightedRect );
03030 }
03031 }
03032
03033 QString KHTMLPart::selectedText() const
03034 {
03035 bool hasNewLine = true;
03036 QString text;
03037 DOM::Node n = d->m_selectionStart;
03038 while(!n.isNull()) {
03039 if(n.nodeType() == DOM::Node::TEXT_NODE && n.handle()->renderer()) {
03040 QString str = n.nodeValue().string();
03041 hasNewLine = false;
03042 if(n == d->m_selectionStart && n == d->m_selectionEnd)
03043 text = str.mid(d->m_startOffset, d->m_endOffset - d->m_startOffset);
03044 else if(n == d->m_selectionStart)
03045 text = str.mid(d->m_startOffset);
03046 else if(n == d->m_selectionEnd)
03047 text += str.left(d->m_endOffset);
03048 else
03049 text += str;
03050 }
03051 else {
03052
03053 unsigned short id = n.elementId();
03054 switch(id) {
03055 case ID_BR:
03056 text += "\n";
03057 hasNewLine = true;
03058 break;
03059
03060 case ID_TD:
03061 case ID_TH:
03062 case ID_HR:
03063 case ID_OL:
03064 case ID_UL:
03065 case ID_LI:
03066 case ID_DD:
03067 case ID_DL:
03068 case ID_DT:
03069 case ID_PRE:
03070 case ID_BLOCKQUOTE:
03071 case ID_DIV:
03072 if (!hasNewLine)
03073 text += "\n";
03074 hasNewLine = true;
03075 break;
03076 case ID_P:
03077 case ID_TR:
03078 case ID_H1:
03079 case ID_H2:
03080 case ID_H3:
03081 case ID_H4:
03082 case ID_H5:
03083 case ID_H6:
03084 if (!hasNewLine)
03085 text += "\n";
03086 text += "\n";
03087 hasNewLine = true;
03088 break;
03089 }
03090 }
03091 if(n == d->m_selectionEnd) break;
03092 DOM::Node next = n.firstChild();
03093 if(next.isNull()) next = n.nextSibling();
03094 while( next.isNull() && !n.parentNode().isNull() ) {
03095 n = n.parentNode();
03096 next = n.nextSibling();
03097 unsigned short id = n.elementId();
03098 switch(id) {
03099 case ID_TD:
03100 case ID_TH:
03101 case ID_HR:
03102 case ID_OL:
03103 case ID_UL:
03104 case ID_LI:
03105 case ID_DD:
03106 case ID_DL:
03107 case ID_DT:
03108 case ID_PRE:
03109 case ID_BLOCKQUOTE:
03110 case ID_DIV:
03111 if (!hasNewLine)
03112 text += "\n";
03113 hasNewLine = true;
03114 break;
03115 case ID_P:
03116 case ID_TR:
03117 case ID_H1:
03118 case ID_H2:
03119 case ID_H3:
03120 case ID_H4:
03121 case ID_H5:
03122 case ID_H6:
03123 if (!hasNewLine)
03124 text += "\n";
03125 text += "\n";
03126 hasNewLine = true;
03127 break;
03128 }
03129 }
03130
03131 n = next;
03132 }
03133
03134 if(text.isEmpty())
03135 return QString::null;
03136
03137 int start = 0;
03138 int end = text.length();
03139
03140
03141 while ((start < end) && (text[start] == '\n'))
03142 start++;
03143
03144
03145 while ((start < (end-1)) && (text[end-1] == '\n') && (text[end-2] == '\n'))
03146 end--;
03147
03148 return text.mid(start, end-start);
03149 }
03150
03151 bool KHTMLPart::hasSelection() const
03152 {
03153 if ( d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() )
03154 return false;
03155 if ( d->m_selectionStart == d->m_selectionEnd &&
03156 d->m_startOffset == d->m_endOffset )
03157 return false;
03158 return true;
03159 }
03160
03161 DOM::Range KHTMLPart::selection() const
03162 {
03163 DOM::Range r = document().createRange();DOM::Range();
03164 r.setStart( d->m_selectionStart, d->m_startOffset );
03165 r.setEnd( d->m_selectionEnd, d->m_endOffset );
03166 return r;
03167 }
03168
03169 void KHTMLPart::selection(DOM::Node &s, long &so, DOM::Node &e, long &eo) const
03170 {
03171 s = d->m_selectionStart;
03172 so = d->m_startOffset;
03173 e = d->m_selectionEnd;
03174 eo = d->m_endOffset;
03175 }
03176
03177 void KHTMLPart::setSelection( const DOM::Range &r )
03178 {
03179 d->m_selectionStart = r.startContainer();
03180 d->m_startOffset = r.startOffset();
03181 d->m_selectionEnd = r.endContainer();
03182 d->m_endOffset = r.endOffset();
03183 d->m_doc->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
03184 d->m_selectionEnd.handle(),d->m_endOffset);
03185 #ifndef KHTML_NO_CARET
03186 bool v = d->m_view->placeCaret();
03187 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
03188 #endif
03189 }
03190
03191 void KHTMLPart::slotClearSelection()
03192 {
03193 bool hadSelection = hasSelection();
03194 #ifndef KHTML_NO_CARET
03195
03196
03197
03198 #else
03199 d->m_selectionStart = 0;
03200 d->m_startOffset = 0;
03201 d->m_selectionEnd = 0;
03202 d->m_endOffset = 0;
03203 #endif
03204 if ( d->m_doc ) d->m_doc->clearSelection();
03205 if ( hadSelection )
03206 emitSelectionChanged();
03207 #ifndef KHTML_NO_CARET
03208 bool v = d->m_view->placeCaret();
03209 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
03210 #endif
03211 }
03212
03213 void KHTMLPart::overURL( const QString &url, const QString &target, bool )
03214 {
03215 KURL u = completeURL(url);
03216
03217
03218 if ( url.isEmpty() )
03219 u.setFileName( url );
03220
03221 emit onURL( url );
03222
03223 if ( url.isEmpty() ) {
03224 setStatusBarText(u.htmlURL(), BarHoverText);
03225 return;
03226 }
03227
03228 if (url.find( QString::fromLatin1( "javascript:" ),0, false ) == 0 ) {
03229 QString jscode = KURL::decode_string( url.mid( url.find( "javascript:", 0, false ) ) );
03230 jscode = KStringHandler::rsqueeze( jscode, 80 );
03231 setStatusBarText( QStyleSheet::escape( jscode ), BarHoverText );
03232 return;
03233 }
03234
03235 KFileItem item(u, QString::null, KFileItem::Unknown);
03236 emit d->m_extension->mouseOverInfo(&item);
03237
03238 QString com;
03239
03240 KMimeType::Ptr typ = KMimeType::findByURL( u );
03241
03242 if ( typ )
03243 com = typ->comment( u, false );
03244
03245 if ( !u.isValid() ) {
03246 setStatusBarText(u.htmlURL(), BarHoverText);
03247 return;
03248 }
03249
03250 if ( u.isLocalFile() )
03251 {
03252
03253
03254 QCString path = QFile::encodeName( u.path() );
03255
03256 struct stat buff;
03257 bool ok = !stat( path.data(), &buff );
03258
03259 struct stat lbuff;
03260 if (ok) ok = !lstat( path.data(), &lbuff );
03261
03262 QString text = u.htmlURL();
03263 QString text2 = text;
03264
03265 if (ok && S_ISLNK( lbuff.st_mode ) )
03266 {
03267 QString tmp;
03268 if ( com.isNull() )
03269 tmp = i18n( "Symbolic Link");
03270 else
03271 tmp = i18n("%1 (Link)").arg(com);
03272 char buff_two[1024];
03273 text += " -> ";
03274 int n = readlink ( path.data(), buff_two, 1022);
03275 if (n == -1)
03276 {
03277 text2 += " ";
03278 text2 += tmp;
03279 setStatusBarText(text2, BarHoverText);
03280 return;
03281 }
03282 buff_two[n] = 0;
03283
03284 text += buff_two;
03285 text += " ";
03286 text += tmp;
03287 }
03288 else if ( ok && S_ISREG( buff.st_mode ) )
03289 {
03290 if (buff.st_size < 1024)
03291 text = i18n("%2 (%1 bytes)").arg((long) buff.st_size).arg(text2);
03292 else
03293 {
03294 float d = (float) buff.st_size/1024.0;
03295 text = i18n("%2 (%1 K)").arg(KGlobal::locale()->formatNumber(d, 2)).arg(text2);
03296 }
03297 text += " ";
03298 text += com;
03299 }
03300 else if ( ok && S_ISDIR( buff.st_mode ) )
03301 {
03302 text += " ";
03303 text += com;
03304 }
03305 else
03306 {
03307 text += " ";
03308 text += com;
03309 }
03310 setStatusBarText(text, BarHoverText);
03311 }
03312 else
03313 {
03314 QString extra;
03315 if (target.lower() == "_blank")
03316 {
03317 extra = i18n(" (In new window)");
03318 }
03319 else if (!target.isEmpty() &&
03320 (target.lower() != "_top") &&
03321 (target.lower() != "_self") &&
03322 (target.lower() != "_parent"))
03323 {
03324 extra = i18n(" (In other frame)");
03325 }
03326
03327 if (u.protocol() == QString::fromLatin1("mailto")) {
03328 QString mailtoMsg ;
03329 mailtoMsg += i18n("Email to: ") + KURL::decode_string(u.path());
03330 QStringList queries = QStringList::split('&', u.query().mid(1));
03331 for (QStringList::Iterator it = queries.begin(); it != queries.end(); ++it)
03332 if ((*it).startsWith(QString::fromLatin1("subject=")))
03333 mailtoMsg += i18n(" - Subject: ") + KURL::decode_string((*it).mid(8));
03334 else if ((*it).startsWith(QString::fromLatin1("cc=")))
03335 mailtoMsg += i18n(" - CC: ") + KURL::decode_string((*it).mid(3));
03336 else if ((*it).startsWith(QString::fromLatin1("bcc=")))
03337 mailtoMsg += i18n(" - BCC: ") + KURL::decode_string((*it).mid(4));
03338 mailtoMsg.replace(QString::fromLatin1("&"), QString("&"));
03339 mailtoMsg.replace(QString::fromLatin1("<"), QString("<"));
03340 mailtoMsg.replace(QString::fromLatin1(">"), QString(">"));
03341 mailtoMsg.replace(QRegExp("([\n\r\t]|[ ]{10})"), QString::null);
03342 setStatusBarText("<qt>"+mailtoMsg, BarHoverText);
03343 return;
03344 }
03345
03346 #if 0
03347 else if (u.protocol() == QString::fromLatin1("http")) {
03348 DOM::Node hrefNode = nodeUnderMouse().parentNode();
03349 while (hrefNode.nodeName().string() != QString::fromLatin1("A") && !hrefNode.isNull())
03350 hrefNode = hrefNode.parentNode();
03351
03352 if (!hrefNode.isNull()) {
03353 DOM::Node hreflangNode = hrefNode.attributes().getNamedItem("HREFLANG");
03354 if (!hreflangNode.isNull()) {
03355 QString countryCode = hreflangNode.nodeValue().string().lower();
03356
03357 if (countryCode == QString::fromLatin1("en"))
03358 countryCode = QString::fromLatin1("gb");
03359 QString flagImg = QString::fromLatin1("<img src=%1>").arg(
03360 locate("locale", QString::fromLatin1("l10n/")
03361 + countryCode
03362 + QString::fromLatin1("/flag.png")));
03363 emit setStatusBarText(flagImg + u.prettyURL() + extra);
03364 }
03365 }
03366 }
03367 #endif
03368 setStatusBarText(u.htmlURL() + extra, BarHoverText);
03369 }
03370 }
03371
03372
03373
03374
03375
03376 void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target, KParts::URLArgs args )
03377 {
03378 kdDebug() << k_funcinfo << url << endl;
03379 bool hasTarget = false;
03380
03381 QString target = _target;
03382 if ( target.isEmpty() && d->m_doc )
03383 target = d->m_doc->baseTarget();
03384 if ( !target.isEmpty() )
03385 hasTarget = true;
03386
03387 if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
03388 {
03389 crossFrameExecuteScript( target, KURL::decode_string( url.mid( 11 ) ) );
03390 return;
03391 }
03392
03393 KURL cURL = completeURL(url);
03394
03395 if ( url.isEmpty() )
03396 cURL.setFileName( url );
03397
03398 if ( !cURL.isValid() )
03399
03400 return;
03401
03402 kdDebug( 6000 ) << "urlSelected: complete URL:" << cURL.url() << " target = " << target << endl;
03403
03404 if ( state & ControlButton )
03405 {
03406 args.setNewTab(true);
03407 emit d->m_extension->createNewWindow( cURL, args );
03408 return;
03409 }
03410
03411 if ( button == LeftButton && ( state & ShiftButton ) )
03412 {
03413 KIO::MetaData metaData;
03414 metaData["referrer"] = d->m_referrer;
03415 KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), cURL, metaData );
03416 return;
03417 }
03418
03419 if (!checkLinkSecurity(cURL,
03420 i18n( "<qt>This untrusted page links to<BR><B>%1</B>.<BR>Do you want to follow the link?" ),
03421 i18n( "Follow" )))
03422 return;
03423
03424 args.frameName = target;
03425
03426 args.metaData().insert("main_frame_request",
03427 parentPart() == 0 ? "TRUE":"FALSE");
03428 args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
03429 args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
03430 args.metaData().insert("PropagateHttpHeader", "true");
03431 args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
03432 args.metaData().insert("ssl_activate_warnings", "TRUE");
03433
03434
03435
03436
03437
03438
03439
03440
03441 if (args.redirectedRequest() && parentPart())
03442 args.metaData().insert("cross-domain", toplevelURL().url());
03443
03444 if ( hasTarget )
03445 {
03446
03447 khtml::ChildFrame *frame = recursiveFrameRequest( this, cURL, args, false );
03448 if ( frame )
03449 {
03450 args.metaData()["referrer"] = d->m_referrer;
03451 requestObject( frame, cURL, args );
03452 return;
03453 }
03454 }
03455
03456 if ( !d->m_bComplete && !hasTarget )
03457 closeURL();
03458
03459 if (!d->m_referrer.isEmpty() && !args.metaData().contains("referrer"))
03460 args.metaData()["referrer"] = d->m_referrer;
03461
03462 if ( button == NoButton && (state & ShiftButton) && (state & ControlButton) )
03463 {
03464 emit d->m_extension->createNewWindow( cURL, args );
03465 return;
03466 }
03467
03468 if ( state & ShiftButton)
03469 {
03470 KParts::WindowArgs winArgs;
03471 winArgs.lowerWindow = true;
03472 KParts::ReadOnlyPart *newPart = 0;
03473 emit d->m_extension->createNewWindow( cURL, args, winArgs, newPart );
03474 return;
03475 }
03476
03477 view()->viewport()->unsetCursor();
03478 emit d->m_extension->openURLRequest( cURL, args );
03479 }
03480
03481 void KHTMLPart::slotViewDocumentSource()
03482 {
03483 KURL url(m_url);
03484 bool isTempFile = false;
03485 if (!(url.isLocalFile()) && KHTMLPageCache::self()->isComplete(d->m_cacheId))
03486 {
03487 KTempFile sourceFile(QString::null, QString::fromLatin1(".html"));
03488 if (sourceFile.status() == 0)
03489 {
03490 KHTMLPageCache::self()->saveData(d->m_cacheId, sourceFile.dataStream());
03491 url = KURL();
03492 url.setPath(sourceFile.name());
03493 isTempFile = true;
03494 }
03495 }
03496
03497 (void) KRun::runURL( url, QString::fromLatin1("text/plain"), isTempFile );
03498 }
03499
03500 void KHTMLPart::slotViewPageInfo()
03501 {
03502 KHTMLInfoDlg *dlg = new KHTMLInfoDlg(NULL, "KHTML Page Info Dialog", false, WDestructiveClose);
03503 dlg->_close->setGuiItem(KStdGuiItem::close());
03504
03505 if (d->m_doc)
03506 dlg->_title->setText(d->m_doc->title().string());
03507
03508
03509 if ( parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
03510 dlg->setCaption(i18n("Frame Information"));
03511 }
03512
03513 QString editStr = QString::null;
03514
03515 if (!d->m_pageServices.isEmpty())
03516 editStr = i18n(" <a href=\"%1\">[Properties]</a>").arg(d->m_pageServices);
03517
03518 QString squeezedURL = KStringHandler::csqueeze( url().prettyURL(), 80 );
03519 dlg->_url->setText("<a href=\"" + url().url() + "\">" + squeezedURL + "</a>" + editStr);
03520 if (lastModified().isEmpty())
03521 {
03522 dlg->_lastModified->hide();
03523 dlg->_lmLabel->hide();
03524 }
03525 else
03526 dlg->_lastModified->setText(lastModified());
03527
03528
03529 QStringList headers = QStringList::split("\n", d->m_httpHeaders);
03530
03531 for (QStringList::Iterator it = headers.begin(); it != headers.end(); ++it) {
03532 QStringList header = QStringList::split(QRegExp(":[ ]+"), *it);
03533 if (header.count() != 2)
03534 continue;
03535 new QListViewItem(dlg->_headers, header[0], header[1]);
03536 }
03537
03538 dlg->show();
03539
03540 }
03541
03542
03543 void KHTMLPart::slotViewFrameSource()
03544 {
03545 KParts::ReadOnlyPart *frame = currentFrame();
03546 if ( !frame )
03547 return;
03548
03549 KURL url = frame->url();
03550 bool isTempFile = false;
03551 if (!(url.isLocalFile()) && frame->inherits("KHTMLPart"))
03552 {
03553 long cacheId = static_cast<KHTMLPart *>(frame)->d->m_cacheId;
03554
03555 if (KHTMLPageCache::self()->isComplete(cacheId))
03556 {
03557 KTempFile sourceFile(QString::null, QString::fromLatin1(".html"));
03558 if (sourceFile.status() == 0)
03559 {
03560 KHTMLPageCache::self()->saveData(cacheId, sourceFile.dataStream());
03561 url = KURL();
03562 url.setPath(sourceFile.name());
03563 isTempFile = true;
03564 }
03565 }
03566 }
03567
03568 (void) KRun::runURL( url, QString::fromLatin1("text/plain"), isTempFile );
03569 }
03570
03571 KURL KHTMLPart::backgroundURL() const
03572 {
03573
03574 if (!d->m_doc || !d->m_doc->isHTMLDocument())
03575 return KURL();
03576
03577 QString relURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
03578
03579 return KURL( m_url, relURL );
03580 }
03581
03582 void KHTMLPart::slotSaveBackground()
03583 {
03584 KIO::MetaData metaData;
03585 metaData["referrer"] = d->m_referrer;
03586 KHTMLPopupGUIClient::saveURL( d->m_view, i18n("Save Background Image As"), backgroundURL(), metaData );
03587 }
03588
03589 void KHTMLPart::slotSaveDocument()
03590 {
03591 KURL srcURL( m_url );
03592
03593 if ( srcURL.fileName(false).isEmpty() )
03594 srcURL.setFileName( "index.html" );
03595
03596 KIO::MetaData metaData;
03597
03598 KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, "text/html", d->m_cacheId );
03599 }
03600
03601 void KHTMLPart::slotSecurity()
03602 {
03603
03604
03605
03606
03607
03608
03609
03610
03611
03612
03613
03614
03615
03616
03617
03618
03619
03620
03621 KSSLInfoDlg *kid = new KSSLInfoDlg(d->m_ssl_in_use, widget(), "kssl_info_dlg", true );
03622
03623 if (d->m_bSecurityInQuestion)
03624 kid->setSecurityInQuestion(true);
03625
03626 if (d->m_ssl_in_use) {
03627 KSSLCertificate *x = KSSLCertificate::fromString(d->m_ssl_peer_certificate.local8Bit());
03628 if (x) {
03629
03630 QStringList cl = QStringList::split(QString("\n"), d->m_ssl_peer_chain);
03631 QPtrList<KSSLCertificate> ncl;
03632
03633 ncl.setAutoDelete(true);
03634 for (QStringList::Iterator it = cl.begin(); it != cl.end(); ++it) {
03635 KSSLCertificate *y = KSSLCertificate::fromString((*it).local8Bit());
03636 if (y) ncl.append(y);
03637 }
03638
03639 if (ncl.count() > 0)
03640 x->chain().setChain(ncl);
03641
03642 kid->setup(x,
03643 d->m_ssl_peer_ip,
03644 m_url.url(),
03645 d->m_ssl_cipher,
03646 d->m_ssl_cipher_desc,
03647 d->m_ssl_cipher_version,
03648 d->m_ssl_cipher_used_bits.toInt(),
03649 d->m_ssl_cipher_bits.toInt(),
03650 (KSSLCertificate::KSSLValidation) d->m_ssl_cert_state.toInt()
03651 );
03652 kid->exec();
03653 delete x;
03654 } else kid->exec();
03655 } else kid->exec();
03656 }
03657
03658 void KHTMLPart::slotSaveFrame()
03659 {
03660 if ( !d->m_activeFrame )
03661 return;
03662
03663 KURL srcURL( static_cast<KParts::ReadOnlyPart *>( d->m_activeFrame )->url() );
03664
03665 if ( srcURL.fileName(false).isEmpty() )
03666 srcURL.setFileName( "index.html" );
03667
03668 KIO::MetaData metaData;
03669
03670 KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, "text/html" );
03671 }
03672
03673 void KHTMLPart::slotSetEncoding()
03674 {
03675 d->m_automaticDetection->setItemChecked( int( d->m_autoDetectLanguage ), false );
03676 d->m_paSetEncoding->popupMenu()->setItemChecked( 0, false );
03677 d->m_paSetEncoding->popupMenu()->setItemChecked( d->m_paSetEncoding->popupMenu()->idAt( 2 ), true );
03678
03679 QString enc = KGlobal::charsets()->encodingForName( d->m_manualDetection->currentText() );
03680 setEncoding( enc, true );
03681 }
03682
03683 void KHTMLPart::slotUseStylesheet()
03684 {
03685 if (d->m_doc)
03686 {
03687 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
03688 d->m_sheetUsed = autoselect ? QString() : d->m_paUseStylesheet->currentText();
03689 d->m_doc->updateStyleSelector();
03690 }
03691 }
03692
03693 void KHTMLPart::updateActions()
03694 {
03695 bool frames = false;
03696
03697 QValueList<khtml::ChildFrame>::ConstIterator it = d->m_frames.begin();
03698 QValueList<khtml::ChildFrame>::ConstIterator end = d->m_frames.end();
03699 for (; it != end; ++it )
03700 if ( (*it).m_type == khtml::ChildFrame::Frame )
03701 {
03702 frames = true;
03703 break;
03704 }
03705
03706 d->m_paViewFrame->setEnabled( frames );
03707 d->m_paSaveFrame->setEnabled( frames );
03708
03709 if ( frames )
03710 d->m_paFind->setText( i18n( "&Find in Frame..." ) );
03711 else
03712 d->m_paFind->setText( i18n( "&Find..." ) );
03713
03714 KParts::Part *frame = 0;
03715
03716 if ( frames )
03717 frame = currentFrame();
03718
03719 bool enableFindAndSelectAll = true;
03720
03721 if ( frame )
03722 enableFindAndSelectAll = frame->inherits( "KHTMLPart" );
03723
03724 d->m_paFind->setEnabled( enableFindAndSelectAll );
03725 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
03726
03727 bool enablePrintFrame = false;
03728
03729 if ( frame )
03730 {
03731 QObject *ext = KParts::BrowserExtension::childObject( frame );
03732 if ( ext )
03733 enablePrintFrame = ext->metaObject()->slotNames().contains( "print()" );
03734 }
03735
03736 d->m_paPrintFrame->setEnabled( enablePrintFrame );
03737
03738 QString bgURL;
03739
03740
03741 if ( d->m_doc && d->m_doc->isHTMLDocument() && static_cast<HTMLDocumentImpl*>(d->m_doc)->body() && !d->m_bClearing )
03742 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
03743
03744 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
03745
03746 if ( d->m_paDebugScript )
03747 d->m_paDebugScript->setEnabled( d->m_jscript );
03748 }
03749
03750 KParts::LiveConnectExtension *KHTMLPart::liveConnectExtension( const khtml::RenderPart *frame) const {
03751 QValueList<khtml::ChildFrame>::ConstIterator it = d->m_objects.begin();
03752 QValueList<khtml::ChildFrame>::ConstIterator end = d->m_objects.end();
03753 for(; it != end; ++it )
03754 if ((*it).m_frame == frame)
03755 return (*it).m_liveconnect;
03756 return 0L;
03757 }
03758
03759 bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
03760 const QStringList ¶ms, bool isIFrame )
03761 {
03762
03763 FrameIt it = d->m_frames.find( frameName );
03764 if ( it == d->m_frames.end() )
03765 {
03766 khtml::ChildFrame child;
03767
03768 child.m_name = frameName;
03769 it = d->m_frames.append( child );
03770 }
03771
03772 (*it).m_type = isIFrame ? khtml::ChildFrame::IFrame : khtml::ChildFrame::Frame;
03773 (*it).m_frame = frame;
03774 (*it).m_params = params;
03775
03776
03777 if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
03778 {
03779 QVariant res = executeScript( DOM::Node(frame->element()), KURL::decode_string( url.right( url.length() - 11) ) );
03780 KURL myurl;
03781 myurl.setProtocol("javascript");
03782 if ( res.type() == QVariant::String )
03783 myurl.setPath(res.asString());
03784 return processObjectRequest(&(*it), myurl, QString("text/html") );
03785 }
03786 KURL u = url.isEmpty() ? KURL() : completeURL( url );
03787 return requestObject( &(*it), u );
03788 }
03789
03790 QString KHTMLPart::requestFrameName()
03791 {
03792 return QString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
03793 }
03794
03795 bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
03796 const QStringList ¶ms )
03797 {
03798 kdDebug( 6005 ) << "KHTMLPart::requestObject " << this << " frame=" << frame << endl;
03799 khtml::ChildFrame child;
03800 QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child );
03801 (*it).m_frame = frame;
03802 (*it).m_type = khtml::ChildFrame::Object;
03803 (*it).m_params = params;
03804
03805 KParts::URLArgs args;
03806 args.serviceType = serviceType;
03807 if (!requestObject( &(*it), completeURL( url ), args ) && !(*it).m_run) {
03808 (*it).m_bCompleted = true;
03809 return false;
03810 }
03811 return true;
03812 }
03813
03814 bool KHTMLPart::requestObject( khtml::ChildFrame *child, const KURL &url, const KParts::URLArgs &_args )
03815 {
03816 if (!checkLinkSecurity(url))
03817 {
03818 kdDebug(6005) << this << " KHTMLPart::requestObject checkLinkSecurity refused" << endl;
03819 return false;
03820 }
03821 if ( child->m_bPreloaded )
03822 {
03823 kdDebug(6005) << "KHTMLPart::requestObject preload" << endl;
03824 if ( child->m_frame && child->m_part )
03825 child->m_frame->setWidget( child->m_part->widget() );
03826
03827 child->m_bPreloaded = false;
03828 return true;
03829 }
03830
03831 KParts::URLArgs args( _args );
03832
03833 if ( child->m_run )
03834 child->m_run->abort();
03835
03836 if ( child->m_part && !args.reload && urlcmp( child->m_part->url().url(), url.url(), true, true ) )
03837 args.serviceType = child->m_serviceType;
03838
03839 child->m_args = args;
03840 child->m_args.reload = (d->m_cachePolicy == KIO::CC_Reload);
03841 child->m_serviceName = QString::null;
03842 if (!d->m_referrer.isEmpty() && !child->m_args.metaData().contains( "referrer" ))
03843 child->m_args.metaData()["referrer"] = d->m_referrer;
03844
03845 child->m_args.metaData().insert("PropagateHttpHeader", "true");
03846 child->m_args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
03847 child->m_args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
03848 child->m_args.metaData().insert("main_frame_request",
03849 parentPart() == 0 ? "TRUE":"FALSE");
03850 child->m_args.metaData().insert("ssl_was_in_use",
03851 d->m_ssl_in_use ? "TRUE":"FALSE");
03852 child->m_args.metaData().insert("ssl_activate_warnings", "TRUE");
03853 child->m_args.metaData().insert("cross-domain", toplevelURL().url());
03854
03855
03856 if ((url.isEmpty() || url.url() == "about:blank") && args.serviceType.isEmpty())
03857 args.serviceType = QString::fromLatin1( "text/html" );
03858
03859 if ( args.serviceType.isEmpty() ) {
03860 kdDebug(6050) << "Running new KHTMLRun for " << this << " and child=" << child << endl;
03861 child->m_run = new KHTMLRun( this, child, url, child->m_args, true );
03862 d->m_bComplete = false;
03863 return false;
03864 } else {
03865 return processObjectRequest( child, url, args.serviceType );
03866 }
03867 }
03868
03869 bool KHTMLPart::processObjectRequest( khtml::ChildFrame *child, const KURL &_url, const QString &mimetype )
03870 {
03871
03872
03873
03874
03875
03876 KURL url( _url );
03877
03878
03879 if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) )
03880 {
03881 child->m_bCompleted = true;
03882 checkCompleted();
03883 return true;
03884 }
03885
03886 if (child->m_bNotify)
03887 {
03888 child->m_bNotify = false;
03889 if ( !child->m_args.lockHistory() )
03890 emit d->m_extension->openURLNotify();
03891 }
03892
03893 if ( child->m_serviceType != mimetype )
03894 {
03895
03896
03897
03898 if ( child->m_type != khtml::ChildFrame::Object )
03899 {
03900 QString suggestedFilename;
03901 if ( child->m_run )
03902 suggestedFilename = child->m_run->suggestedFilename();
03903
03904 KParts::BrowserRun::AskSaveResult res = KParts::BrowserRun::askEmbedOrSave(
03905 url, mimetype, suggestedFilename );
03906 switch( res ) {
03907 case KParts::BrowserRun::Save:
03908 KHTMLPopupGUIClient::saveURL( widget(), i18n( "Save As" ), url, child->m_args.metaData(), QString::null, 0, suggestedFilename);
03909
03910 case KParts::BrowserRun::Cancel:
03911 child->m_bCompleted = true;
03912 checkCompleted();
03913 return true;
03914 default:
03915 break;
03916 }
03917 }
03918
03919 QStringList dummy;
03920 KParts::ReadOnlyPart *part = createPart( d->m_view->viewport(), child->m_name.ascii(), this, child->m_name.ascii(), mimetype, child->m_serviceName, dummy, child->m_params );
03921
03922 if ( !part )
03923 {
03924 if ( child->m_frame )
03925 if (child->m_frame->partLoadingErrorNotify( child, url, mimetype ))
03926 return true;
03927
03928 checkEmitLoadEvent();
03929 return false;
03930 } else if (child->m_frame) {
03931 child->m_liveconnect = KParts::LiveConnectExtension::childObject(part);
03932 DOM::NodeImpl* elm = child->m_frame->element();
03933 if (elm)
03934 switch (child->m_frame->element()->id()) {
03935 case ID_APPLET:
03936 case ID_EMBED:
03937 case ID_OBJECT:
03938 static_cast<HTMLObjectBaseElementImpl*>(elm)->setLiveConnect(child->m_liveconnect);
03939 default:
03940 break;
03941 }
03942 }
03943
03944
03945 if ( child->m_part )
03946 {
03947 partManager()->removePart( (KParts::ReadOnlyPart *)child->m_part );
03948 delete (KParts::ReadOnlyPart *)child->m_part;
03949 }
03950
03951 child->m_serviceType = mimetype;
03952 if ( child->m_frame )
03953 child->m_frame->setWidget( part->widget() );
03954
03955 if ( child->m_type != khtml::ChildFrame::Object )
03956 partManager()->addPart( part, false );
03957
03958
03959
03960 child->m_part = part;
03961 assert( ((void*) child->m_part) != 0);
03962
03963 connect( part, SIGNAL( started( KIO::Job *) ),
03964 this, SLOT( slotChildStarted( KIO::Job *) ) );
03965 connect( part, SIGNAL( completed() ),
03966 this, SLOT( slotChildCompleted() ) );
03967 if ( child->m_type != khtml::ChildFrame::Object )
03968 {
03969 connect( part, SIGNAL( completed(bool) ),
03970 this, SLOT( slotChildCompleted(bool) ) );
03971 connect( part, SIGNAL( setStatusBarText( const QString & ) ),
03972 this, SIGNAL( setStatusBarText( const QString & ) ) );
03973 if ( part->inherits( "KHTMLPart" ) )
03974 {
03975 connect( this, SIGNAL( completed() ),
03976 part, SLOT( slotParentCompleted() ) );
03977 connect( this, SIGNAL( completed(bool) ),
03978 part, SLOT( slotParentCompleted() ) );
03979
03980
03981 connect( part, SIGNAL( docCreated() ),
03982 this, SLOT( slotChildDocCreated() ) );
03983 }
03984 }
03985
03986 child->m_extension = KParts::BrowserExtension::childObject( part );
03987
03988 if ( child->m_extension )
03989 {
03990 connect( child->m_extension, SIGNAL( openURLNotify() ),
03991 d->m_extension, SIGNAL( openURLNotify() ) );
03992
03993 connect( child->m_extension, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ),
03994 this, SLOT( slotChildURLRequest( const KURL &, const KParts::URLArgs & ) ) );
03995
03996 connect( child->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ),
03997 d->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ) );
03998 connect( child->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs &, const KParts::WindowArgs &, KParts::ReadOnlyPart *& ) ),
03999 d->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & , const KParts::WindowArgs &, KParts::ReadOnlyPart *&) ) );
04000
04001 connect( child->m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ),
04002 d->m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ) );
04003 connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ),
04004 d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ) );
04005 connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags ) ),
04006 d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags ) ) );
04007 connect( child->m_extension, SIGNAL( popupMenu( const QPoint &, const KURL &, const QString &, mode_t ) ),
04008 d->m_extension, SIGNAL( popupMenu( const QPoint &, const KURL &, const QString &, mode_t ) ) );
04009 connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ),
04010 d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ) );
04011 connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t ) ),
04012 d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t ) ) );
04013
04014 connect( child->m_extension, SIGNAL( infoMessage( const QString & ) ),
04015 d->m_extension, SIGNAL( infoMessage( const QString & ) ) );
04016
04017 child->m_extension->setBrowserInterface( d->m_extension->browserInterface() );
04018 }
04019 }
04020 else if ( child->m_frame && child->m_part &&
04021 child->m_frame->widget() != child->m_part->widget() )
04022 child->m_frame->setWidget( child->m_part->widget() );
04023
04024 checkEmitLoadEvent();
04025
04026
04027 if ( !child->m_part )
04028 return false;
04029
04030 if ( child->m_bPreloaded )
04031 {
04032 if ( child->m_frame && child->m_part )
04033 child->m_frame->setWidget( child->m_part->widget() );
04034
04035 child->m_bPreloaded = false;
04036 return true;
04037 }
04038
04039 child->m_args.reload = (d->m_cachePolicy == KIO::CC_Reload);
04040
04041
04042
04043
04044
04045 child->m_args.serviceType = mimetype;
04046
04047
04048 child->m_bCompleted = child->m_type == khtml::ChildFrame::Object;
04049
04050 if ( child->m_extension )
04051 child->m_extension->setURLArgs( child->m_args );
04052
04053 if(url.protocol() == "javascript" || url.url() == "about:blank") {
04054 if (!child->m_part->inherits("KHTMLPart"))
04055 return false;
04056
04057 KHTMLPart* p = static_cast<KHTMLPart*>(static_cast<KParts::ReadOnlyPart *>(child->m_part));
04058
04059 p->begin();
04060 if (d->m_doc && p->d->m_doc)
04061 p->d->m_doc->setBaseURL(d->m_doc->baseURL());
04062 if (!url.url().startsWith("about:")) {
04063 p->write(url.path());
04064 } else {
04065 p->m_url = url;
04066
04067 p->write("<HTML><TITLE></TITLE><BODY></BODY></HTML>");
04068 }
04069 p->end();
04070 return true;
04071 }
04072 else if ( !url.isEmpty() )
04073 {
04074
04075 bool b = child->m_part->openURL( url );
04076 if (child->m_bCompleted)
04077 checkCompleted();
04078 return b;
04079 }
04080 else
04081 {
04082 child->m_bCompleted = true;
04083 checkCompleted();
04084 return true;
04085 }
04086 }
04087
04088 KParts::ReadOnlyPart *KHTMLPart::createPart( QWidget *parentWidget, const char *widgetName,
04089 QObject *parent, const char *name, const QString &mimetype,
04090 QString &serviceName, QStringList &serviceTypes,
04091 const QStringList ¶ms )
04092 {
04093 QString constr;
04094 if ( !serviceName.isEmpty() )
04095 constr.append( QString::fromLatin1( "Name == '%1'" ).arg( serviceName ) );
04096
04097 KTrader::OfferList offers = KTrader::self()->query( mimetype, "KParts/ReadOnlyPart", constr, QString::null );
04098
04099 if ( offers.isEmpty() )
04100 return 0L;
04101
04102 KTrader::OfferList::Iterator it = offers.begin();
04103 for ( ; it != offers.end() ; ++it )
04104 {
04105 KService::Ptr service = (*it);
04106
04107 KLibFactory *factory = KLibLoader::self()->factory( QFile::encodeName(service->library()) );
04108 if ( factory ) {
04109 KParts::ReadOnlyPart *res = 0L;
04110
04111 const char *className = "KParts::ReadOnlyPart";
04112 if ( service->serviceTypes().contains( "Browser/View" ) )
04113 className = "Browser/View";
04114
04115 if ( factory->inherits( "KParts::Factory" ) )
04116 res = static_cast<KParts::ReadOnlyPart *>(static_cast<KParts::Factory *>( factory )->createPart( parentWidget, widgetName, parent, name, className, params ));
04117 else
04118 res = static_cast<KParts::ReadOnlyPart *>(factory->create( parentWidget, widgetName, className ));
04119
04120 if ( res ) {
04121 serviceTypes = service->serviceTypes();
04122 serviceName = service->name();
04123 return res;
04124 }
04125 } else {
04126
04127 kdWarning() << QString("There was an error loading the module %1.\nThe diagnostics is:\n%2")
04128 .arg(service->name()).arg(KLibLoader::self()->lastErrorMessage()) << endl;
04129 }
04130 }
04131 return 0;
04132 }
04133
04134 KParts::PartManager *KHTMLPart::partManager()
04135 {
04136 if ( !d->m_manager )
04137 {
04138 d->m_manager = new KParts::PartManager( d->m_view->topLevelWidget(), this, "khtml part manager" );
04139 d->m_manager->setAllowNestedParts( true );
04140 connect( d->m_manager, SIGNAL( activePartChanged( KParts::Part * ) ),
04141 this, SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
04142 connect( d->m_manager, SIGNAL( partRemoved( KParts::Part * ) ),
04143 this, SLOT( slotPartRemoved( KParts::Part * ) ) );
04144 }
04145
04146 return d->m_manager;
04147 }
04148
04149 void KHTMLPart::submitFormAgain()
04150 {
04151 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
04152 KHTMLPart::submitForm( d->m_submitForm->submitAction, d->m_submitForm->submitUrl, d->m_submitForm->submitFormData, d->m_submitForm->target, d->m_submitForm->submitContentType, d->m_submitForm->submitBoundary );
04153
04154 delete d->m_submitForm;
04155 d->m_submitForm = 0;
04156 disconnect(this, SIGNAL(completed()), this, SLOT(submitFormAgain()));
04157 }
04158
04159 void KHTMLPart::submitFormProxy( const char *action, const QString &url, const QByteArray &formData, const QString &_target, const QString& contentType, const QString& boundary )
04160 {
04161 submitForm(action, url, formData, _target, contentType, boundary);
04162 }
04163
04164 void KHTMLPart::submitForm( const char *action, const QString &url, const QByteArray &formData, const QString &_target, const QString& contentType, const QString& boundary )
04165 {
04166 kdDebug(6000) << this << ": KHTMLPart::submitForm target=" << _target << " url=" << url << endl;
04167 if (d->m_formNotification == KHTMLPart::Only) {
04168 emit formSubmitNotification(action, url, formData, _target, contentType, boundary);
04169 return;
04170 } else if (d->m_formNotification == KHTMLPart::Before) {
04171 emit formSubmitNotification(action, url, formData, _target, contentType, boundary);
04172 }
04173
04174 KURL u = completeURL( url );
04175
04176 if ( !u.isValid() )
04177 {
04178
04179 return;
04180 }
04181
04182
04183
04184
04185
04186
04187
04188
04189
04190
04191
04192
04193
04194 if (!d->m_submitForm) {
04195 if (u.protocol() != "https" && u.protocol() != "mailto") {
04196 if (d->m_ssl_in_use) {
04197 int rc = KMessageBox::warningContinueCancel(NULL, i18n("Warning: This is a secure form but it is attempting to send your data back unencrypted."
04198 "\nA third party may be able to intercept and view this information."
04199 "\nAre you sure you wish to continue?"),
04200 i18n("Network Transmission"),KGuiItem(i18n("&Send Unencrypted")));
04201 if (rc == KMessageBox::Cancel)
04202 return;
04203 } else {
04204 KSSLSettings kss(true);
04205 if (kss.warnOnUnencrypted()) {
04206 int rc = KMessageBox::warningContinueCancel(NULL,
04207 i18n("Warning: Your data is about to be transmitted across the network unencrypted."
04208 "\nAre you sure you wish to continue?"),
04209 i18n("Network Transmission"),
04210 KGuiItem(i18n("&Send Unencrypted")),
04211 "WarnOnUnencryptedForm");
04212
04213 KConfig *config = kapp->config();
04214 QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
04215 KConfigGroupSaver saver( config, grpNotifMsgs );
04216
04217 if (!config->readBoolEntry("WarnOnUnencryptedForm", true)) {
04218 config->deleteEntry("WarnOnUnencryptedForm");
04219 config->sync();
04220 kss.setWarnOnUnencrypted(false);
04221 kss.save();
04222 }
04223 if (rc == KMessageBox::Cancel)
04224 return;
04225 }
04226 }
04227 }
04228
04229 if (u.protocol() == "mailto") {
04230 int rc = KMessageBox::warningContinueCancel(NULL,
04231 i18n("This site is attempting to submit form data via email.\n"
04232 "Do you want to continue?"),
04233 i18n("Network Transmission"),
04234 KGuiItem(i18n("&Send Email")),
04235 "WarnTriedEmailSubmit");
04236
04237 if (rc == KMessageBox::Cancel) {
04238 return;
04239 }
04240 }
04241 }
04242
04243
04244
04245
04246 QString urlstring = u.url();
04247
04248 if ( urlstring.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
04249 urlstring = KURL::decode_string(urlstring);
04250 crossFrameExecuteScript( _target, urlstring.right( urlstring.length() - 11) );
04251 return;
04252 }
04253
04254 if (!checkLinkSecurity(u,
04255 i18n( "<qt>The form will be submitted to <BR><B>%1</B><BR>on your local filesystem.<BR>Do you want to submit the form?" ),
04256 i18n( "Submit" )))
04257 return;
04258
04259 KParts::URLArgs args;
04260
04261 if (!d->m_referrer.isEmpty())
04262 args.metaData()["referrer"] = d->m_referrer;
04263
04264 args.metaData().insert("PropagateHttpHeader", "true");
04265 args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
04266 args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
04267 args.metaData().insert("main_frame_request",
04268 parentPart() == 0 ? "TRUE":"FALSE");
04269 args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
04270 args.metaData().insert("ssl_activate_warnings", "TRUE");
04271
04272
04273
04274 args.frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
04275
04276
04277 if (u.protocol() == "mailto") {
04278
04279 QString q = u.query().mid(1);
04280 QStringList nvps = QStringList::split("&", q);
04281 bool triedToAttach = false;
04282
04283 for (QStringList::Iterator nvp = nvps.begin(); nvp != nvps.end(); ++nvp) {
04284 QStringList pair = QStringList::split("=", *nvp);
04285 if (pair.count() >= 2) {
04286 if (pair.first().lower() == "attach") {
04287 nvp = nvps.remove(nvp);
04288 triedToAttach = true;
04289 }
04290 }
04291 }
04292
04293 if (triedToAttach)
04294 KMessageBox::information(NULL, i18n("This site attempted to attach a file from your computer in the form submission. The attachment was removed for your protection."), i18n("KDE"), "WarnTriedAttach");
04295
04296
04297 QString bodyEnc;
04298 if (contentType.lower() == "multipart/form-data") {
04299
04300 bodyEnc = KURL::encode_string(QString::fromLatin1(formData.data(),
04301 formData.size()));
04302 } else if (contentType.lower() == "text/plain") {
04303
04304 QString tmpbody = QString::fromLatin1(formData.data(),
04305 formData.size());
04306 tmpbody.replace(QRegExp("[&]"), "\n");
04307 tmpbody.replace(QRegExp("[+]"), " ");
04308 tmpbody = KURL::decode_string(tmpbody);
04309 bodyEnc = KURL::encode_string(tmpbody);
04310 } else {
04311 bodyEnc = KURL::encode_string(QString::fromLatin1(formData.data(),
04312 formData.size()));
04313 }
04314
04315 nvps.append(QString("body=%1").arg(bodyEnc));
04316 q = nvps.join("&");
04317 u.setQuery(q);
04318 }
04319
04320 if ( strcmp( action, "get" ) == 0 ) {
04321 if (u.protocol() != "mailto")
04322 u.setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
04323 args.setDoPost( false );
04324 }
04325 else {
04326 args.postData = formData;
04327 args.setDoPost( true );
04328
04329
04330 if (contentType.isNull() || contentType == "application/x-www-form-urlencoded")
04331 args.setContentType( "Content-Type: application/x-www-form-urlencoded" );
04332 else
04333 args.setContentType( "Content-Type: " + contentType + "; boundary=" + boundary );
04334 }
04335
04336 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
04337 if( d->m_submitForm ) {
04338 kdDebug(6000) << "KHTMLPart::submitForm ABORTING!" << endl;
04339 return;
04340 }
04341 d->m_submitForm = new KHTMLPartPrivate::SubmitForm;
04342 d->m_submitForm->submitAction = action;
04343 d->m_submitForm->submitUrl = url;
04344 d->m_submitForm->submitFormData = formData;
04345 d->m_submitForm->target = _target;
04346 d->m_submitForm->submitContentType = contentType;
04347 d->m_submitForm->submitBoundary = boundary;
04348 connect(this, SIGNAL(completed()), this, SLOT(submitFormAgain()));
04349 }
04350 else
04351 {
04352 emit d->m_extension->openURLRequest( u, args );
04353 }
04354 }
04355
04356 void KHTMLPart::popupMenu( const QString &linkUrl )
04357 {
04358 KURL popupURL;
04359 KURL linkKURL;
04360 QString referrer;
04361 KParts::BrowserExtension::PopupFlags itemflags=KParts::BrowserExtension::ShowBookmark | KParts::BrowserExtension::ShowReload;
04362
04363 if ( linkUrl.isEmpty() ) {
04364 KHTMLPart* khtmlPart = this;
04365 while ( khtmlPart->parentPart() )
04366 {
04367 khtmlPart=khtmlPart->parentPart();
04368 }
04369 popupURL = khtmlPart->url();
04370 referrer = khtmlPart->pageReferrer();
04371 if (hasSelection())
04372 itemflags = KParts::BrowserExtension::ShowTextSelectionItems;
04373 else
04374 itemflags |= KParts::BrowserExtension::ShowNavigationItems;
04375 } else {
04376 popupURL = completeURL( linkUrl );
04377 linkKURL = popupURL;
04378 referrer = this->referrer();
04379 }
04380
04381
04382
04383 KHTMLPopupGUIClient* client = new KHTMLPopupGUIClient( this, d->m_popupMenuXML, linkKURL );
04384 QGuardedPtr<QObject> guard( client );
04385
04386 KParts::URLArgs args;
04387 args.serviceType = QString::fromLatin1( "text/html" );
04388 args.metaData()["referrer"] = referrer;
04389
04390 emit d->m_extension->popupMenu( client, QCursor::pos(), popupURL, args, itemflags, S_IFREG );
04391
04392 if ( !guard.isNull() ) {
04393 delete client;
04394 emit popupMenu(linkUrl, QCursor::pos());
04395 d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
04396 }
04397 }
04398
04399 void KHTMLPart::slotParentCompleted()
04400 {
04401 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
04402 {
04403
04404 d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
04405 }
04406 }
04407
04408 void KHTMLPart::slotChildStarted( KIO::Job *job )
04409 {
04410 khtml::ChildFrame *child = frame( sender() );
04411
04412 assert( child );
04413
04414 child->m_bCompleted = false;
04415
04416 if ( d->m_bComplete )
04417 {
04418 #if 0
04419
04420 if ( !parentPart() )
04421 {
04422 emit d->m_extension->openURLNotify();
04423 }
04424 #endif
04425 d->m_bComplete = false;
04426 emit started( job );
04427 }
04428 }
04429
04430 void KHTMLPart::slotChildCompleted()
04431 {
04432 slotChildCompleted( false );
04433 }
04434
04435 void KHTMLPart::slotChildCompleted( bool pendingAction )
04436 {
04437 khtml::ChildFrame *child = frame( sender() );
04438
04439 if ( child ) {
04440 kdDebug(6050) << this << " slotChildCompleted child=" << child << " m_frame=" << child->m_frame << endl;
04441 child->m_bCompleted = true;
04442 child->m_bPendingRedirection = pendingAction;
04443 child->m_args = KParts::URLArgs();
04444 }
04445 checkCompleted();
04446 }
04447
04448 void KHTMLPart::slotChildDocCreated()
04449 {
04450 const KHTMLPart* htmlFrame = static_cast<const KHTMLPart *>(sender());
04451
04452
04453
04454 if ( d->m_doc && d->m_doc->isHTMLDocument() )
04455 {
04456 if ( sender()->inherits("KHTMLPart") )
04457 {
04458 DOMString domain = static_cast<HTMLDocumentImpl*>(d->m_doc)->domain();
04459 if (htmlFrame->d->m_doc && htmlFrame->d->m_doc->isHTMLDocument() )
04460
04461 static_cast<HTMLDocumentImpl*>(htmlFrame->d->m_doc)->setDomain( domain );
04462 }
04463 }
04464
04465 disconnect( htmlFrame, SIGNAL( docCreated() ), this, SLOT( slotChildDocCreated() ) );
04466 }
04467
04468 void KHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
04469 {
04470 khtml::ChildFrame *child = frame( sender()->parent() );
04471 KHTMLPart *callingHtmlPart = const_cast<KHTMLPart *>(dynamic_cast<const KHTMLPart *>(sender()->parent()));
04472
04473
04474 QString urlStr = url.url();
04475 if ( urlStr.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
04476 QString script = KURL::decode_string( urlStr.right( urlStr.length() - 11 ) );
04477 executeScript( DOM::Node(), script );
04478 return;
04479 }
04480
04481 QString frameName = args.frameName.lower();
04482 if ( !frameName.isEmpty() ) {
04483 if ( frameName == QString::fromLatin1( "_top" ) )
04484 {
04485 emit d->m_extension->openURLRequest( url, args );
04486 return;
04487 }
04488 else if ( frameName == QString::fromLatin1( "_blank" ) )
04489 {
04490 emit d->m_extension->createNewWindow( url, args );
04491 return;
04492 }
04493 else if ( frameName == QString::fromLatin1( "_parent" ) )
04494 {
04495 KParts::URLArgs newArgs( args );
04496 newArgs.frameName = QString::null;
04497
04498 emit d->m_extension->openURLRequest( url, newArgs );
04499 return;
04500 }
04501 else if ( frameName != QString::fromLatin1( "_self" ) )
04502 {
04503 khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args );
04504
04505 if ( !_frame )
04506 {
04507 emit d->m_extension->openURLRequest( url, args );
04508 return;
04509 }
04510
04511 child = _frame;
04512 }
04513 }
04514
04515 if ( child && child->m_type != khtml::ChildFrame::Object ) {
04516
04517 child->m_bNotify = true;
04518 requestObject( child, url, args );
04519 } else if ( frameName== "_self" )
04520 {
04521 KParts::URLArgs newArgs( args );
04522 newArgs.frameName = QString::null;
04523 emit d->m_extension->openURLRequest( url, newArgs );
04524 }
04525 }
04526
04527 khtml::ChildFrame *KHTMLPart::frame( const QObject *obj )
04528 {
04529 assert( obj->inherits( "KParts::ReadOnlyPart" ) );
04530 const KParts::ReadOnlyPart *part = static_cast<const KParts::ReadOnlyPart *>( obj );
04531
04532 FrameIt it = d->m_frames.begin();
04533 FrameIt end = d->m_frames.end();
04534 for (; it != end; ++it )
04535 if ( (KParts::ReadOnlyPart *)(*it).m_part == part )
04536 return &(*it);
04537
04538 for (it = d->m_objects.begin(); it != d->m_objects.end(); ++it )
04539 if ( (KParts::ReadOnlyPart *)(*it).m_part == part )
04540 return &(*it);
04541
04542 return 0L;
04543 }
04544
04545
04546
04547 bool KHTMLPart::checkFrameAccess(KHTMLPart *callingHtmlPart)
04548 {
04549 if (callingHtmlPart == this)
04550 return true;
04551
04552 if (htmlDocument().isNull()) {
04553 #ifdef DEBUG_FINDFRAME
04554 kdDebug(6050) << "KHTMLPart::checkFrameAccess: Empty part " << this << " URL = " << m_url << endl;
04555 #endif
04556 return false;
04557 }
04558
04559
04560 if (callingHtmlPart && !callingHtmlPart->htmlDocument().isNull() &&
04561 !htmlDocument().isNull()) {
04562 DOM::DOMString actDomain = callingHtmlPart->htmlDocument().domain();
04563 DOM::DOMString destDomain = htmlDocument().domain();
04564
04565 #ifdef DEBUG_FINDFRAME
04566 kdDebug(6050) << "KHTMLPart::checkFrameAccess: actDomain = '" << actDomain.string() << "' destDomain = '" << destDomain.string() << "'" << endl;
04567 #endif
04568
04569 if (actDomain == destDomain)
04570 return true;
04571 }
04572 #ifdef DEBUG_FINDFRAME
04573 else
04574 {
04575 kdDebug(6050) << "KHTMLPart::checkFrameAccess: Unknown part/domain " << callingHtmlPart << " tries to access part " << this << endl;
04576 }
04577 #endif
04578 return false;
04579 }
04580
04581 KHTMLPart *
04582 KHTMLPart::findFrameParent( KParts::ReadOnlyPart *callingPart, const QString &f, khtml::ChildFrame **childFrame )
04583 {
04584 #ifdef DEBUG_FINDFRAME
04585 kdDebug(6050) << "KHTMLPart::findFrameParent: this = " << this << " URL = " << m_url << " findFrameParent( " << f << " )" << endl;
04586 #endif
04587
04588 KHTMLPart *callingHtmlPart = dynamic_cast<KHTMLPart *>(callingPart);
04589
04590 if (!checkFrameAccess(callingHtmlPart))
04591 return 0;
04592
04593 FrameIt it = d->m_frames.find( f );
04594 FrameIt end = d->m_frames.end();
04595 if ( it != end )
04596 {
04597 #ifdef DEBUG_FINDFRAME
04598 kdDebug(6050) << "KHTMLPart::findFrameParent: FOUND!" << endl;
04599 #endif
04600 if (childFrame)
04601 *childFrame = &(*it);
04602 return this;
04603 }
04604
04605 it = d->m_frames.begin();
04606 for (; it != end; ++it )
04607 {
04608 KParts::ReadOnlyPart *p = (*it).m_part;
04609 if ( p && p->inherits( "KHTMLPart" ))
04610 {
04611 KHTMLPart *frameParent = static_cast<KHTMLPart*>(p)->findFrameParent(callingPart, f, childFrame);
04612 if (frameParent)
04613 return frameParent;
04614 }
04615 }
04616 return 0;
04617 }
04618
04619
04620 KHTMLPart *KHTMLPart::findFrame( const QString &f )
04621 {
04622 khtml::ChildFrame *childFrame;
04623 KHTMLPart *parentFrame = findFrameParent(this, f, &childFrame);
04624 if (parentFrame)
04625 {
04626 KParts::ReadOnlyPart *p = childFrame->m_part;
04627 if ( p && p->inherits( "KHTMLPart" ))
04628 return static_cast<KHTMLPart *>(p);
04629 }
04630 return 0;
04631 }
04632
04633 KParts::ReadOnlyPart *KHTMLPart::currentFrame() const
04634 {
04635 KParts::ReadOnlyPart* part = (KParts::ReadOnlyPart*)(this);
04636
04637
04638
04639 while ( part && part->inherits("KHTMLPart") &&
04640 static_cast<KHTMLPart *>(part)->d->m_frames.count() > 0 ) {
04641 KHTMLPart* frameset = static_cast<KHTMLPart *>(part);
04642 part = static_cast<KParts::ReadOnlyPart *>(frameset->partManager()->activePart());
04643 if ( !part ) return frameset;
04644 }
04645 return part;
04646 }
04647
04648 bool KHTMLPart::frameExists( const QString &frameName )
04649 {
04650 ConstFrameIt it = d->m_frames.find( frameName );
04651 if ( it == d->m_frames.end() )
04652 return false;
04653
04654
04655
04656
04657 return (!(*it).m_frame.isNull());
04658 }
04659
04660 KHTMLPart *KHTMLPart::parentPart()
04661 {
04662 if ( !parent() || !parent()->inherits( "KHTMLPart" ) )
04663 return 0L;
04664
04665 return (KHTMLPart *)parent();
04666 }
04667
04668 khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( KHTMLPart *callingHtmlPart, const KURL &url,
04669 const KParts::URLArgs &args, bool callParent )
04670 {
04671 #ifdef DEBUG_FINDFRAME
04672 kdDebug( 6050 ) << "KHTMLPart::recursiveFrameRequest this = " << this << ", frame = " << args.frameName << ", url = " << url << endl;
04673 #endif
04674 khtml::ChildFrame *childFrame;
04675 KHTMLPart *childPart = findFrameParent(callingHtmlPart, args.frameName, &childFrame);
04676 if (childPart)
04677 {
04678 if (childPart == this)
04679 return childFrame;
04680
04681 childPart->requestObject( childFrame, url, args );
04682 return 0;
04683 }
04684
04685 if ( parentPart() && callParent )
04686 {
04687 khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( callingHtmlPart, url, args, callParent );
04688
04689 if ( res )
04690 parentPart()->requestObject( res, url, args );
04691 }
04692
04693 return 0L;
04694 }
04695
04696 void KHTMLPart::saveState( QDataStream &stream )
04697 {
04698 kdDebug( 6050 ) << "KHTMLPart::saveState this = " << this << " saving URL " << m_url.url() << endl;
04699
04700 stream << m_url << (Q_INT32)d->m_view->contentsX() << (Q_INT32)d->m_view->contentsY()
04701 << (Q_INT32) d->m_view->contentsWidth() << (Q_INT32) d->m_view->contentsHeight() << (Q_INT32) d->m_view->marginWidth() << (Q_INT32) d->m_view->marginHeight();
04702
04703
04704 int focusNodeNumber;
04705 if (!d->m_focusNodeRestored)
04706 focusNodeNumber = d->m_focusNodeNumber;
04707 else if (d->m_doc && d->m_doc->focusNode())
04708 focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
04709 else
04710 focusNodeNumber = -1;
04711 stream << focusNodeNumber;
04712
04713
04714 stream << d->m_cacheId;
04715
04716
04717 QStringList docState;
04718 if (d->m_doc)
04719 {
04720 docState = d->m_doc->docState();
04721 }
04722 stream << d->m_encoding << d->m_sheetUsed << docState;
04723
04724 stream << d->m_zoomFactor;
04725
04726 stream << d->m_httpHeaders;
04727 stream << d->m_pageServices;
04728 stream << d->m_pageReferrer;
04729
04730
04731 stream << d->m_ssl_in_use
04732 << d->m_ssl_peer_certificate
04733 << d->m_ssl_peer_chain
04734 << d->m_ssl_peer_ip
04735 << d->m_ssl_cipher
04736 << d->m_ssl_cipher_desc
04737 << d->m_ssl_cipher_version
04738 << d->m_ssl_cipher_used_bits
04739 << d->m_ssl_cipher_bits
04740 << d->m_ssl_cert_state
04741 << d->m_ssl_parent_ip
04742 << d->m_ssl_parent_cert;
04743
04744
04745 QStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
04746 KURL::List frameURLLst;
04747 QValueList<QByteArray> frameStateBufferLst;
04748
04749 ConstFrameIt it = d->m_frames.begin();
04750 ConstFrameIt end = d->m_frames.end();
04751 for (; it != end; ++it )
04752 {
04753 if ( !(*it).m_part )
04754 continue;
04755
04756 frameNameLst << (*it).m_name;
04757 frameServiceTypeLst << (*it).m_serviceType;
04758 frameServiceNameLst << (*it).m_serviceName;
04759 frameURLLst << (*it).m_part->url();
04760
04761 QByteArray state;
04762 QDataStream frameStream( state, IO_WriteOnly );
04763
04764 if ( (*it).m_extension )
04765 (*it).m_extension->saveState( frameStream );
04766
04767 frameStateBufferLst << state;
04768 }
04769
04770
04771 stream << (Q_UINT32) frameNameLst.count();
04772 stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst;
04773 }
04774
04775 void KHTMLPart::restoreState( QDataStream &stream )
04776 {
04777 KURL u;
04778 Q_INT32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
04779 Q_UINT32 frameCount;
04780 QStringList frameNames, frameServiceTypes, docState, frameServiceNames;
04781 KURL::List frameURLs;
04782 QValueList<QByteArray> frameStateBuffers;
04783 QValueList<int> fSizes;
04784 QString encoding, sheetUsed;
04785 long old_cacheId = d->m_cacheId;
04786
04787 stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
04788
04789 d->m_view->setMarginWidth( mWidth );
04790 d->m_view->setMarginHeight( mHeight );
04791
04792
04793
04794 stream >> d->m_focusNodeNumber;
04795 d->m_focusNodeRestored = false;
04796
04797 stream >> d->m_cacheId;
04798
04799 stream >> encoding >> sheetUsed >> docState;
04800
04801 d->m_encoding = encoding;
04802 d->m_sheetUsed = sheetUsed;
04803
04804 int zoomFactor;
04805 stream >> zoomFactor;
04806 setZoomFactor(zoomFactor);
04807
04808 stream >> d->m_httpHeaders;
04809 stream >> d->m_pageServices;
04810 stream >> d->m_pageReferrer;
04811
04812
04813 stream >> d->m_ssl_in_use
04814 >> d->m_ssl_peer_certificate
04815 >> d->m_ssl_peer_chain
04816 >> d->m_ssl_peer_ip
04817 >> d->m_ssl_cipher
04818 >> d->m_ssl_cipher_desc
04819 >> d->m_ssl_cipher_version
04820 >> d->m_ssl_cipher_used_bits
04821 >> d->m_ssl_cipher_bits
04822 >> d->m_ssl_cert_state
04823 >> d->m_ssl_parent_ip
04824 >> d->m_ssl_parent_cert;
04825
04826 setPageSecurity( d->m_ssl_in_use ? Encrypted : NotCrypted );
04827
04828 stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
04829 >> frameURLs >> frameStateBuffers;
04830
04831 d->m_bComplete = false;
04832 d->m_bLoadEventEmitted = false;
04833
04834
04835
04836
04837
04838 if (d->m_cacheId == old_cacheId)
04839 {
04840
04841 d->m_redirectionTimer.stop();
04842
04843 FrameIt fIt = d->m_frames.begin();
04844 FrameIt fEnd = d->m_frames.end();
04845
04846 for (; fIt != fEnd; ++fIt )
04847 (*fIt).m_bCompleted = false;
04848
04849 fIt = d->m_frames.begin();
04850
04851 QStringList::ConstIterator fNameIt = frameNames.begin();
04852 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
04853 QStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
04854 KURL::List::ConstIterator fURLIt = frameURLs.begin();
04855 QValueList<QByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
04856
04857 for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
04858 {
04859 khtml::ChildFrame *child = &(*fIt);
04860
04861
04862
04863 if ( child->m_name != *fNameIt || child->m_serviceType != *fServiceTypeIt )
04864 {
04865 child->m_bPreloaded = true;
04866 child->m_name = *fNameIt;
04867 child->m_serviceName = *fServiceNameIt;
04868 processObjectRequest( child, *fURLIt, *fServiceTypeIt );
04869 }
04870
04871 if ( child->m_part )
04872 {
04873 child->m_bCompleted = false;
04874 if ( child->m_extension && !(*fBufferIt).isEmpty() )
04875 {
04876 QDataStream frameStream( *fBufferIt, IO_ReadOnly );
04877 child->m_extension->restoreState( frameStream );
04878 }
04879 else
04880 child->m_part->openURL( *fURLIt );
04881 }
04882 }
04883
04884 KParts::URLArgs args( d->m_extension->urlArgs() );
04885 args.xOffset = xOffset;
04886 args.yOffset = yOffset;
04887 args.docState = docState;
04888 d->m_extension->setURLArgs( args );
04889
04890 d->m_view->resizeContents( wContents, hContents);
04891 d->m_view->setContentsPos( xOffset, yOffset );
04892
04893 m_url = u;
04894 }
04895 else
04896 {
04897
04898 closeURL();
04899
04900
04901 d->m_bCleared = false;
04902 clear();
04903 d->m_encoding = encoding;
04904 d->m_sheetUsed = sheetUsed;
04905
04906 QStringList::ConstIterator fNameIt = frameNames.begin();
04907 QStringList::ConstIterator fNameEnd = frameNames.end();
04908
04909 QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
04910 QStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
04911 KURL::List::ConstIterator fURLIt = frameURLs.begin();
04912 QValueList<QByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
04913
04914 for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
04915 {
04916 khtml::ChildFrame newChild;
04917 newChild.m_bPreloaded = true;
04918 newChild.m_name = *fNameIt;
04919 newChild.m_serviceName = *fServiceNameIt;
04920
04921
04922
04923 FrameIt childFrame = d->m_frames.append( newChild );
04924
04925 processObjectRequest( &(*childFrame), *fURLIt, *fServiceTypeIt );
04926
04927 (*childFrame).m_bPreloaded = true;
04928
04929 if ( (*childFrame).m_part )
04930 {
04931 if ( (*childFrame).m_extension )
04932 if ( (*childFrame).m_extension && !(*fBufferIt).isEmpty() )
04933 {
04934 QDataStream frameStream( *fBufferIt, IO_ReadOnly );
04935 (*childFrame).m_extension->restoreState( frameStream );
04936 }
04937 else
04938 (*childFrame).m_part->openURL( *fURLIt );
04939 }
04940 }
04941
04942 KParts::URLArgs args( d->m_extension->urlArgs() );
04943 args.xOffset = xOffset;
04944 args.yOffset = yOffset;
04945 args.docState = docState;
04946
04947 d->m_view->resizeContents( wContents, hContents);
04948 d->m_view->setContentsPos( xOffset, yOffset );
04949
04950 d->m_extension->setURLArgs( args );
04951 if (!KHTMLPageCache::self()->isComplete(d->m_cacheId))
04952 {
04953 d->m_restored = true;
04954 openURL( u );
04955 d->m_restored = false;
04956 }
04957 else
04958 {
04959 restoreURL( u );
04960 }
04961 }
04962
04963 }
04964
04965 void KHTMLPart::show()
04966 {
04967 if ( d->m_view )
04968 d->m_view->show();
04969 }
04970
04971 void KHTMLPart::hide()
04972 {
04973 if ( d->m_view )
04974 d->m_view->hide();
04975 }
04976
04977 DOM::Node KHTMLPart::nodeUnderMouse() const
04978 {
04979 return d->m_view->nodeUnderMouse();
04980 }
04981
04982 DOM::Node KHTMLPart::nonSharedNodeUnderMouse() const
04983 {
04984 return d->m_view->nonSharedNodeUnderMouse();
04985 }
04986
04987 void KHTMLPart::emitSelectionChanged()
04988 {
04989 emit d->m_extension->enableAction( "copy", hasSelection() );
04990 if ( d->m_findDialog )
04991 d->m_findDialog->setHasSelection( hasSelection() );
04992
04993 emit d->m_extension->selectionInfo( selectedText() );
04994 emit selectionChanged();
04995 }
04996
04997 int KHTMLPart::zoomFactor() const
04998 {
04999 return d->m_zoomFactor;
05000 }
05001
05002
05003 static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
05004 static const int zoomSizeCount = (sizeof(zoomSizes) / sizeof(int));
05005 static const int minZoom = 20;
05006 static const int maxZoom = 300;
05007
05008
05009 extern const int KDE_NO_EXPORT fastZoomSizes[] = { 20, 50, 75, 90, 100, 120, 150, 200, 300 };
05010 extern const int KDE_NO_EXPORT fastZoomSizeCount = sizeof fastZoomSizes / sizeof fastZoomSizes[0];
05011
05012 void KHTMLPart::slotIncZoom()
05013 {
05014 zoomIn(zoomSizes, zoomSizeCount);
05015 }
05016
05017 void KHTMLPart::slotDecZoom()
05018 {
05019 zoomOut(zoomSizes, zoomSizeCount);
05020 }
05021
05022 void KHTMLPart::slotIncZoomFast()
05023 {
05024 zoomIn(fastZoomSizes, fastZoomSizeCount);
05025 }
05026
05027 void KHTMLPart::slotDecZoomFast()
05028 {
05029 zoomOut(fastZoomSizes, fastZoomSizeCount);
05030 }
05031
05032 void KHTMLPart::zoomIn(const int stepping[], int count)
05033 {
05034 int zoomFactor = d->m_zoomFactor;
05035
05036 if (zoomFactor < maxZoom) {
05037
05038 for (int i = 0; i < count; ++i)
05039 if (stepping[i] > zoomFactor) {
05040 zoomFactor = stepping[i];
05041 break;
05042 }
05043 setZoomFactor(zoomFactor);
05044 }
05045 }
05046
05047 void KHTMLPart::zoomOut(const int stepping[], int count)
05048 {
05049 int zoomFactor = d->m_zoomFactor;
05050 if (zoomFactor > minZoom) {
05051
05052 for (int i = count-1; i >= 0; --i)
05053 if (stepping[i] < zoomFactor) {
05054 zoomFactor = stepping[i];
05055 break;
05056 }
05057 setZoomFactor(zoomFactor);
05058 }
05059 }
05060
05061 void KHTMLPart::setZoomFactor (int percent)
05062 {
05063 if (percent < minZoom) percent = minZoom;
05064 if (percent > maxZoom) percent = maxZoom;
05065 if (d->m_zoomFactor == percent) return;
05066 d->m_zoomFactor = percent;
05067
05068 if(d->m_doc) {
05069 QApplication::setOverrideCursor( waitCursor );
05070 if (d->m_doc->styleSelector())
05071 d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
05072 d->m_doc->recalcStyle( NodeImpl::Force );
05073 QApplication::restoreOverrideCursor();
05074 }
05075
05076 ConstFrameIt it = d->m_frames.begin();
05077 ConstFrameIt end = d->m_frames.end();
05078 for (; it != end; ++it )
05079 if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
05080 KParts::ReadOnlyPart* p = ( *it ).m_part;
05081 static_cast<KHTMLPart*>( p )->setZoomFactor(d->m_zoomFactor);
05082 }
05083
05084 if ( d->m_guiProfile == BrowserViewGUI ) {
05085 d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
05086 d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
05087 }
05088 }
05089
05090 void KHTMLPart::slotZoomView( int delta )
05091 {
05092 if ( delta < 0 )
05093 slotIncZoom();
05094 else
05095 slotDecZoom();
05096 }
05097
05098 void KHTMLPart::setStatusBarText( const QString& text, StatusBarPriority p)
05099 {
05100 if (!d->m_statusMessagesEnabled)
05101 return;
05102
05103 d->m_statusBarText[p] = text;
05104
05105
05106 QString tobe = d->m_statusBarText[BarHoverText];
05107 if (tobe.isEmpty())
05108 tobe = d->m_statusBarText[BarOverrideText];
05109 if (tobe.isEmpty()) {
05110 tobe = d->m_statusBarText[BarDefaultText];
05111 if (!tobe.isEmpty() && d->m_jobspeed)
05112 tobe += " ";
05113 if (d->m_jobspeed)
05114 tobe += i18n( "(%1/s)" ).arg( KIO::convertSize( d->m_jobspeed ) );
05115 }
05116 tobe = "<qt>"+tobe;
05117
05118 emit ReadOnlyPart::setStatusBarText(tobe);
05119 }
05120
05121
05122 void KHTMLPart::setJSStatusBarText( const QString &text )
05123 {
05124 setStatusBarText(text, BarOverrideText);
05125 }
05126
05127 void KHTMLPart::setJSDefaultStatusBarText( const QString &text )
05128 {
05129 setStatusBarText(text, BarDefaultText);
05130 }
05131
05132 QString KHTMLPart::jsStatusBarText() const
05133 {
05134 return d->m_statusBarText[BarOverrideText];
05135 }
05136
05137 QString KHTMLPart::jsDefaultStatusBarText() const
05138 {
05139 return d->m_statusBarText[BarDefaultText];
05140 }
05141
05142 QString KHTMLPart::referrer() const
05143 {
05144 return d->m_referrer;
05145 }
05146
05147 QString KHTMLPart::pageReferrer() const
05148 {
05149 KURL referrerURL = KURL( d->m_pageReferrer );
05150 if (referrerURL.isValid())
05151 {
05152 QString protocol = referrerURL.protocol();
05153
05154 if ((protocol == "http") ||
05155 ((protocol == "https") && (m_url.protocol() == "https")))
05156 {
05157 referrerURL.setRef(QString::null);
05158 referrerURL.setUser(QString::null);
05159 referrerURL.setPass(QString::null);
05160 return referrerURL.url();
05161 }
05162 }
05163
05164 return QString::null;
05165 }
05166
05167
05168 QString KHTMLPart::lastModified() const
05169 {
05170 if ( d->m_lastModified.isEmpty() && m_url.isLocalFile() ) {
05171
05172
05173
05174 QDateTime lastModif = QFileInfo( m_url.path() ).lastModified();
05175 d->m_lastModified = lastModif.toString( Qt::LocalDate );
05176 }
05177
05178 return d->m_lastModified;
05179 }
05180
05181 void KHTMLPart::slotLoadImages()
05182 {
05183 if (d->m_doc )
05184 d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
05185
05186 ConstFrameIt it = d->m_frames.begin();
05187 ConstFrameIt end = d->m_frames.end();
05188 for (; it != end; ++it )
05189 if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
05190 KParts::ReadOnlyPart* p = ( *it ).m_part;
05191 static_cast<KHTMLPart*>( p )->slotLoadImages();
05192 }
05193 }
05194
05195 void KHTMLPart::reparseConfiguration()
05196 {
05197 KHTMLSettings *settings = KHTMLFactory::defaultHTMLSettings();
05198 settings->init();
05199
05200 setAutoloadImages( settings->autoLoadImages() );
05201 if (d->m_doc)
05202 d->m_doc->docLoader()->setShowAnimations( settings->showAnimations() );
05203
05204 d->m_bOpenMiddleClick = settings->isOpenMiddleClickEnabled();
05205 d->m_bBackRightClick = settings->isBackRightClickEnabled();
05206 d->m_bJScriptEnabled = settings->isJavaScriptEnabled(m_url.host());
05207 setDebugScript( settings->isJavaScriptDebugEnabled() );
05208 d->m_bJavaEnabled = settings->isJavaEnabled(m_url.host());
05209 d->m_bPluginsEnabled = settings->isPluginsEnabled(m_url.host());
05210 d->m_metaRefreshEnabled = settings->isAutoDelayedActionsEnabled ();
05211
05212 delete d->m_settings;
05213 d->m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
05214
05215 QApplication::setOverrideCursor( waitCursor );
05216 khtml::CSSStyleSelector::reparseConfiguration();
05217 if(d->m_doc) d->m_doc->updateStyleSelector();
05218 QApplication::restoreOverrideCursor();
05219 }
05220
05221 QStringList KHTMLPart::frameNames() const
05222 {
05223 QStringList res;
05224
05225 ConstFrameIt it = d->m_frames.begin();
05226 ConstFrameIt end = d->m_frames.end();
05227 for (; it != end; ++it )
05228 if (!(*it).m_bPreloaded)
05229 res += (*it).m_name;
05230
05231 return res;
05232 }
05233
05234 QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
05235 {
05236 QPtrList<KParts::ReadOnlyPart> res;
05237
05238 ConstFrameIt it = d->m_frames.begin();
05239 ConstFrameIt end = d->m_frames.end();
05240 for (; it != end; ++it )
05241 if (!(*it).m_bPreloaded)
05242 res.append( (*it).m_part );
05243
05244 return res;
05245 }
05246
05247 bool KHTMLPart::openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs )
05248 {
05249 kdDebug( 6050 ) << this << "KHTMLPart::openURLInFrame " << url << endl;
05250 FrameIt it = d->m_frames.find( urlArgs.frameName );
05251
05252 if ( it == d->m_frames.end() )
05253 return false;
05254
05255
05256 if ( !urlArgs.lockHistory() )
05257 emit d->m_extension->openURLNotify();
05258
05259 requestObject( &(*it), url, urlArgs );
05260
05261 return true;
05262 }
05263
05264 void KHTMLPart::setDNDEnabled( bool b )
05265 {
05266 d->m_bDnd = b;
05267 }
05268
05269 bool KHTMLPart::dndEnabled() const
05270 {
05271 return d->m_bDnd;
05272 }
05273
05274 void KHTMLPart::customEvent( QCustomEvent *event )
05275 {
05276 if ( khtml::MousePressEvent::test( event ) )
05277 {
05278 khtmlMousePressEvent( static_cast<khtml::MousePressEvent *>( event ) );
05279 return;
05280 }
05281
05282 if ( khtml::MouseDoubleClickEvent::test( event ) )
05283 {
05284 khtmlMouseDoubleClickEvent( static_cast<khtml::MouseDoubleClickEvent *>( event ) );
05285 return;
05286 }
05287
05288 if ( khtml::MouseMoveEvent::test( event ) )
05289 {
05290 khtmlMouseMoveEvent( static_cast<khtml::MouseMoveEvent *>( event ) );
05291 return;
05292 }
05293
05294 if ( khtml::MouseReleaseEvent::test( event ) )
05295 {
05296 khtmlMouseReleaseEvent( static_cast<khtml::MouseReleaseEvent *>( event ) );
05297 return;
05298 }
05299
05300 if ( khtml::DrawContentsEvent::test( event ) )
05301 {
05302 khtmlDrawContentsEvent( static_cast<khtml::DrawContentsEvent *>( event ) );
05303 return;
05304 }
05305
05306 KParts::ReadOnlyPart::customEvent( event );
05307 }
05308
05314 static bool firstRunAt(khtml::RenderObject *renderNode, int y, NodeImpl *&startNode, long &startOffset)
05315 {
05316 for (khtml::RenderObject *n = renderNode; n; n = n->nextSibling()) {
05317 if (n->isText()) {
05318 khtml::RenderText *textRenderer = static_cast<khtml::RenderText *>(n);
05319 const khtml::InlineTextBoxArray &runs = textRenderer->inlineTextBoxes();
05320 for (unsigned i = 0; i != runs.count(); i++) {
05321 if (runs[i]->m_y == y) {
05322 startNode = textRenderer->element();
05323 startOffset = runs[i]->m_start;
05324 return true;
05325 }
05326 }
05327 }
05328
05329 if (firstRunAt(n->firstChild(), y, startNode, startOffset)) {
05330 return true;
05331 }
05332 }
05333
05334 return false;
05335 }
05336
05342 static bool lastRunAt(khtml::RenderObject *renderNode, int y, NodeImpl *&endNode, long &endOffset)
05343 {
05344 khtml::RenderObject *n = renderNode;
05345 if (!n) {
05346 return false;
05347 }
05348 khtml::RenderObject *next;
05349 while ((next = n->nextSibling())) {
05350 n = next;
05351 }
05352
05353 while (1) {
05354 if (lastRunAt(n->firstChild(), y, endNode, endOffset)) {
05355 return true;
05356 }
05357
05358 if (n->isText()) {
05359 khtml::RenderText *textRenderer = static_cast<khtml::RenderText *>(n);
05360 const khtml::InlineTextBoxArray &runs = textRenderer->inlineTextBoxes();
05361 for (int i = (int)runs.count()-1; i >= 0; i--) {
05362 if (runs[i]->m_y == y) {
05363 endNode = textRenderer->element();
05364 endOffset = runs[i]->m_start + runs[i]->m_len;
05365 return true;
05366 }
05367 }
05368 }
05369
05370 if (n == renderNode) {
05371 return false;
05372 }
05373
05374 n = n->previousSibling();
05375 }
05376 }
05377
05378 void KHTMLPart::khtmlMousePressEvent( khtml::MousePressEvent *event )
05379 {
05380 DOM::DOMString url = event->url();
05381 QMouseEvent *_mouse = event->qmouseEvent();
05382 DOM::Node innerNode = event->innerNode();
05383 d->m_mousePressNode = innerNode;
05384
05385 d->m_dragStartPos = _mouse->pos();
05386
05387 if ( !event->url().isNull() ) {
05388 d->m_strSelectedURL = event->url().string();
05389 d->m_strSelectedURLTarget = event->target().string();
05390 }
05391 else
05392 d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
05393
05394 if ( _mouse->button() == LeftButton ||
05395 _mouse->button() == MidButton )
05396 {
05397 d->m_bMousePressed = true;
05398
05399 #ifndef KHTML_NO_SELECTION
05400 if ( _mouse->button() == LeftButton )
05401 {
05402 if ( (!d->m_strSelectedURL.isNull() && !isEditable())
05403 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) )
05404 return;
05405 if ( !innerNode.isNull() && innerNode.handle()->renderer()) {
05406 int offset = 0;
05407 DOM::NodeImpl* node = 0;
05408 khtml::RenderObject::SelPointState state;
05409 innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
05410 event->absX()-innerNode.handle()->renderer()->xPos(),
05411 event->absY()-innerNode.handle()->renderer()->yPos(), node, offset, state );
05412 d->m_extendMode = d->ExtendByChar;
05413 #ifdef KHTML_NO_CARET
05414 d->m_selectionStart = node;
05415 d->m_startOffset = offset;
05416
05417
05418
05419
05420
05421 d->m_selectionEnd = d->m_selectionStart;
05422 d->m_endOffset = d->m_startOffset;
05423 d->m_doc->clearSelection();
05424 #else // KHTML_NO_CARET
05425 d->m_view->moveCaretTo(node, offset, (_mouse->state() & ShiftButton) == 0);
05426 #endif // KHTML_NO_CARET
05427 d->m_initialNode = d->m_selectionStart;
05428 d->m_initialOffset = d->m_startOffset;
05429
05430 }
05431 else
05432 {
05433 #ifndef KHTML_NO_CARET
05434
05435 #else
05436 d->m_selectionStart = DOM::Node();
05437 d->m_selectionEnd = DOM::Node();
05438 #endif
05439 }
05440 emitSelectionChanged();
05441 startAutoScroll();
05442 }
05443 #else
05444 d->m_dragLastPos = _mouse->globalPos();
05445 #endif
05446 }
05447
05448 if ( _mouse->button() == RightButton && parentPart() != 0 && d->m_bBackRightClick )
05449 {
05450 d->m_bRightMousePressed = true;
05451 } else if ( _mouse->button() == RightButton )
05452 {
05453 popupMenu( d->m_strSelectedURL );
05454
05455 }
05456 }
05457
05458 void KHTMLPart::khtmlMouseDoubleClickEvent( khtml::MouseDoubleClickEvent *event )
05459 {
05460 QMouseEvent *_mouse = event->qmouseEvent();
05461 if ( _mouse->button() == LeftButton )
05462 {
05463 d->m_bMousePressed = true;
05464 DOM::Node innerNode = event->innerNode();
05465
05466 if ( !innerNode.isNull() && innerNode.handle()->renderer()) {
05467 int offset = 0;
05468 DOM::NodeImpl* node = 0;
05469 khtml::RenderObject::SelPointState state;
05470 innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
05471 event->absX()-innerNode.handle()->renderer()->xPos(),
05472 event->absY()-innerNode.handle()->renderer()->yPos(), node, offset, state);
05473
05474
05475
05476 if ( node && node->renderer() )
05477 {
05478
05479 bool selectLine = (event->clickCount() == 3);
05480 d->m_extendMode = selectLine ? d->ExtendByLine : d->ExtendByWord;
05481
05482
05483 if (_mouse->state() & ShiftButton) {
05484 d->caretNode() = node;
05485 d->caretOffset() = offset;
05486 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
05487 d->m_selectionStart.handle(), d->m_startOffset,
05488 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
05489 d->m_initialNode = d->m_extendAtEnd ? d->m_selectionStart : d->m_selectionEnd;
05490 d->m_initialOffset = d->m_extendAtEnd ? d->m_startOffset : d->m_endOffset;
05491 } else {
05492 d->m_selectionStart = d->m_selectionEnd = node;
05493 d->m_startOffset = d->m_endOffset = offset;
05494 d->m_startBeforeEnd = true;
05495 d->m_initialNode = node;
05496 d->m_initialOffset = offset;
05497 }
05498
05499
05500
05501 extendSelection( d->m_selectionStart.handle(), d->m_startOffset, d->m_selectionStart, d->m_startOffset, !d->m_startBeforeEnd, selectLine );
05502
05503 extendSelection( d->m_selectionEnd.handle(), d->m_endOffset, d->m_selectionEnd, d->m_endOffset, d->m_startBeforeEnd, selectLine );
05504
05505
05506
05507
05508 emitSelectionChanged();
05509 d->m_doc
05510 ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
05511 d->m_selectionEnd.handle(),d->m_endOffset);
05512 #ifndef KHTML_NO_CARET
05513 bool v = d->m_view->placeCaret();
05514 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
05515 #endif
05516 startAutoScroll();
05517 }
05518 }
05519 }
05520 }
05521
05522 void KHTMLPart::extendSelection( DOM::NodeImpl* node, long offset, DOM::Node& selectionNode, long& selectionOffset, bool right, bool selectLines )
05523 {
05524 khtml::RenderObject* obj = node->renderer();
05525
05526 if (obj->isText() && selectLines) {
05527 int pos;
05528 khtml::RenderText *renderer = static_cast<khtml::RenderText *>(obj);
05529 khtml::InlineTextBox *run = renderer->findInlineTextBox( offset, pos );
05530 DOMString t = node->nodeValue();
05531 DOM::NodeImpl* selNode = 0;
05532 long selOfs = 0;
05533
05534 if (!run)
05535 return;
05536
05537 int selectionPointY = run->m_y;
05538
05539
05540 khtml::RenderObject *renderNode = renderer;
05541 while (renderNode && renderNode->isInline())
05542 renderNode = renderNode->parent();
05543
05544 renderNode = renderNode->firstChild();
05545
05546 if (right) {
05547
05548
05549 if (!lastRunAt (renderNode, selectionPointY, selNode, selOfs))
05550 return;
05551 } else {
05552
05553
05554 if (!firstRunAt (renderNode, selectionPointY, selNode, selOfs))
05555 return;
05556 }
05557
05558 selectionNode = selNode;
05559 selectionOffset = selOfs;
05560 return;
05561 }
05562
05563 QString str;
05564 int len = 0;
05565
05566 if (right && offset > 0) offset--;
05567 if ( obj->isText() ) {
05568 str = static_cast<khtml::RenderText *>(obj)->data().string();
05569 len = str.length();
05570 }
05571
05572 QChar ch;
05573 do {
05574
05575 if ( node ) {
05576 selectionNode = node;
05577 selectionOffset = offset;
05578 }
05579
05580
05581 while ( obj && ( (right && offset >= len-1) || (!right && offset <= 0) ) )
05582 {
05583 obj = right ? obj->objectBelow() : obj->objectAbove();
05584
05585 if ( obj ) {
05586
05587 str = QString::null;
05588 if ( obj->isText() )
05589 str = static_cast<khtml::RenderText *>(obj)->data().string();
05590 else if ( obj->isBR() )
05591 str = '\n';
05592 else if ( !obj->isInline() ) {
05593 obj = 0L;
05594 break;
05595 }
05596 len = str.length();
05597
05598
05599 if ( right )
05600 offset = -1;
05601 else
05602 offset = len;
05603 }
05604 }
05605 if ( !obj )
05606 break;
05607 node = obj->element();
05608 if ( right )
05609 {
05610 Q_ASSERT( offset < len-1 );
05611 offset++;
05612 }
05613 else
05614 {
05615 Q_ASSERT( offset > 0 );
05616 offset--;
05617 }
05618
05619
05620 ch = str[ offset ];
05621
05622 } while ( !ch.isSpace() && !ch.isPunct() );
05623
05624
05625 if (right) selectionOffset++;
05626 }
05627
05628 #ifndef KHTML_NO_SELECTION
05629 void KHTMLPart::extendSelectionTo(int x, int y, int absX, int absY, const DOM::Node &innerNode)
05630 {
05631 int offset;
05632
05633 DOM::NodeImpl* node=0;
05634 khtml::RenderObject::SelPointState state;
05635 innerNode.handle()->renderer()->checkSelectionPoint( x, y,
05636 absX-innerNode.handle()->renderer()->xPos(),
05637 absY-innerNode.handle()->renderer()->yPos(), node, offset, state);
05638 if (!node || !node->renderer()) return;
05639
05640
05641
05642
05643 bool withinNode = innerNode == node;
05644
05645
05646
05647 if (d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() ||
05648 d->m_initialNode.isNull() ||
05649 !d->m_selectionStart.handle()->renderer() ||
05650 !d->m_selectionEnd.handle()->renderer()) return;
05651
05652 if (d->m_extendMode != d->ExtendByChar) {
05653
05654 bool caretBeforeInit = RangeImpl::compareBoundaryPoints(
05655 d->caretNode().handle(), d->caretOffset(),
05656 d->m_initialNode.handle(), d->m_initialOffset) <= 0;
05657 bool nodeBeforeInit = RangeImpl::compareBoundaryPoints(node, offset,
05658 d->m_initialNode.handle(), d->m_initialOffset) <= 0;
05659
05660 if (caretBeforeInit != nodeBeforeInit) {
05661
05662 extendSelection(d->m_initialNode.handle(), d->m_initialOffset,
05663 d->m_extendAtEnd ? d->m_selectionStart : d->m_selectionEnd,
05664 d->m_extendAtEnd ? d->m_startOffset : d->m_endOffset,
05665 nodeBeforeInit, d->m_extendMode == d->ExtendByLine);
05666 }
05667 }
05668
05669 d->caretNode() = node;
05670 d->caretOffset() = offset;
05671
05672
05673 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
05674 d->m_selectionStart.handle(), d->m_startOffset,
05675 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
05676
05677 if ( !d->m_selectionStart.isNull() && !d->m_selectionEnd.isNull() )
05678 {
05679
05680 if (d->m_extendMode != d->ExtendByChar && withinNode)
05681 extendSelection( node, offset, d->caretNode(), d->caretOffset(), d->m_startBeforeEnd ^ !d->m_extendAtEnd, d->m_extendMode == d->ExtendByLine );
05682
05683 if (d->m_selectionEnd == d->m_selectionStart && d->m_endOffset < d->m_startOffset)
05684 d->m_doc
05685 ->setSelection(d->m_selectionStart.handle(),d->m_endOffset,
05686 d->m_selectionEnd.handle(),d->m_startOffset);
05687 else if (d->m_startBeforeEnd)
05688 d->m_doc
05689 ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
05690 d->m_selectionEnd.handle(),d->m_endOffset);
05691 else
05692 d->m_doc
05693 ->setSelection(d->m_selectionEnd.handle(),d->m_endOffset,
05694 d->m_selectionStart.handle(),d->m_startOffset);
05695 }
05696 #ifndef KHTML_NO_CARET
05697 d->m_view->placeCaret();
05698 #endif
05699 }
05700
05701 bool KHTMLPart::isExtendingSelection() const
05702 {
05703
05704
05705
05706 return d->m_bMousePressed;
05707 }
05708 #endif // KHTML_NO_SELECTION
05709
05710 void KHTMLPart::khtmlMouseMoveEvent( khtml::MouseMoveEvent *event )
05711 {
05712 QMouseEvent *_mouse = event->qmouseEvent();
05713
05714 if( d->m_bRightMousePressed && parentPart() != 0 && d->m_bBackRightClick )
05715 {
05716 popupMenu( d->m_strSelectedURL );
05717 d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
05718 d->m_bRightMousePressed = false;
05719 }
05720
05721 DOM::DOMString url = event->url();
05722 DOM::DOMString target = event->target();
05723 DOM::Node innerNode = event->innerNode();
05724
05725 #ifndef QT_NO_DRAGANDDROP
05726 if( d->m_bDnd && d->m_bMousePressed &&
05727 ( (!d->m_strSelectedURL.isEmpty() && !isEditable())
05728 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) ) ) {
05729 if ( ( d->m_dragStartPos - _mouse->pos() ).manhattanLength() <= KGlobalSettings::dndEventDelay() )
05730 return;
05731
05732 QPixmap pix;
05733 HTMLImageElementImpl *img = 0L;
05734 QDragObject *drag = 0;
05735 KURL u;
05736
05737
05738
05739
05740
05741 if ( url.length() == 0 && innerNode.handle() && innerNode.handle()->id() == ID_IMG )
05742 {
05743 img = static_cast<HTMLImageElementImpl *>(innerNode.handle());
05744 u = KURL( completeURL( khtml::parseURL(img->getAttribute(ATTR_SRC)).string() ) );
05745 pix = KMimeType::mimeType("image/png")->pixmap(KIcon::Desktop);
05746 }
05747 else
05748 {
05749
05750 u = completeURL( d->m_strSelectedURL );
05751 pix = KMimeType::pixmapForURL(u, 0, KIcon::Desktop, KIcon::SizeMedium);
05752 }
05753
05754 KURLDrag* urlDrag = new KURLDrag( u, img ? 0 : d->m_view->viewport() );
05755 if ( !d->m_referrer.isEmpty() )
05756 urlDrag->metaData()["referrer"] = d->m_referrer;
05757
05758 if( img ) {
05759 KMultipleDrag *mdrag = new KMultipleDrag( d->m_view->viewport() );
05760 mdrag->addDragObject( new QImageDrag( img->currentImage(), 0L ) );
05761 mdrag->addDragObject( urlDrag );
05762 drag = mdrag;
05763 }
05764 else
05765 drag = urlDrag;
05766
05767 if ( !pix.isNull() )
05768 drag->setPixmap( pix );
05769
05770 stopAutoScroll();
05771 if(drag)
05772 drag->drag();
05773
05774
05775 d->m_bMousePressed = false;
05776 d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
05777 return;
05778 }
05779 #endif
05780
05781
05782 if ( !d->m_bMousePressed )
05783 {
05784
05785 if ( url.length() )
05786 {
05787 bool shiftPressed = ( _mouse->state() & ShiftButton );
05788
05789
05790 if ( !innerNode.isNull() && innerNode.elementId() == ID_IMG )
05791 {
05792 HTMLImageElementImpl *i = static_cast<HTMLImageElementImpl *>(innerNode.handle());
05793 if ( i && i->isServerMap() )
05794 {
05795 khtml::RenderObject *r = i->renderer();
05796 if(r)
05797 {
05798 int absx, absy, vx, vy;
05799 r->absolutePosition(absx, absy);
05800 view()->contentsToViewport( absx, absy, vx, vy );
05801
05802 int x(_mouse->x() - vx), y(_mouse->y() - vy);
05803
05804 d->m_overURL = url.string() + QString("?%1,%2").arg(x).arg(y);
05805 d->m_overURLTarget = target.string();
05806 overURL( d->m_overURL, target.string(), shiftPressed );
05807 return;
05808 }
05809 }
05810 }
05811
05812
05813 if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
05814 {
05815 d->m_overURL = url.string();
05816 d->m_overURLTarget = target.string();
05817 overURL( d->m_overURL, target.string(), shiftPressed );
05818 }
05819 }
05820 else
05821 {
05822 if( !d->m_overURL.isEmpty() )
05823 {
05824 d->m_overURL = d->m_overURLTarget = QString::null;
05825 emit onURL( QString::null );
05826
05827 setStatusBarText(QString::null, BarHoverText);
05828 emit d->m_extension->mouseOverInfo(0);
05829 }
05830 }
05831 }
05832 else {
05833 #ifndef KHTML_NO_SELECTION
05834
05835 if( d->m_bMousePressed && innerNode.handle() && innerNode.handle()->renderer() &&
05836 ( (_mouse->state() & LeftButton) != 0 )) {
05837 extendSelectionTo(event->x(), event->y(),
05838 event->absX(), event->absY(), innerNode);
05839 #else
05840 if ( d->m_doc && d->m_view ) {
05841 QPoint diff( _mouse->globalPos() - d->m_dragLastPos );
05842
05843 if ( abs( diff.x() ) > 64 || abs( diff.y() ) > 64 ) {
05844 d->m_view->scrollBy( -diff.x(), -diff.y() );
05845 d->m_dragLastPos = _mouse->globalPos();
05846 }
05847 #endif
05848 }
05849 }
05850
05851 }
05852
05853 void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
05854 {
05855 DOM::Node innerNode = event->innerNode();
05856 d->m_mousePressNode = DOM::Node();
05857
05858 if ( d->m_bMousePressed ) {
05859 setStatusBarText(QString::null, BarHoverText);
05860 stopAutoScroll();
05861 }
05862
05863
05864
05865 d->m_bMousePressed = false;
05866
05867 QMouseEvent *_mouse = event->qmouseEvent();
05868 if ( _mouse->button() == RightButton && parentPart() != 0 && d->m_bBackRightClick )
05869 {
05870 d->m_bRightMousePressed = false;
05871 KParts::BrowserInterface *tmp_iface = d->m_extension->browserInterface();
05872 if( tmp_iface ) {
05873 tmp_iface->callMethod( "goHistory(int)", -1 );
05874 }
05875 }
05876 #ifndef QT_NO_CLIPBOARD
05877 if ((d->m_guiProfile == BrowserViewGUI) && (_mouse->button() == MidButton) && (event->url().isNull())) {
05878 kdDebug( 6050 ) << "KHTMLPart::khtmlMouseReleaseEvent() MMB shouldOpen="
05879 << d->m_bOpenMiddleClick << endl;
05880
05881 if (d->m_bOpenMiddleClick) {
05882 KHTMLPart *p = this;
05883 while (p->parentPart()) p = p->parentPart();
05884 p->d->m_extension->pasteRequest();
05885 }
05886 }
05887 #endif
05888
05889 #ifndef KHTML_NO_SELECTION
05890
05891 if(d->m_selectionStart == d->m_selectionEnd && d->m_startOffset == d->m_endOffset) {
05892 #ifndef KHTML_NO_CARET
05893 d->m_extendAtEnd = true;
05894 #else
05895 d->m_selectionStart = 0;
05896 d->m_selectionEnd = 0;
05897 d->m_startOffset = 0;
05898 d->m_endOffset = 0;
05899 #endif
05900 emitSelectionChanged();
05901 } else {
05902
05903
05904 DOM::Node n = d->m_selectionStart;
05905 d->m_startBeforeEnd = false;
05906 if( d->m_selectionStart == d->m_selectionEnd ) {
05907 if( d->m_startOffset < d->m_endOffset )
05908 d->m_startBeforeEnd = true;
05909 } else {
05910 #if 0
05911 while(!n.isNull()) {
05912 if(n == d->m_selectionEnd) {
05913 d->m_startBeforeEnd = true;
05914 break;
05915 }
05916 DOM::Node next = n.firstChild();
05917 if(next.isNull()) next = n.nextSibling();
05918 while( next.isNull() && !n.parentNode().isNull() ) {
05919 n = n.parentNode();
05920 next = n.nextSibling();
05921 }
05922 n = next;
05923 }
05924 #else
05925
05926 if (d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() ||
05927 !d->m_selectionStart.handle()->renderer() ||
05928 !d->m_selectionEnd.handle()->renderer()) return;
05929 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
05930 d->m_selectionStart.handle(), d->m_startOffset,
05931 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
05932 #endif
05933 }
05934 if(!d->m_startBeforeEnd)
05935 {
05936 DOM::Node tmpNode = d->m_selectionStart;
05937 int tmpOffset = d->m_startOffset;
05938 d->m_selectionStart = d->m_selectionEnd;
05939 d->m_startOffset = d->m_endOffset;
05940 d->m_selectionEnd = tmpNode;
05941 d->m_endOffset = tmpOffset;
05942 d->m_startBeforeEnd = true;
05943 d->m_extendAtEnd = !d->m_extendAtEnd;
05944 }
05945 #ifndef KHTML_NO_CARET
05946 bool v = d->m_view->placeCaret();
05947 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
05948 #endif
05949
05950 #ifndef QT_NO_CLIPBOARD
05951 QString text = selectedText();
05952 text.replace(QChar(0xa0), ' ');
05953 disconnect( kapp->clipboard(), SIGNAL( selectionChanged()), this, SLOT( slotClearSelection()));
05954 kapp->clipboard()->setText(text,QClipboard::Selection);
05955 connect( kapp->clipboard(), SIGNAL( selectionChanged()), SLOT( slotClearSelection()));
05956 #endif
05957
05958 emitSelectionChanged();
05959
05960 }
05961 #endif
05962 d->m_initialNode = 0;
05963 d->m_initialOffset = 0;
05964
05965 }
05966
05967 void KHTMLPart::khtmlDrawContentsEvent( khtml::DrawContentsEvent * )
05968 {
05969 }
05970
05971 void KHTMLPart::guiActivateEvent( KParts::GUIActivateEvent *event )
05972 {
05973 if ( event->activated() )
05974 {
05975 emitSelectionChanged();
05976 emit d->m_extension->enableAction( "print", d->m_doc != 0 );
05977
05978 if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
05979 {
05980 QPtrList<KAction> lst;
05981 lst.append( d->m_paLoadImages );
05982 plugActionList( "loadImages", lst );
05983 }
05984 }
05985 }
05986
05987 void KHTMLPart::slotPrintFrame()
05988 {
05989 if ( d->m_frames.count() == 0 )
05990 return;
05991
05992 KParts::ReadOnlyPart *frame = currentFrame();
05993 if (!frame)
05994 return;
05995
05996 KParts::BrowserExtension *ext = KParts::BrowserExtension::childObject( frame );
05997
05998 if ( !ext )
05999 return;
06000
06001 QMetaObject *mo = ext->metaObject();
06002
06003 int idx = mo->findSlot( "print()", true );
06004 if ( idx >= 0 ) {
06005 QUObject o[ 1 ];
06006 ext->qt_invoke( idx, o );
06007 }
06008 }
06009
06010 void KHTMLPart::slotSelectAll()
06011 {
06012 KParts::ReadOnlyPart *part = currentFrame();
06013 if (part && part->inherits("KHTMLPart"))
06014 static_cast<KHTMLPart *>(part)->selectAll();
06015 }
06016
06017 void KHTMLPart::startAutoScroll()
06018 {
06019 connect(&d->m_scrollTimer, SIGNAL( timeout() ), this, SLOT( slotAutoScroll() ));
06020 d->m_scrollTimer.start(100, false);
06021 }
06022
06023 void KHTMLPart::stopAutoScroll()
06024 {
06025 disconnect(&d->m_scrollTimer, SIGNAL( timeout() ), this, SLOT( slotAutoScroll() ));
06026 if (d->m_scrollTimer.isActive())
06027 d->m_scrollTimer.stop();
06028 }
06029
06030
06031 void KHTMLPart::slotAutoScroll()
06032 {
06033 if (d->m_view)
06034 d->m_view->doAutoScroll();
06035 else
06036 stopAutoScroll();
06037 }
06038
06039 void KHTMLPart::selectAll()
06040 {
06041 if (!d->m_doc) return;
06042
06043 NodeImpl *first;
06044 if (d->m_doc->isHTMLDocument())
06045 first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
06046 else
06047 first = d->m_doc;
06048 NodeImpl *next;
06049
06050
06051
06052 while ( first && !(first->renderer()
06053 && ((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE)
06054 || (first->renderer()->isReplaced() && !first->renderer()->firstChild()))))
06055 {
06056 next = first->firstChild();
06057 if ( !next ) next = first->nextSibling();
06058 while( first && !next )
06059 {
06060 first = first->parentNode();
06061 if ( first )
06062 next = first->nextSibling();
06063 }
06064 first = next;
06065 }
06066
06067 NodeImpl *last;
06068 if (d->m_doc->isHTMLDocument())
06069 last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
06070 else
06071 last = d->m_doc;
06072
06073
06074
06075
06076 while ( last && !(last->renderer()
06077 && ((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE)
06078 || (last->renderer()->isReplaced() && !last->renderer()->lastChild()))))
06079 {
06080 next = last->lastChild();
06081 if ( !next ) next = last->previousSibling();
06082 while ( last && !next )
06083 {
06084 last = last->parentNode();
06085 if ( last )
06086 next = last->previousSibling();
06087 }
06088 last = next;
06089 }
06090
06091 if ( !first || !last )
06092 return;
06093 Q_ASSERT(first->renderer());
06094 Q_ASSERT(last->renderer());
06095 d->m_selectionStart = first;
06096 d->m_startOffset = 0;
06097 d->m_selectionEnd = last;
06098 d->m_endOffset = last->nodeValue().length();
06099 d->m_startBeforeEnd = true;
06100
06101 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
06102 d->m_selectionEnd.handle(), d->m_endOffset );
06103
06104 emitSelectionChanged();
06105 }
06106
06107 bool KHTMLPart::checkLinkSecurity(const KURL &linkURL,const QString &message, const QString &button)
06108 {
06109 bool linkAllowed = true;
06110
06111 if ( d->m_doc )
06112 linkAllowed = kapp && kapp->authorizeURLAction("redirect", url(), linkURL);
06113
06114 if ( !linkAllowed ) {
06115 khtml::Tokenizer *tokenizer = d->m_doc->tokenizer();
06116 if (tokenizer)
06117 tokenizer->setOnHold(true);
06118
06119 int response = KMessageBox::Cancel;
06120 if (!message.isEmpty())
06121 {
06122 response = KMessageBox::warningContinueCancel( 0,
06123 message.arg(linkURL.htmlURL()),
06124 i18n( "Security Warning" ),
06125 button);
06126 }
06127 else
06128 {
06129 KMessageBox::error( 0,
06130 i18n( "<qt>Access by untrusted page to<BR><B>%1</B><BR> denied.").arg(linkURL.htmlURL()),
06131 i18n( "Security Alert" ));
06132 }
06133
06134 if (tokenizer)
06135 tokenizer->setOnHold(false);
06136 return (response==KMessageBox::Continue);
06137 }
06138 return true;
06139 }
06140
06141 void KHTMLPart::slotPartRemoved( KParts::Part *part )
06142 {
06143
06144 if ( part == d->m_activeFrame )
06145 {
06146 d->m_activeFrame = 0L;
06147 if ( !part->inherits( "KHTMLPart" ) )
06148 {
06149 if (factory()) {
06150 factory()->removeClient( part );
06151 }
06152 if (childClients()->containsRef(part)) {
06153 removeChildClient( part );
06154 }
06155 }
06156 }
06157 }
06158
06159 void KHTMLPart::slotActiveFrameChanged( KParts::Part *part )
06160 {
06161
06162 if ( part == this )
06163 {
06164 kdError(6050) << "strange error! we activated ourselves" << endl;
06165 assert( false );
06166 return;
06167 }
06168
06169 if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits( "QFrame" ) )
06170 {
06171 QFrame *frame = static_cast<QFrame *>( d->m_activeFrame->widget() );
06172 if (frame->frameStyle() != QFrame::NoFrame)
06173 {
06174 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken);
06175 frame->repaint();
06176 }
06177 }
06178
06179 if( d->m_activeFrame && !d->m_activeFrame->inherits( "KHTMLPart" ) )
06180 {
06181 if (factory()) {
06182 factory()->removeClient( d->m_activeFrame );
06183 }
06184 removeChildClient( d->m_activeFrame );
06185 }
06186 if( part && !part->inherits( "KHTMLPart" ) )
06187 {
06188 if (factory()) {
06189 factory()->addClient( part );
06190 }
06191 insertChildClient( part );
06192 }
06193
06194
06195 d->m_activeFrame = part;
06196
06197 if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits( "QFrame" ) )
06198 {
06199 QFrame *frame = static_cast<QFrame *>( d->m_activeFrame->widget() );
06200 if (frame->frameStyle() != QFrame::NoFrame)
06201 {
06202 frame->setFrameStyle( QFrame::StyledPanel | QFrame::Plain);
06203 frame->repaint();
06204 }
06205 kdDebug(6050) << "new active frame " << d->m_activeFrame << endl;
06206 }
06207
06208 updateActions();
06209
06210
06211 d->m_extension->setExtensionProxy( KParts::BrowserExtension::childObject( d->m_activeFrame ) );
06212 }
06213
06214 void KHTMLPart::setActiveNode(const DOM::Node &node)
06215 {
06216 if (!d->m_doc || !d->m_view)
06217 return;
06218
06219
06220 d->m_doc->setFocusNode(node.handle());
06221
06222
06223 QRect rect = node.handle()->getRect();
06224 d->m_view->ensureVisible(rect.right(), rect.bottom());
06225 d->m_view->ensureVisible(rect.left(), rect.top());
06226 }
06227
06228 DOM::Node KHTMLPart::activeNode() const
06229 {
06230 return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
06231 }
06232
06233 DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code, QString name )
06234 {
06235 KJSProxy *proxy = jScript();
06236
06237 if (!proxy)
06238 return 0;
06239
06240 return proxy->createHTMLEventHandler( m_url.url(), name, code );
06241 }
06242
06243 KHTMLPart *KHTMLPart::opener()
06244 {
06245 return d->m_opener;
06246 }
06247
06248 void KHTMLPart::setOpener(KHTMLPart *_opener)
06249 {
06250 d->m_opener = _opener;
06251 }
06252
06253 bool KHTMLPart::openedByJS()
06254 {
06255 return d->m_openedByJS;
06256 }
06257
06258 void KHTMLPart::setOpenedByJS(bool _openedByJS)
06259 {
06260 d->m_openedByJS = _openedByJS;
06261 }
06262
06263 void KHTMLPart::preloadStyleSheet(const QString &url, const QString &stylesheet)
06264 {
06265 khtml::Cache::preloadStyleSheet(url, stylesheet);
06266 }
06267
06268 void KHTMLPart::preloadScript(const QString &url, const QString &script)
06269 {
06270 khtml::Cache::preloadScript(url, script);
06271 }
06272
06273 QCString KHTMLPart::dcopObjectId() const
06274 {
06275 QCString id;
06276 id.sprintf("html-widget%d", d->m_dcop_counter);
06277 return id;
06278 }
06279
06280 long KHTMLPart::cacheId() const
06281 {
06282 return d->m_cacheId;
06283 }
06284
06285 bool KHTMLPart::restored() const
06286 {
06287 return d->m_restored;
06288 }
06289
06290 bool KHTMLPart::pluginPageQuestionAsked(const QString& mimetype) const
06291 {
06292
06293 KHTMLPart* parent = const_cast<KHTMLPart *>(this)->parentPart();
06294 if ( parent )
06295 return parent->pluginPageQuestionAsked(mimetype);
06296
06297 return d->m_pluginPageQuestionAsked.contains(mimetype);
06298 }
06299
06300 void KHTMLPart::setPluginPageQuestionAsked(const QString& mimetype)
06301 {
06302 if ( parentPart() )
06303 parentPart()->setPluginPageQuestionAsked(mimetype);
06304
06305 d->m_pluginPageQuestionAsked.append(mimetype);
06306 }
06307
06308 void KHTMLPart::slotAutomaticDetectionLanguage( int _id )
06309 {
06310 d->m_automaticDetection->setItemChecked( _id, true );
06311
06312 switch ( _id ) {
06313 case 0 :
06314 d->m_autoDetectLanguage = khtml::Decoder::SemiautomaticDetection;
06315 break;
06316 case 1 :
06317 d->m_autoDetectLanguage = khtml::Decoder::Arabic;
06318 break;
06319 case 2 :
06320 d->m_autoDetectLanguage = khtml::Decoder::Baltic;
06321 break;
06322 case 3 :
06323 d->m_autoDetectLanguage = khtml::Decoder::CentralEuropean;
06324 break;
06325 case 4 :
06326 d->m_autoDetectLanguage = khtml::Decoder::Chinese;
06327 break;
06328 case 5 :
06329 d->m_autoDetectLanguage = khtml::Decoder::Greek;
06330 break;
06331 case 6 :
06332 d->m_autoDetectLanguage = khtml::Decoder::Hebrew;
06333 break;
06334 case 7 :
06335 d->m_autoDetectLanguage = khtml::Decoder::Japanese;
06336 break;
06337 case 8 :
06338 d->m_autoDetectLanguage = khtml::Decoder::Korean;
06339 break;
06340 case 9 :
06341 d->m_autoDetectLanguage = khtml::Decoder::Russian;
06342 break;
06343 case 10 :
06344 d->m_autoDetectLanguage = khtml::Decoder::Thai;
06345 break;
06346 case 11 :
06347 d->m_autoDetectLanguage = khtml::Decoder::Turkish;
06348 break;
06349 case 12 :
06350 d->m_autoDetectLanguage = khtml::Decoder::Ukrainian;
06351 break;
06352 case 13 :
06353 d->m_autoDetectLanguage = khtml::Decoder::Unicode;
06354 break;
06355 case 14 :
06356 d->m_autoDetectLanguage = khtml::Decoder::WesternEuropean;
06357 break;
06358 default :
06359 d->m_autoDetectLanguage = khtml::Decoder::SemiautomaticDetection;
06360 break;
06361 }
06362
06363 for ( int i = 0; i <= 14; ++i ) {
06364 if ( i != _id )
06365 d->m_automaticDetection->setItemChecked( i, false );
06366 }
06367
06368 d->m_paSetEncoding->popupMenu()->setItemChecked( 0, true );
06369
06370 setEncoding( QString::null, false );
06371
06372 if( d->m_manualDetection )
06373 d->m_manualDetection->setCurrentItem( -1 );
06374 d->m_paSetEncoding->popupMenu()->setItemChecked( d->m_paSetEncoding->popupMenu()->idAt( 2 ), false );
06375 }
06376
06377 khtml::Decoder *KHTMLPart::createDecoder()
06378 {
06379 khtml::Decoder *dec = new khtml::Decoder();
06380 if( !d->m_encoding.isNull() )
06381 dec->setEncoding( d->m_encoding.latin1(), true );
06382 else
06383 dec->setEncoding( settings()->encoding().latin1(), d->m_haveEncoding );
06384
06385 dec->setAutoDetectLanguage( d->m_autoDetectLanguage );
06386 return dec;
06387 }
06388
06389 void KHTMLPart::emitCaretPositionChanged(const DOM::Node &node, long offset) {
06390 emit caretPositionChanged(node, offset);
06391 }
06392
06393 void KHTMLPart::restoreScrollPosition()
06394 {
06395 KParts::URLArgs args = d->m_extension->urlArgs();
06396 if (!args.reload) {
06397 disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition()));
06398 return;
06399 }
06400
06401
06402
06403
06404
06405 if (d->m_view->contentsHeight() - d->m_view->visibleHeight() >= args.yOffset
06406 || d->m_bComplete) {
06407 d->m_view->setContentsPos(args.xOffset, args.yOffset);
06408 disconnect(d->m_view, SIGNAL(finishedLayout()), this, SLOT(restoreScrollPosition()));
06409 }
06410 }
06411
06412 KWallet::Wallet* KHTMLPart::wallet()
06413 {
06414
06415
06416
06417
06418
06419 KHTMLPart* p;
06420
06421 for (p = parentPart(); p && p->parentPart(); p = p->parentPart())
06422 ;
06423
06424 if (p)
06425 return p->wallet();
06426
06427 if (!d->m_wallet && !d->m_bWalletOpened) {
06428 d->m_wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), widget() ? widget()->topLevelWidget()->winId() : 0);
06429 d->m_bWalletOpened = true;
06430 if (d->m_wallet) {
06431 connect(d->m_wallet, SIGNAL(walletClosed()), SLOT(slotWalletClosed()));
06432 d->m_statusBarWalletLabel = new KURLLabel(d->m_statusBarExtension->statusBar());
06433 d->m_statusBarWalletLabel->setFixedHeight(instance()->iconLoader()->currentSize(KIcon::Small));
06434 d->m_statusBarWalletLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
06435 d->m_statusBarWalletLabel->setUseCursor(false);
06436 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0, false);
06437 QToolTip::add(d->m_statusBarWalletLabel, i18n("The wallet '%1' is open and being used for form data and passwords.").arg(KWallet::Wallet::NetworkWallet()));
06438 d->m_statusBarWalletLabel->setPixmap(SmallIcon("wallet_open", instance()));
06439 connect(d->m_statusBarWalletLabel, SIGNAL(leftClickedURL()), SLOT(launchWalletManager()));
06440 connect(d->m_statusBarWalletLabel, SIGNAL(rightClickedURL()), SLOT(walletMenu()));
06441 } else if (d->m_statusBarWalletLabel) {
06442 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
06443 delete d->m_statusBarWalletLabel;
06444 d->m_statusBarWalletLabel = 0L;
06445 }
06446 }
06447 return d->m_wallet;
06448 }
06449
06450 void KHTMLPart::slotWalletClosed()
06451 {
06452 if (d->m_wallet) {
06453 d->m_wallet->deleteLater();
06454 d->m_wallet = 0L;
06455 }
06456 d->m_bWalletOpened = false;
06457 if (d->m_statusBarWalletLabel) {
06458 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
06459 delete d->m_statusBarWalletLabel;
06460 d->m_statusBarWalletLabel = 0L;
06461 }
06462 }
06463
06464 void KHTMLPart::launchWalletManager()
06465 {
06466 if (!DCOPClient::mainClient()->isApplicationRegistered("kwalletmanager")) {
06467 KApplication::startServiceByDesktopName("kwalletmanager_show");
06468 } else {
06469 DCOPRef r("kwalletmanager", "kwalletmanager-mainwindow#1");
06470 r.send("show");
06471 r.send("raise");
06472 }
06473 }
06474
06475 void KHTMLPart::walletMenu()
06476 {
06477 KPopupMenu *m = new KPopupMenu(0L);
06478 m->insertItem(i18n("&Close Wallet"), this, SLOT(slotWalletClosed()));
06479 m->popup(QCursor::pos());
06480 }
06481
06482 void KHTMLPart::slotToggleCaretMode()
06483 {
06484 setCaretMode(d->m_paToggleCaretMode->isChecked());
06485 }
06486
06487 void KHTMLPart::setFormNotification(KHTMLPart::FormNotification fn) {
06488 d->m_formNotification = fn;
06489 }
06490
06491 KHTMLPart::FormNotification KHTMLPart::formNotification() const {
06492 return d->m_formNotification;
06493 }
06494
06495 KURL KHTMLPart::toplevelURL()
06496 {
06497 KHTMLPart* part = this;
06498 while (part->parentPart())
06499 part = part->parentPart();
06500
06501 if (!part)
06502 return KURL();
06503
06504 return part->url();
06505 }
06506
06507 bool KHTMLPart::isModified() const
06508 {
06509 if ( !d->m_doc )
06510 return false;
06511
06512 return d->m_doc->unsubmittedFormChanges();
06513 }
06514
06515 void KHTMLPart::setDebugScript( bool enable )
06516 {
06517 unplugActionList( "debugScriptList" );
06518 if ( enable ) {
06519 if (!d->m_paDebugScript) {
06520 d->m_paDebugScript = new KAction( i18n( "JavaScript &Debugger" ), 0, this, SLOT( slotDebugScript() ), actionCollection(), "debugScript" );
06521 }
06522 d->m_paDebugScript->setEnabled( d->m_jscript );
06523 QPtrList<KAction> lst;
06524 lst.append( d->m_paDebugScript );
06525 plugActionList( "debugScriptList", lst );
06526 }
06527 d->m_bJScriptDebugEnabled = enable;
06528 }
06529
06530 using namespace KParts;
06531 #include "khtml_part.moc"