31 #include "khtml_part.h"
33 #include "khtml_pagecache.h"
35 #include "dom/dom_string.h"
36 #include "dom/dom_element.h"
37 #include "dom/dom_exception.h"
38 #include "html/html_documentimpl.h"
39 #include "html/html_baseimpl.h"
40 #include "html/html_objectimpl.h"
41 #include "html/html_miscimpl.h"
42 #include "html/html_imageimpl.h"
43 #include "html/html_objectimpl.h"
44 #include "rendering/render_text.h"
45 #include "rendering/render_frames.h"
46 #include "rendering/render_layer.h"
47 #include "misc/htmlhashes.h"
48 #include "misc/loader.h"
49 #include "xml/dom2_eventsimpl.h"
50 #include "xml/dom2_rangeimpl.h"
51 #include "xml/xml_tokenizer.h"
52 #include "css/cssstyleselector.h"
53 #include "css/csshelper.h"
56 #include "khtmlview.h"
57 #include <kparts/partmanager.h>
58 #include "ecma/kjs_proxy.h"
59 #include "ecma/kjs_window.h"
60 #include "khtml_settings.h"
61 #include "kjserrordlg.h"
63 #include <kjs/function.h>
64 #include <kjs/interpreter.h>
66 #include "htmlpageinfo.h"
68 #include <sys/types.h>
74 #include <dcopclient.h>
76 #include <kstandarddirs.h>
77 #include <kstringhandler.h>
79 #include <kio/global.h>
80 #include <kio/netaccess.h>
81 #include <kprotocolmanager.h>
83 #include <kiconloader.h>
85 #include <kcharsets.h>
86 #include <kmessagebox.h>
87 #include <kstdaction.h>
88 #include <kfiledialog.h>
90 #include <kdatastream.h>
91 #include <ktempfile.h>
92 #include <kglobalsettings.h>
94 #include <kapplication.h>
95 #include <kparts/browserinterface.h>
96 #if !defined(QT_NO_DRAGANDDROP)
97 #include <kmultipledrag.h>
99 #include "../kutils/kfinddialog.h"
100 #include "../kutils/kfind.h"
102 #include <ksslcertchain.h>
103 #include <ksslinfodlg.h>
105 #include <kfileitem.h>
106 #include <kurifilter.h>
107 #include <kstatusbar.h>
108 #include <kurllabel.h>
110 #include <tqclipboard.h>
112 #include <tqtooltip.h>
113 #include <tqmetaobject.h>
114 #include <tqucomextra_p.h>
116 #include "khtmlpart_p.h"
117 #include "kpassivepopup.h"
118 #include "kpopupmenu.h"
119 #include "rendering/render_form.h"
122 #define HINT_UTF8 106
125 class PartStyleSheetLoader :
public CachedObjectClient
131 m_cachedSheet = dl->requestStyleSheet(url, TQString(),
"text/css",
134 m_cachedSheet->ref(
this );
136 virtual ~PartStyleSheetLoader()
138 if ( m_cachedSheet ) m_cachedSheet->deref(
this);
147 virtual void error(
int,
const TQString& ) {
150 TQGuardedPtr<KHTMLPart> m_part;
151 khtml::CachedCSSStyleSheet *m_cachedSheet;
155 void khtml::ChildFrame::liveConnectEvent(
const unsigned long,
const TQString & event,
const KParts::LiveConnectExtension::ArgList & args)
157 if (!m_part || !m_frame || !m_liveconnect)
162 script.sprintf(
"%s(", event.latin1());
164 KParts::LiveConnectExtension::ArgList::const_iterator i = args.begin();
165 const KParts::LiveConnectExtension::ArgList::const_iterator argsBegin = i;
166 const KParts::LiveConnectExtension::ArgList::const_iterator argsEnd = args.end();
168 for ( ; i != argsEnd; ++i) {
171 if ((*i).first == KParts::LiveConnectExtension::TypeString) {
173 script += TQString((*i).second).replace(
'\\',
"\\\\").replace(
'"',
"\\\"");
176 script += (*i).second;
179 kdDebug(6050) <<
"khtml::ChildFrame::liveConnectEvent " << script <<
endl;
189 m_jscript->evaluate(TQString(), 1, script, 0L, &cmp);
194 KHTMLFrameList::Iterator KHTMLFrameList::find(
const TQString &name )
196 Iterator it = begin();
197 const Iterator e =
end();
200 if ( (*it)->m_name==name )
206 KHTMLPart::KHTMLPart( TQWidget *parentWidget,
const char *widgetname, TQObject *parent,
const char *name, GUIProfile prof )
210 KHTMLFactory::registerPart(
this );
211 setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !
parentPart() );
214 init(
new KHTMLView(
this, parentWidget, widgetname ), prof );
221 KHTMLFactory::registerPart(
this );
222 setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !
parentPart() );
229 void KHTMLPart::init(
KHTMLView *view, GUIProfile prof )
231 if ( prof == DefaultGUI )
232 setXMLFile(
"khtml.rc" );
233 else if ( prof == BrowserViewGUI )
234 setXMLFile(
"khtml_browser.rc" );
236 d =
new KHTMLPartPrivate(parent());
241 d->m_guiProfile = prof;
243 d->m_hostExtension =
new KHTMLPartBrowserHostExtension(
this );
245 d->m_statusBarIconLabel = 0L;
246 d->m_statusBarPopupLabel = 0L;
247 d->m_openableSuppressedPopups = 0;
249 d->m_bSecurityInQuestion =
false;
250 d->m_paLoadImages = 0;
251 d->m_paDebugScript = 0;
252 d->m_bMousePressed =
false;
253 d->m_bRightMousePressed =
false;
254 d->m_bCleared =
false;
255 d->m_paViewDocument =
new KAction( i18n(
"View Do&cument Source" ), CTRL + Key_U,
this, TQT_SLOT( slotViewDocumentSource() ), actionCollection(),
"viewDocumentSource" );
256 d->m_paViewFrame =
new KAction( i18n(
"View Frame Source" ), 0,
this, TQT_SLOT( slotViewFrameSource() ), actionCollection(),
"viewFrameSource" );
257 d->m_paViewInfo =
new KAction( i18n(
"View Document Information" ), CTRL+Key_I,
this, TQT_SLOT( slotViewPageInfo() ), actionCollection(),
"viewPageInfo" );
258 d->m_paSaveBackground =
new KAction( i18n(
"Save &Background Image As..." ), 0,
this, TQT_SLOT( slotSaveBackground() ), actionCollection(),
"saveBackground" );
259 d->m_paSaveDocument =
KStdAction::saveAs(
this, TQT_SLOT( slotSaveDocument() ), actionCollection(),
"saveDocument" );
261 d->m_paSaveDocument->setShortcut(
KShortcut() );
262 d->m_paSaveFrame =
new KAction( i18n(
"Save &Frame As..." ), 0,
this, TQT_SLOT( slotSaveFrame() ), actionCollection(),
"saveFrame" );
263 d->m_paSecurity =
new KAction( i18n(
"Security..." ),
"decrypted", 0,
this, TQT_SLOT( slotSecurity() ), actionCollection(),
"security" );
264 d->m_paSecurity->setWhatsThis( i18n(
"Security Settings<p>"
265 "Shows the certificate of the displayed page. Only "
266 "pages that have been transmitted using a secure, encrypted connection have a "
268 "Hint: If the image shows a closed lock, the page has been transmitted over a "
269 "secure connection.") );
270 d->m_paDebugRenderTree =
new KAction( i18n(
"Print Rendering Tree to STDOUT" ), ALT + CTRL + SHIFT + Key_A,
this, TQT_SLOT( slotDebugRenderTree() ), actionCollection(),
"debugRenderTree" );
271 d->m_paDebugDOMTree =
new KAction( i18n(
"Print DOM Tree to STDOUT" ), ALT + CTRL + SHIFT + Key_D,
this, TQT_SLOT( slotDebugDOMTree() ), actionCollection(),
"debugDOMTree" );
272 d->m_paStopAnimations =
new KAction( i18n(
"Stop Animated Images" ), 0,
this, TQT_SLOT( slotStopAnimations() ), actionCollection(),
"stopAnimations" );
274 d->m_paSetEncoding =
new KActionMenu( i18n(
"Set &Encoding" ),
"charset", actionCollection(),
"setEncoding" );
275 d->m_paSetEncoding->setDelayed(
false );
277 d->m_automaticDetection =
new KPopupMenu( 0L );
279 d->m_automaticDetection->insertItem( i18n(
"Semi-Automatic" ), 0 );
280 d->m_automaticDetection->insertItem( i18n(
"Arabic" ), 1 );
281 d->m_automaticDetection->insertItem( i18n(
"Baltic" ), 2 );
282 d->m_automaticDetection->insertItem( i18n(
"Central European" ), 3 );
284 d->m_automaticDetection->insertItem( i18n(
"Greek" ), 5 );
285 d->m_automaticDetection->insertItem( i18n(
"Hebrew" ), 6 );
286 d->m_automaticDetection->insertItem( i18n(
"Japanese" ), 7 );
288 d->m_automaticDetection->insertItem( i18n(
"Russian" ), 9 );
290 d->m_automaticDetection->insertItem( i18n(
"Turkish" ), 11 );
291 d->m_automaticDetection->insertItem( i18n(
"Ukrainian" ), 12 );
293 d->m_automaticDetection->insertItem( i18n(
"Western European" ), 14 );
295 connect( d->m_automaticDetection, TQT_SIGNAL( activated(
int ) ),
this, TQT_SLOT( slotAutomaticDetectionLanguage(
int ) ) );
297 d->m_paSetEncoding->popupMenu()->insertItem( i18n(
"Automatic Detection" ), d->m_automaticDetection, 0 );
299 d->m_paSetEncoding->insert(
new KActionSeparator( actionCollection() ) );
302 d->m_manualDetection =
new KSelectAction( i18n(
"short for Manual Detection",
"Manual" ), 0,
this, TQT_SLOT( slotSetEncoding() ), actionCollection(),
"manualDetection" );
304 d->m_manualDetection->setItems( encodings );
305 d->m_manualDetection->setCurrentItem( -1 );
306 d->m_paSetEncoding->insert( d->m_manualDetection );
310 if ( config->
hasGroup(
"HTML Settings" ) ) {
311 config->
setGroup(
"HTML Settings" );
312 khtml::Decoder::AutoDetectLanguage language;
313 TQCString name = TQTextCodec::codecForLocale()->name();
316 if ( name ==
"cp1256" || name ==
"iso-8859-6" ) {
317 language = khtml::Decoder::Arabic;
319 else if ( name ==
"cp1257" || name ==
"iso-8859-13" || name ==
"iso-8859-4" ) {
320 language = khtml::Decoder::Baltic;
322 else if ( name ==
"cp1250" || name ==
"ibm852" || name ==
"iso-8859-2" || name ==
"iso-8859-3" ) {
323 language = khtml::Decoder::CentralEuropean;
325 else if ( name ==
"cp1251" || name ==
"koi8-r" || name ==
"iso-8859-5" ) {
326 language = khtml::Decoder::Russian;
328 else if ( name ==
"koi8-u" ) {
329 language = khtml::Decoder::Ukrainian;
331 else if ( name ==
"cp1253" || name ==
"iso-8859-7" ) {
332 language = khtml::Decoder::Greek;
334 else if ( name ==
"cp1255" || name ==
"iso-8859-8" || name ==
"iso-8859-8-i" ) {
335 language = khtml::Decoder::Hebrew;
337 else if ( name ==
"jis7" || name ==
"eucjp" || name ==
"sjis" ) {
338 language = khtml::Decoder::Japanese;
340 else if ( name ==
"cp1254" || name ==
"iso-8859-9" ) {
341 language = khtml::Decoder::Turkish;
343 else if ( name ==
"cp1252" || name ==
"iso-8859-1" || name ==
"iso-8859-15" ) {
344 language = khtml::Decoder::WesternEuropean;
347 language = khtml::Decoder::SemiautomaticDetection;
349 int _id = config->
readNumEntry(
"AutomaticDetectionLanguage", language );
350 d->m_automaticDetection->setItemChecked( _id,
true );
351 d->m_paSetEncoding->popupMenu()->setItemChecked( 0,
true );
353 d->m_autoDetectLanguage =
static_cast< khtml::Decoder::AutoDetectLanguage
>( _id );
357 d->m_paUseStylesheet =
new KSelectAction( i18n(
"Use S&tylesheet"), 0,
this, TQT_SLOT( slotUseStylesheet() ), actionCollection(),
"useStylesheet" );
359 if ( prof == BrowserViewGUI ) {
360 d->m_paIncZoomFactor =
new KHTMLZoomFactorAction(
this,
true, i18n(
361 "Enlarge Font" ),
"viewmag+",
"CTRL++;CTRL+=",
this,
362 TQT_SLOT( slotIncZoomFast() ), actionCollection(),
"incFontSizes" );
363 d->m_paIncZoomFactor->setWhatsThis( i18n(
"Enlarge Font<p>"
364 "Make the font in this window bigger. "
365 "Click and hold down the mouse button for a menu with all available font sizes." ) );
366 d->m_paDecZoomFactor =
new KHTMLZoomFactorAction(
this,
false, i18n(
367 "Shrink Font" ),
"viewmag-", CTRL + Key_Minus,
this,
368 TQT_SLOT( slotDecZoomFast() ), actionCollection(),
"decFontSizes" );
369 d->m_paDecZoomFactor->setWhatsThis( i18n(
"Shrink Font<p>"
370 "Make the font in this window smaller. "
371 "Click and hold down the mouse button for a menu with all available font sizes." ) );
374 d->m_paFind =
KStdAction::find(
this, TQT_SLOT( slotFind() ), actionCollection(),
"find" );
375 d->m_paFind->setWhatsThis( i18n(
"Find text<p>"
376 "Shows a dialog that allows you to find text on the displayed page." ) );
378 d->m_paFindNext =
KStdAction::findNext(
this, TQT_SLOT( slotFindNext() ), actionCollection(),
"findNext" );
379 d->m_paFindNext->setWhatsThis( i18n(
"Find next<p>"
380 "Find the next occurrence of the text that you "
381 "have found using the <b>Find Text</b> function" ) );
383 d->m_paFindPrev =
KStdAction::findPrev(
this, TQT_SLOT( slotFindPrev() ), actionCollection(),
"findPrevious" );
384 d->m_paFindPrev->setWhatsThis( i18n(
"Find previous<p>"
385 "Find the previous occurrence of the text that you "
386 "have found using the <b>Find Text</b> function" ) );
388 d->m_paFindAheadText =
new KAction( i18n(
"Find Text as You Type"),
KShortcut(
'/' ),
this, TQT_SLOT( slotFindAheadText()),
389 actionCollection(),
"findAheadText");
390 d->m_paFindAheadLinks =
new KAction( i18n(
"Find Links as You Type"),
KShortcut(
'\'' ),
this, TQT_SLOT( slotFindAheadLink()),
391 actionCollection(),
"findAheadLink");
392 d->m_paFindAheadText->setEnabled(
false );
393 d->m_paFindAheadLinks->setEnabled(
false );
398 d->m_paFindNext->setShortcut(
KShortcut() );
399 d->m_paFindPrev->setShortcut(
KShortcut() );
400 d->m_paFindAheadText->setShortcut(
KShortcut());
401 d->m_paFindAheadLinks->setShortcut(
KShortcut());
404 d->m_paPrintFrame =
new KAction( i18n(
"Print Frame..." ),
"frameprint", 0,
this, TQT_SLOT( slotPrintFrame() ), actionCollection(),
"printFrame" );
405 d->m_paPrintFrame->setWhatsThis( i18n(
"Print Frame<p>"
406 "Some pages have several frames. To print only a single frame, click "
407 "on it and then use this function." ) );
409 d->m_paSelectAll =
KStdAction::selectAll(
this, TQT_SLOT( slotSelectAll() ), actionCollection(),
"selectAll" );
411 d->m_paSelectAll->setShortcut(
KShortcut() );
413 d->m_paToggleCaretMode =
new KToggleAction(i18n(
"Toggle Caret Mode"),
414 Key_F7,
this, TQT_SLOT(slotToggleCaretMode()),
415 actionCollection(),
"caretMode");
418 d->m_paToggleCaretMode->setShortcut(
KShortcut());
421 d->m_bOpenMiddleClick = d->m_settings->isOpenMiddleClickEnabled();
422 d->m_bBackRightClick = d->m_settings->isBackRightClickEnabled();
423 d->m_bJScriptEnabled = d->m_settings->isJavaScriptEnabled();
424 setDebugScript( d->m_settings->isJavaScriptDebugEnabled() );
425 d->m_bJavaEnabled = d->m_settings->isJavaEnabled();
426 d->m_bPluginsEnabled = d->m_settings->isPluginsEnabled();
429 d->m_metaRefreshEnabled = d->m_settings->isAutoDelayedActionsEnabled ();
431 connect( view, TQT_SIGNAL( zoomView(
int ) ), TQT_SLOT( slotZoomView(
int ) ) );
433 connect(
this, TQT_SIGNAL(
completed() ),
434 this, TQT_SLOT( updateActions() ) );
435 connect(
this, TQT_SIGNAL(
completed(
bool ) ),
436 this, TQT_SLOT( updateActions() ) );
437 connect(
this, TQT_SIGNAL(
started( KIO::Job * ) ),
438 this, TQT_SLOT( updateActions() ) );
440 d->m_popupMenuXML = KXMLGUIFactory::readConfigFile(
locate(
"data",
"khtml/khtml_popupmenu.rc", KHTMLFactory::instance() ) );
442 connect( khtml::Cache::loader(), TQT_SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
443 this, TQT_SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
444 connect( khtml::Cache::loader(), TQT_SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
445 this, TQT_SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
446 connect( khtml::Cache::loader(), TQT_SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
447 this, TQT_SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
449 connect ( &d->m_progressUpdateTimer, TQT_SIGNAL( timeout() ),
this, TQT_SLOT( slotProgressUpdate() ) );
453 connect( &d->m_redirectionTimer, TQT_SIGNAL( timeout() ),
454 this, TQT_SLOT( slotRedirect() ) );
473 config->
setGroup(
"HTML Settings" );
474 config->
writeEntry(
"AutomaticDetectionLanguage", d->m_autoDetectLanguage );
476 delete d->m_automaticDetection;
477 delete d->m_manualDetection;
481 removeJSErrorExtension();
482 delete d->m_statusBarPopupLabel;
489 d->m_manager->setActivePart( 0 );
494 d->m_redirectionTimer.stop();
499 disconnect( khtml::Cache::loader(), TQT_SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
500 this, TQT_SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
501 disconnect( khtml::Cache::loader(), TQT_SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
502 this, TQT_SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
503 disconnect( khtml::Cache::loader(), TQT_SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
504 this, TQT_SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
511 d->m_view->viewport()->hide();
512 d->m_view->m_part = 0;
523 KHTMLFactory::deregisterPart(
this );
526 bool KHTMLPart::restoreURL(
const KURL &url )
530 d->m_redirectionTimer.stop();
542 d->m_bComplete =
false;
543 d->m_bLoadEventEmitted =
false;
544 d->m_workingURL =
url;
547 d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.
host());
548 setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
549 d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.
host());
550 d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.
host());
554 d->m_restoreScrollPosition =
true;
555 disconnect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
556 connect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
568 kdDebug( 6050 ) <<
"KHTMLPart(" <<
this <<
")::openURL " << url.
url() <<
endl;
570 d->m_redirectionTimer.stop();
578 if( d->m_bJScriptEnabled )
579 d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = TQString();
589 if ( urls.count() > 1 ) {
590 KURL mainURL = urls.first();
591 int error = mainURL.
queryItem(
"error" ).toInt();
593 if ( error == 0 ) error = KIO::ERR_UNKNOWN;
594 TQString errorText = mainURL.
queryItem(
"errText", HINT_UTF8 );
598 emit d->m_extension->setLocationBarURL( d->m_workingURL.prettyURL() );
599 htmlError( error, errorText, d->m_workingURL );
606 TQString userAgent = KProtocolManager::userAgentForHost(host);
607 if (userAgent != KProtocolManager::userAgentForHost(TQString())) {
608 if (!d->m_statusBarUALabel) {
609 d->m_statusBarUALabel =
new KURLLabel(d->m_statusBarExtension->statusBar());
610 d->m_statusBarUALabel->setFixedHeight(instance()->iconLoader()->currentSize(
KIcon::Small));
611 d->m_statusBarUALabel->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
612 d->m_statusBarUALabel->setUseCursor(
false);
613 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarUALabel, 0,
false);
614 d->m_statusBarUALabel->setPixmap(SmallIcon(
"agent", instance()));
616 TQToolTip::remove(d->m_statusBarUALabel);
618 TQToolTip::add(d->m_statusBarUALabel, i18n(
"The fake user-agent '%1' is in use.").arg(userAgent));
619 }
else if (d->m_statusBarUALabel) {
620 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarUALabel);
621 delete d->m_statusBarUALabel;
622 d->m_statusBarUALabel = 0L;
636 bool isFrameSet =
false;
637 if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
638 HTMLDocumentImpl* htmlDoc =
static_cast<HTMLDocumentImpl*
>(d->m_doc);
639 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
642 if ( url.
hasRef() && !isFrameSet )
644 bool noReloadForced = !args.
reload && !args.redirectedRequest() && !args.doPost();
645 if (noReloadForced && urlcmp( url.
url(),
m_url.
url(),
true, true ))
647 kdDebug( 6050 ) <<
"KHTMLPart::openURL, jumping to anchor. m_url = " << url.
url() <<
endl;
654 d->m_bComplete =
true;
656 d->m_doc->setParsing(
false);
667 args.xOffset = d->m_view->contentsX();
668 args.yOffset = d->m_view->contentsY();
669 d->m_extension->setURLArgs(args);
675 d->m_restoreScrollPosition = d->m_restored;
676 disconnect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
677 connect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
688 d->m_workingURL =
m_url;
690 args.metaData().insert(
"main_frame_request",
parentPart() == 0 ?
"TRUE" :
"FALSE" );
691 args.metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
692 args.metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
693 args.metaData().insert(
"PropagateHttpHeader",
"true");
694 args.metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE" :
"FALSE" );
695 args.metaData().insert(
"ssl_activate_warnings",
"TRUE" );
700 args.metaData().insert(
"referrer", d->m_pageReferrer);
701 d->m_cachePolicy = KIO::CC_Cache;
703 else if (args.reload)
704 d->m_cachePolicy = KIO::CC_Reload;
706 d->m_cachePolicy = KProtocolManager::cacheControl();
708 if ( args.doPost() && (
m_url.
protocol().startsWith(
"http")) )
710 d->m_job = KIO::http_post(
m_url, args.postData,
false );
711 d->m_job->addMetaData(
"content-type", args.contentType() );
715 d->m_job = KIO::get(
m_url,
false,
false );
716 d->m_job->addMetaData(
"cache", KIO::getCacheControlString(d->m_cachePolicy));
720 d->m_job->setWindow(
widget()->topLevelWidget());
721 d->m_job->addMetaData(args.metaData());
723 connect( d->m_job, TQT_SIGNAL( result( KIO::Job* ) ),
724 TQT_SLOT( slotFinished( KIO::Job* ) ) );
725 connect( d->m_job, TQT_SIGNAL( data( KIO::Job*,
const TQByteArray& ) ),
726 TQT_SLOT( slotData( KIO::Job*,
const TQByteArray& ) ) );
727 connect ( d->m_job, TQT_SIGNAL( infoMessage( KIO::Job*,
const TQString& ) ),
728 TQT_SLOT( slotInfoMessage(KIO::Job*,
const TQString& ) ) );
729 connect( d->m_job, TQT_SIGNAL(redirection(KIO::Job*,
const KURL& ) ),
730 TQT_SLOT( slotRedirection(KIO::Job*,
const KURL&) ) );
732 d->m_bComplete =
false;
733 d->m_bLoadEventEmitted =
false;
736 if( d->m_bJScriptEnabled )
737 d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = TQString();
740 d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.
host());
741 setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
742 d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.
host());
743 d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.
host());
746 connect( d->m_job, TQT_SIGNAL( speed( KIO::Job*,
unsigned long ) ),
747 this, TQT_SLOT( slotJobSpeed( KIO::Job*,
unsigned long ) ) );
749 connect( d->m_job, TQT_SIGNAL( percent( KIO::Job*,
unsigned long ) ),
750 this, TQT_SLOT( slotJobPercent( KIO::Job*,
unsigned long ) ) );
752 connect( d->m_job, TQT_SIGNAL( result( KIO::Job* ) ),
753 this, TQT_SLOT( slotJobDone( KIO::Job* ) ) );
759 if ( args.reload && !settings()->userStyleSheet().isEmpty() ) {
760 KURL url( settings()->userStyleSheet() );
761 KIO::StatJob *job = KIO::stat( url,
false );
762 connect( job, TQT_SIGNAL( result( KIO::Job * ) ),
763 this, TQT_SLOT( slotUserSheetStatDone( KIO::Job * ) ) );
779 if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
780 HTMLDocumentImpl* hdoc =
static_cast<HTMLDocumentImpl*
>( d->m_doc );
782 if ( hdoc->body() && d->m_bLoadEventEmitted ) {
783 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT,
false,
false );
785 d->m_doc->updateRendering();
786 d->m_bLoadEventEmitted =
false;
790 d->m_bComplete =
true;
791 d->m_bLoadEventEmitted =
true;
792 d->m_cachePolicy = KProtocolManager::cacheControl();
794 disconnect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
797 if ( d->m_doc && d->m_doc->parsing() )
799 kdDebug( 6050 ) <<
" was still parsing... calling end " <<
endl;
800 slotFinishedParsing();
801 d->m_doc->setParsing(
false);
804 if ( !d->m_workingURL.isEmpty() )
811 d->m_workingURL =
KURL();
813 if ( d->m_doc && d->m_doc->docLoader() )
814 khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
818 ConstFrameIt it = d->m_frames.begin();
819 const ConstFrameIt
end = d->m_frames.end();
820 for (; it !=
end; ++it )
823 (*it)->m_run->abort();
824 if ( !( *it )->m_part.isNull() )
825 ( *it )->m_part->closeURL();
830 ConstFrameIt it = d->m_objects.begin();
831 const ConstFrameIt
end = d->m_objects.end();
832 for (; it !=
end; ++it)
834 if ( !( *it )->m_part.isNull() )
835 ( *it )->m_part->closeURL();
839 if ( d && d->m_redirectionTimer.isActive() )
840 d->m_redirectionTimer.stop();
847 d->m_view->closeChildDialogs();
854 if (d->m_doc && d->m_doc->isHTMLDocument())
855 return static_cast<HTMLDocumentImpl*>(d->m_doc);
857 return static_cast<HTMLDocumentImpl*
>(0);
870 TQByteArray sourceArray;
871 TQDataStream dataStream( sourceArray, IO_WriteOnly );
873 TQTextStream stream( sourceArray, IO_ReadOnly );
874 stream.setCodec( TQTextCodec::codecForName(
encoding().latin1() ) );
875 sourceStr = stream.read();
879 if( KIO::NetAccess::download(
m_url, tmpFile, NULL ) )
882 if ( f.open( IO_ReadOnly ) )
884 TQTextStream stream( &f );
885 stream.setCodec( TQTextCodec::codecForName(
encoding().latin1() ) );
886 sourceStr = stream.read();
889 KIO::NetAccess::removeTempFile( tmpFile );
899 return d->m_extension;
904 return d->m_hostExtension;
914 d->m_statusMessagesEnabled = enable;
919 KJSProxy *proxy = jScript();
920 if (!proxy || proxy->paused())
923 return proxy->interpreter();
928 return d->m_statusMessagesEnabled;
933 if ( !enable &&
jScriptEnabled() && d->m_frame && d->m_frame->m_jscript ) {
934 d->m_frame->m_jscript->clear();
936 d->m_bJScriptForce = enable;
937 d->m_bJScriptOverride =
true;
944 if ( d->m_bJScriptOverride )
945 return d->m_bJScriptForce;
946 return d->m_bJScriptEnabled;
951 d->m_metaRefreshEnabled = enable;
956 return d->m_metaRefreshEnabled;
966 #define DIRECT_LINKAGE_TO_ECMA
968 #ifdef DIRECT_LINKAGE_TO_ECMA
969 extern "C" { KJSProxy *kjs_html_init(khtml::ChildFrame * childframe); }
972 static bool createJScript(khtml::ChildFrame *frame)
974 #ifndef DIRECT_LINKAGE_TO_ECMA
977 setJScriptEnabled(
false );
981 void *sym = lib->
symbol(
"kjs_html_init");
984 setJScriptEnabled(
false );
987 typedef KJSProxy* (*initFunction)(khtml::ChildFrame *);
988 initFunction initSym = (initFunction) sym;
989 frame->m_jscript = (*initSym)(d->m_frame);
990 frame->m_kjs_lib = lib;
992 frame->m_jscript = kjs_html_init(frame);
998 KJSProxy *KHTMLPart::jScript()
1002 if ( !d->m_frame ) {
1005 d->m_frame =
new khtml::ChildFrame;
1006 d->m_frame->m_part =
this;
1008 ConstFrameIt it = p->d->m_frames.begin();
1009 const ConstFrameIt
end = p->d->m_frames.end();
1010 for (; it !=
end; ++it)
1011 if ((*it)->m_part.operator->() ==
this) {
1019 if ( !d->m_frame->m_jscript )
1020 if (!createJScript(d->m_frame))
1022 if (d->m_bJScriptDebugEnabled)
1023 d->m_frame->m_jscript->setDebugEnabled(
true);
1025 return d->m_frame->m_jscript;
1028 TQVariant KHTMLPart::crossFrameExecuteScript(
const TQString& target,
const TQString& script)
1032 TQString trg = target.lower();
1034 if (target ==
"_top") {
1038 else if (target ==
"_parent") {
1042 else if (target ==
"_self" || target ==
"_blank") {
1052 if (destpart ==
this)
1056 if (destpart->checkFrameAccess(
this))
1066 KJSErrorDlg *KHTMLPart::jsErrorExtension() {
1067 if (!d->m_settings->jsErrorsEnabled()) {
1075 if (!d->m_statusBarJSErrorLabel) {
1076 d->m_statusBarJSErrorLabel =
new KURLLabel(d->m_statusBarExtension->statusBar());
1077 d->m_statusBarJSErrorLabel->setFixedHeight(
instance()->iconLoader()->currentSize(
KIcon::Small));
1078 d->m_statusBarJSErrorLabel->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
1079 d->m_statusBarJSErrorLabel->setUseCursor(
false);
1080 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarJSErrorLabel, 0,
false);
1081 TQToolTip::add(d->m_statusBarJSErrorLabel, i18n(
"This web page contains coding errors."));
1082 d->m_statusBarJSErrorLabel->setPixmap(SmallIcon(
"bug",
instance()));
1083 connect(d->m_statusBarJSErrorLabel, TQT_SIGNAL(leftClickedURL()), TQT_SLOT(launchJSErrorDialog()));
1084 connect(d->m_statusBarJSErrorLabel, TQT_SIGNAL(rightClickedURL()), TQT_SLOT(jsErrorDialogContextMenu()));
1087 d->m_jsedlg =
new KJSErrorDlg;
1090 d->m_jsedlg->_clear->setIconSet(SmallIconSet(
"locationbar_erase"));
1091 d->m_jsedlg->_close->setIconSet(SmallIconSet(
"fileclose"));
1097 void KHTMLPart::removeJSErrorExtension() {
1102 if (d->m_statusBarJSErrorLabel != 0) {
1103 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarJSErrorLabel );
1104 delete d->m_statusBarJSErrorLabel;
1105 d->m_statusBarJSErrorLabel = 0;
1111 void KHTMLPart::disableJSErrorExtension() {
1112 removeJSErrorExtension();
1117 d->m_settings->setJSErrorsEnabled(
false);
1118 DCOPClient::mainClient()->send(
"konqueror*",
"KonquerorIface",
"reparseConfiguration()", TQByteArray());
1121 void KHTMLPart::jsErrorDialogContextMenu() {
1123 m->insertItem(i18n(
"&Hide Errors"),
this, TQT_SLOT(removeJSErrorExtension()));
1124 m->insertItem(i18n(
"&Disable Error Reporting"),
this, TQT_SLOT(disableJSErrorExtension()));
1125 m->popup(TQCursor::pos());
1128 void KHTMLPart::launchJSErrorDialog() {
1129 KJSErrorDlg *dlg = jsErrorExtension();
1136 void KHTMLPart::launchJSConfigDialog() {
1138 args <<
"khtml_java_js";
1146 kdDebug(6070) <<
"executeScript: caller='" << name() <<
"' filename=" << filename <<
" baseLine=" << baseLine <<
endl;
1148 KJSProxy *proxy = jScript();
1150 if (!proxy || proxy->paused())
1153 KJS::Completion comp;
1155 TQVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
1160 if (comp.complType() == KJS::Throw && !comp.value().isNull()) {
1161 KJSErrorDlg *dlg = jsErrorExtension();
1163 KJS::UString msg = comp.value().toString(proxy->interpreter()->globalExec());
1164 dlg->addError(i18n(
"<b>Error</b>: %1: %2").arg(filename, msg.qstring()));
1169 if ( !d->m_redirectURL.isEmpty() && d->m_delayRedirect == -1 )
1171 kdDebug(6070) <<
"executeScript done, handling immediate redirection NOW" <<
endl;
1173 khtml::Tokenizer* t = d->m_doc->tokenizer();
1176 d->m_redirectionTimer.start( 0,
true );
1190 kdDebug(6070) <<
"KHTMLPart::executeScript caller='" << name() <<
"' node=" << n.
nodeName().string().latin1() <<
"(" << (n.
isNull() ? 0 : n.
nodeType()) <<
") " << endl;
1192 KJSProxy *proxy = jScript();
1194 if (!proxy || proxy->paused())
1196 ++(d->m_runningScripts);
1197 KJS::Completion comp;
1198 const TQVariant ret = proxy->evaluate( TQString(), 1, script, n, &comp );
1199 --(d->m_runningScripts);
1204 if (comp.complType() == KJS::Throw && !comp.value().isNull()) {
1205 KJSErrorDlg *dlg = jsErrorExtension();
1207 KJS::UString msg = comp.value().toString(proxy->interpreter()->globalExec());
1208 dlg->addError(i18n(
"<b>Error</b>: node %1: %2").arg(n.
nodeName().string()).arg(msg.qstring()));
1212 if (!d->m_runningScripts && d->m_doc && !d->m_doc->parsing() && d->m_submitForm )
1216 kdDebug(6070) <<
"KHTMLPart::executeScript - done" <<
endl;
1221 bool KHTMLPart::scheduleScript(
const DOM::Node &n,
const TQString& script)
1225 d->scheduledScript = script;
1226 d->scheduledScriptNode = n;
1231 TQVariant KHTMLPart::executeScheduledScript()
1233 if( d->scheduledScript.isEmpty() )
1238 TQVariant ret =
executeScript( d->scheduledScriptNode, d->scheduledScript );
1239 d->scheduledScript = TQString();
1247 d->m_bJavaForce = enable;
1248 d->m_bJavaOverride =
true;
1256 if( d->m_bJavaOverride )
1257 return d->m_bJavaForce;
1258 return d->m_bJavaEnabled;
1276 d->m_bPluginsForce = enable;
1277 d->m_bPluginsOverride =
true;
1284 if ( d->m_bPluginsOverride )
1285 return d->m_bPluginsForce;
1286 return d->m_bPluginsEnabled;
1289 static int s_DOMTreeIndentLevel = 0;
1291 void KHTMLPart::slotDebugDOMTree()
1293 if ( d->m_doc && d->m_doc->firstChild() )
1294 qDebug(
"%s", d->m_doc->firstChild()->toString().string().latin1());
1298 const int indentLevel = s_DOMTreeIndentLevel++;
1300 ConstFrameIt it = d->m_frames.begin();
1301 const ConstFrameIt end = d->m_frames.end();
1302 for (; it !=
end; ++it )
1303 if ( !( *it )->m_part.isNull() && (*it)->m_part->inherits(
"KHTMLPart" ) ) {
1305 kdDebug(6050) << TQString().leftJustify(s_DOMTreeIndentLevel*4,
' ') <<
"FRAME " << p->name() <<
" " <<
endl;
1306 static_cast<KHTMLPart*
>( p )->slotDebugDOMTree();
1308 s_DOMTreeIndentLevel = indentLevel;
1311 void KHTMLPart::slotDebugScript()
1314 jScript()->showDebugWindow();
1317 void KHTMLPart::slotDebugRenderTree()
1321 d->m_doc->renderer()->printTree();
1331 void KHTMLPart::slotStopAnimations()
1338 if ( d->m_doc && d->m_doc->docLoader()->autoloadImages() == enable )
1342 d->m_doc->docLoader()->setAutoloadImages( enable );
1344 unplugActionList(
"loadImages" );
1347 delete d->m_paLoadImages;
1348 d->m_paLoadImages = 0;
1350 else if ( !d->m_paLoadImages )
1351 d->m_paLoadImages =
new KAction( i18n(
"Display Images on Page" ),
"images_display", 0,
this, TQT_SLOT( slotLoadImages() ), actionCollection(),
"loadImages" );
1353 if ( d->m_paLoadImages ) {
1354 TQPtrList<KAction> lst;
1355 lst.append( d->m_paLoadImages );
1356 plugActionList(
"loadImages", lst );
1363 return d->m_doc->docLoader()->autoloadImages();
1368 void KHTMLPart::clear()
1370 if ( d->m_bCleared )
1373 d->m_bCleared =
true;
1375 d->m_bClearing =
true;
1378 ConstFrameIt it = d->m_frames.begin();
1379 const ConstFrameIt end = d->m_frames.end();
1380 for(; it !=
end; ++it )
1384 (*it)->m_run->abort();
1389 ConstFrameIt it = d->m_objects.begin();
1390 const ConstFrameIt end = d->m_objects.end();
1391 for(; it !=
end; ++it )
1395 (*it)->m_run->abort();
1406 if (d->m_doc->attached())
1411 if ( d->m_frame && d->m_frame->m_jscript )
1412 d->m_frame->m_jscript->clear();
1415 if (d->m_doc && d->m_doc->renderer() && d->m_doc->renderer()->layer())
1416 d->m_doc->renderer()->layer()->suspendMarquees();
1428 delete d->m_decoder;
1434 this, TQT_SLOT( slotActiveFrameChanged(
KParts::Part * ) ) );
1437 if (d->m_frames.count())
1439 KHTMLFrameList frames = d->m_frames;
1440 d->m_frames.clear();
1441 ConstFrameIt it = frames.begin();
1442 const ConstFrameIt end = frames.end();
1443 for(; it !=
end; ++it )
1445 if ( (*it)->m_part )
1453 d->m_suppressedPopupOriginParts.clear();
1455 if (d->m_objects.count())
1457 KHTMLFrameList objects = d->m_objects;
1458 d->m_objects.clear();
1459 ConstFrameIt oi = objects.begin();
1460 const ConstFrameIt oiEnd = objects.end();
1462 for (; oi != oiEnd; ++oi )
1469 this, TQT_SLOT( slotActiveFrameChanged(
KParts::Part * ) ) );
1472 d->m_delayRedirect = 0;
1473 d->m_redirectURL = TQString();
1474 d->m_redirectionTimer.stop();
1475 d->m_redirectLockHistory =
true;
1476 d->m_bClearing =
false;
1477 d->m_frameNameId = 1;
1478 d->m_bFirstData =
true;
1480 d->m_bMousePressed =
false;
1484 d->m_startOffset = 0;
1486 #ifndef QT_NO_CLIPBOARD
1487 connect( kapp->clipboard(), TQT_SIGNAL(
selectionChanged()), TQT_SLOT( slotClearSelection()));
1490 d->m_jobPercent = 0;
1492 if ( !d->m_haveEncoding )
1493 d->m_encoding = TQString();
1495 d->m_parsetime.restart();
1504 DOM::HTMLDocumentImpl *KHTMLPart::docImpl()
const
1506 if ( d && d->m_doc && d->m_doc->isHTMLDocument() )
1507 return static_cast<HTMLDocumentImpl*>(d->m_doc);
1511 DOM::DocumentImpl *KHTMLPart::xmlDocImpl()
const
1518 void KHTMLPart::slotInfoMessage(KIO::Job* kio_job,
const TQString& msg)
1520 assert(d->m_job == kio_job);
1523 setStatusBarText(msg, BarDefaultText);
1526 void KHTMLPart::setPageSecurity( PageSecurity sec )
1528 emit d->m_extension->setPageSecurity( sec );
1529 if ( sec != NotCrypted && !d->m_statusBarIconLabel && !
parentPart() ) {
1530 d->m_statusBarIconLabel =
new KURLLabel( d->m_statusBarExtension->statusBar() );
1531 d->m_statusBarIconLabel->setFixedHeight(
instance()->iconLoader()->currentSize(
KIcon::Small) );
1532 d->m_statusBarIconLabel->setSizePolicy(TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ));
1533 d->m_statusBarIconLabel->setUseCursor(
false );
1534 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarIconLabel, 0,
false );
1535 connect( d->m_statusBarIconLabel, TQT_SIGNAL( leftClickedURL() ), TQT_SLOT( slotSecurity() ) );
1536 }
else if (d->m_statusBarIconLabel) {
1537 TQToolTip::remove(d->m_statusBarIconLabel);
1540 if (d->m_statusBarIconLabel) {
1541 if (d->m_ssl_in_use)
1542 TQToolTip::add(d->m_statusBarIconLabel,
1543 i18n(
"Session is secured with %1 bit %2.").arg(d->m_ssl_cipher_used_bits).arg(d->m_ssl_cipher));
1544 else TQToolTip::add(d->m_statusBarIconLabel, i18n(
"Session is not secured."));
1550 iconName =
"decrypted";
1551 if ( d->m_statusBarIconLabel ) {
1552 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarIconLabel );
1553 delete d->m_statusBarIconLabel;
1554 d->m_statusBarIconLabel = 0L;
1558 iconName =
"encrypted";
1561 iconName =
"halfencrypted";
1564 d->m_paSecurity->setIcon( iconName );
1565 if ( d->m_statusBarIconLabel )
1566 d->m_statusBarIconLabel->setPixmap( SmallIcon( iconName,
instance() ) );
1569 void KHTMLPart::slotData( KIO::Job* kio_job,
const TQByteArray &data )
1571 assert ( d->m_job == kio_job );
1575 if ( !d->m_workingURL.isEmpty() )
1582 d->m_job->suspend();
1583 begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
1586 if (d->m_cachePolicy == KIO::CC_Refresh)
1587 d->m_doc->docLoader()->setCachePolicy(KIO::CC_Verify);
1589 d->m_doc->docLoader()->setCachePolicy(d->m_cachePolicy);
1591 d->m_workingURL =
KURL();
1596 d->m_httpHeaders = d->m_job->queryMetaData(
"HTTP-Headers");
1597 time_t cacheCreationDate = d->m_job->queryMetaData(
"cache-creation-date").toLong();
1598 d->m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
1600 d->m_pageServices = d->m_job->queryMetaData(
"PageServices");
1601 d->m_pageReferrer = d->m_job->queryMetaData(
"referrer");
1602 d->m_bSecurityInQuestion =
false;
1603 d->m_ssl_in_use = (d->m_job->queryMetaData(
"ssl_in_use") ==
"TRUE");
1607 if (p && p->d->m_ssl_in_use != d->m_ssl_in_use) {
1610 p->setPageSecurity( Mixed );
1611 p->d->m_bSecurityInQuestion =
true;
1615 setPageSecurity( d->m_ssl_in_use ? Encrypted : NotCrypted );
1618 d->m_ssl_parent_ip = d->m_job->queryMetaData(
"ssl_parent_ip");
1619 d->m_ssl_parent_cert = d->m_job->queryMetaData(
"ssl_parent_cert");
1620 d->m_ssl_peer_certificate = d->m_job->queryMetaData(
"ssl_peer_certificate");
1621 d->m_ssl_peer_chain = d->m_job->queryMetaData(
"ssl_peer_chain");
1622 d->m_ssl_peer_ip = d->m_job->queryMetaData(
"ssl_peer_ip");
1623 d->m_ssl_cipher = d->m_job->queryMetaData(
"ssl_cipher");
1624 d->m_ssl_cipher_desc = d->m_job->queryMetaData(
"ssl_cipher_desc");
1625 d->m_ssl_cipher_version = d->m_job->queryMetaData(
"ssl_cipher_version");
1626 d->m_ssl_cipher_used_bits = d->m_job->queryMetaData(
"ssl_cipher_used_bits");
1627 d->m_ssl_cipher_bits = d->m_job->queryMetaData(
"ssl_cipher_bits");
1628 d->m_ssl_cert_state = d->m_job->queryMetaData(
"ssl_cert_state");
1630 if (d->m_statusBarIconLabel) {
1631 TQToolTip::remove(d->m_statusBarIconLabel);
1632 if (d->m_ssl_in_use) {
1633 TQToolTip::add(d->m_statusBarIconLabel, i18n(
"Session is secured with %1 bit %2.").arg(d->m_ssl_cipher_used_bits).arg(d->m_ssl_cipher));
1635 TQToolTip::add(d->m_statusBarIconLabel, i18n(
"Session is not secured."));
1640 TQString qData = d->m_job->queryMetaData(
"charset");
1641 if ( !qData.isEmpty() && !d->m_haveEncoding )
1642 d->m_encoding = qData;
1646 qData = d->m_job->queryMetaData(
"http-refresh");
1647 if( !qData.isEmpty())
1648 d->m_doc->processHttpEquiv(
"refresh", qData);
1659 TQString language = d->m_job->queryMetaData(
"content-language");
1660 if (!language.isEmpty())
1661 d->m_doc->setContentLanguage(language);
1665 d->m_lastModified = d->m_job->queryMetaData(
"modified");
1667 d->m_lastModified = TQString();
1671 write( data.data(), data.size() );
1672 if (d->m_frame && d->m_frame->m_jscript)
1673 d->m_frame->m_jscript->dataReceived();
1676 void KHTMLPart::slotRestoreData(
const TQByteArray &data )
1679 if ( !d->m_workingURL.isEmpty() )
1681 long saveCacheId = d->m_cacheId;
1682 TQString savePageReferrer = d->m_pageReferrer;
1683 TQString saveEncoding = d->m_encoding;
1684 begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
1685 d->m_encoding = saveEncoding;
1686 d->m_pageReferrer = savePageReferrer;
1687 d->m_cacheId = saveCacheId;
1688 d->m_workingURL =
KURL();
1692 write( data.data(), data.size() );
1694 if (data.size() == 0)
1698 if (d->m_doc && d->m_doc->parsing())
1705 kdDebug(6050) <<
"KHTMLPart::showError d->m_bParsing=" << (d->m_doc && d->m_doc->parsing()) <<
" d->m_bComplete=" << d->m_bComplete
1706 <<
" d->m_bCleared=" << d->m_bCleared << endl;
1708 if (job->error() == KIO::ERR_NO_CONTENT)
1711 if ( (d->m_doc && d->m_doc->parsing()) || d->m_workingURL.isEmpty() )
1712 job->showErrorDialog( );
1715 htmlError( job->error(), job->errorText(), d->m_workingURL );
1722 kdDebug(6050) <<
"KHTMLPart::htmlError errorCode=" << errorCode <<
" text=" << text <<
endl;
1724 bool bJSFO = d->m_bJScriptForce;
1725 bool bJSOO = d->m_bJScriptOverride;
1726 d->m_bJScriptForce =
false;
1727 d->m_bJScriptOverride =
true;
1729 TQString errText = TQString::fromLatin1(
"<HTML dir=%1><HEAD><TITLE>" )
1730 .arg(TQApplication::reverseLayout() ?
"rtl" :
"ltr");
1731 errText += i18n(
"Error while loading %1" ).arg( reqUrl.
htmlURL() );
1732 errText += TQString::fromLatin1(
"</TITLE></HEAD><BODY><P>" );
1733 errText += i18n(
"An error occurred while loading <B>%1</B>:" ).arg( reqUrl.
htmlURL() );
1734 errText += TQString::fromLatin1(
"</P>" );
1735 errText += TQStyleSheet::convertFromPlainText( KIO::buildErrorString( errorCode, text ) );
1736 errText += TQString::fromLatin1(
"</BODY></HTML>" );
1740 d->m_bJScriptForce = bJSFO;
1741 d->m_bJScriptOverride = bJSOO;
1747 d->m_workingURL =
KURL();
1753 TQString errorName, techName, description;
1754 TQStringList causes, solutions;
1756 TQByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
1757 TQDataStream stream(raw, IO_ReadOnly);
1759 stream >> errorName >> techName >> description >> causes >> solutions;
1761 TQString
url, protocol, datetime;
1767 TQString doc = TQString::fromLatin1(
"<html><head><title>" );
1768 doc += i18n(
"Error: " );
1770 doc += TQString::fromLatin1(
" - %1</title></head><body><h1>" ).arg( url );
1771 doc += i18n(
"The requested operation could not be completed" );
1772 doc += TQString::fromLatin1(
"</h1><h2>" );
1774 doc += TQString::fromLatin1(
"</h2>" );
1775 if ( !techName.isNull() ) {
1776 doc += TQString::fromLatin1(
"<h2>" );
1777 doc += i18n(
"Technical Reason: " );
1779 doc += TQString::fromLatin1(
"</h2>" );
1781 doc += TQString::fromLatin1(
"<h3>" );
1782 doc += i18n(
"Details of the Request:" );
1783 doc += TQString::fromLatin1(
"</h3><ul><li>" );
1784 doc += i18n(
"URL: %1" ).arg( url );
1785 doc += TQString::fromLatin1(
"</li><li>" );
1786 if ( !protocol.isNull() ) {
1789 doc += TQString::fromLatin1(
"</li><li>" );
1791 doc += i18n(
"Date and Time: %1" ).arg( datetime );
1792 doc += TQString::fromLatin1(
"</li><li>" );
1793 doc += i18n(
"Additional Information: %1" ).arg( text );
1794 doc += TQString::fromLatin1(
"</li></ul><h3>" );
1795 doc += i18n(
"Description:" );
1796 doc += TQString::fromLatin1(
"</h3><p>" );
1798 doc += TQString::fromLatin1(
"</p>" );
1799 if ( causes.count() ) {
1800 doc += TQString::fromLatin1(
"<h3>" );
1801 doc += i18n(
"Possible Causes:" );
1802 doc += TQString::fromLatin1(
"</h3><ul><li>" );
1803 doc += causes.join(
"</li><li>" );
1804 doc += TQString::fromLatin1(
"</li></ul>" );
1806 if ( solutions.count() ) {
1807 doc += TQString::fromLatin1(
"<h3>" );
1808 doc += i18n(
"Possible Solutions:" );
1809 doc += TQString::fromLatin1(
"</h3><ul><li>" );
1810 doc += solutions.join(
"</li><li>" );
1811 doc += TQString::fromLatin1(
"</li></ul>" );
1813 doc += TQString::fromLatin1(
"</body></html>" );
1819 void KHTMLPart::slotFinished( KIO::Job * job )
1833 if (job->error() == KIO::ERR_IS_DIRECTORY)
1836 emit d->m_extension->openURLRequest( d->m_workingURL, args );
1840 emit
canceled( job->errorString() );
1848 KIO::TransferJob *tjob = ::tqqt_cast<KIO::TransferJob*>(job);
1849 if (tjob && tjob->isErrorPage()) {
1850 khtml::RenderPart *renderPart = d->m_frame ?
static_cast<khtml::RenderPart *
>(d->m_frame->m_frame) : 0;
1852 HTMLObjectElementImpl* elt =
static_cast<HTMLObjectElementImpl *
>(renderPart->element());
1855 elt->renderAlternative();
1858 if (d->m_bComplete)
return;
1864 if (d->m_frame && d->m_frame->m_jscript)
1865 d->m_frame->m_jscript->dataReceived();
1867 if ( d->m_doc && d->m_doc->docLoader()->expireDate() &&
m_url.
protocol().lower().startsWith(
"http"))
1868 KIO::http_update_cache(
m_url,
false, d->m_doc->docLoader()->expireDate());
1870 d->m_workingURL =
KURL();
1872 if ( d->m_doc && d->m_doc->parsing())
1880 removeJSErrorExtension();
1882 d->m_openableSuppressedPopups = 0;
1883 for ( TQValueListIterator<TQGuardedPtr<KHTMLPart> > i = d->m_suppressedPopupOriginParts.begin();
1884 i != d->m_suppressedPopupOriginParts.end(); ++i ) {
1887 KJS::Window *w = KJS::Window::retrieveWindow( part );
1889 w->forgetSuppressedWindows();
1895 d->m_bCleared =
false;
1897 d->m_bComplete =
false;
1898 d->m_bLoadEventEmitted =
false;
1901 TQString urlString = url.
url();
1902 KHTMLFactory::vLinks()->insert( urlString );
1904 if ( urlString != urlString2 ) {
1905 KHTMLFactory::vLinks()->insert( urlString2 );
1916 d->m_extension->setURLArgs( args );
1918 d->m_pageReferrer = TQString();
1921 d->m_referrer = ref.
protocol().startsWith(
"http") ? ref.
url() :
"";
1925 bool servedAsXHTML = args.
serviceType ==
"application/xhtml+xml";
1926 bool servedAsXML = KMimeType::mimeType(args.
serviceType)->is(
"text/xml" );
1928 if ( servedAsXML && !servedAsXHTML ) {
1929 d->m_doc = DOMImplementationImpl::instance()->createDocument( d->m_view );
1931 d->m_doc = DOMImplementationImpl::instance()->createHTMLDocument( d->m_view );
1933 static_cast<HTMLDocumentImpl *
>(d->m_doc)->setHTMLRequested( !servedAsXHTML );
1935 #ifndef KHTML_NO_CARET
1941 if (!d->m_doc->attached())
1942 d->m_doc->attach( );
1943 d->m_doc->setBaseURL(
KURL() );
1944 d->m_doc->docLoader()->setShowAnimations( KHTMLFactory::defaultHTMLSettings()->showAnimations() );
1947 d->m_paUseStylesheet->setItems(TQStringList());
1948 d->m_paUseStylesheet->setEnabled(
false );
1951 TQString userStyleSheet = KHTMLFactory::defaultHTMLSettings()->userStyleSheet();
1952 if ( !userStyleSheet.isEmpty() )
1955 d->m_doc->setRestoreState(args.
docState);
1957 connect(d->m_doc,TQT_SIGNAL(finishedParsing()),
this,TQT_SLOT(slotFinishedParsing()));
1959 emit d->m_extension->enableAction(
"print",
true );
1961 d->m_doc->setParsing(
true);
1966 if ( !d->m_decoder )
1967 d->m_decoder = createDecoder();
1970 len = strlen( str );
1975 TQString decoded = d->m_decoder->decode( str, len );
1977 if(decoded.isEmpty())
return;
1979 if(d->m_bFirstData) {
1981 d->m_doc->determineParseMode( decoded );
1982 d->m_bFirstData =
false;
1986 if(d->m_decoder->visuallyOrdered()) d->m_doc->setVisuallyOrdered();
1987 d->m_doc->setDecoderCodec(d->m_decoder->codec());
1988 d->m_doc->recalcStyle( NodeImpl::Force );
1991 khtml::Tokenizer* t = d->m_doc->tokenizer();
1993 t->write( decoded,
true );
2001 if(d->m_bFirstData) {
2003 d->m_doc->setParseMode( DocumentImpl::Strict );
2004 d->m_bFirstData =
false;
2006 khtml::Tokenizer* t = d->m_doc->tokenizer();
2008 t->write( str,
true );
2015 TQString decoded = d->m_decoder->flush();
2016 if (d->m_bFirstData) {
2017 d->m_bFirstData =
false;
2018 d->m_doc->determineParseMode(decoded);
2022 d->m_doc->finishParsing();
2028 KMimeType::Ptr mime = KMimeType::mimeType(mimeType);
2029 if ( mime->is(
"text/html" ) || mime->is(
"text/xml" ) )
2039 write( data.data(), data.size() );
2052 if (!d->m_view)
return;
2053 d->m_view->paint(p, rc, yOff, more);
2059 d->m_doc->docLoader()->setShowAnimations( KHTMLSettings::KAnimationDisabled );
2061 ConstFrameIt it = d->m_frames.begin();
2062 const ConstFrameIt end = d->m_frames.end();
2063 for (; it !=
end; ++it )
2064 if ( !(*it)->m_part.isNull() && (*it)->m_part->inherits(
"KHTMLPart" ) ) {
2070 void KHTMLPart::resetFromScript()
2073 d->m_bComplete =
false;
2074 d->m_bLoadEventEmitted =
false;
2075 disconnect(d->m_doc,TQT_SIGNAL(finishedParsing()),
this,TQT_SLOT(slotFinishedParsing()));
2076 connect(d->m_doc,TQT_SIGNAL(finishedParsing()),
this,TQT_SLOT(slotFinishedParsing()));
2077 d->m_doc->setParsing(
true);
2082 void KHTMLPart::slotFinishedParsing()
2084 d->m_doc->setParsing(
false);
2085 checkEmitLoadEvent();
2086 disconnect(d->m_doc,TQT_SIGNAL(finishedParsing()),
this,TQT_SLOT(slotFinishedParsing()));
2094 void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
2096 if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
2100 ++(p->d->m_totalObjectCount);
2102 if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount
2103 && !op->d->m_progressUpdateTimer.isActive())
2104 op->d->m_progressUpdateTimer.start( 200,
true );
2109 void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
2111 if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
2115 ++(p->d->m_loadedObjects);
2117 if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount && op->d->m_jobPercent <= 100
2118 && !op->d->m_progressUpdateTimer.isActive())
2119 op->d->m_progressUpdateTimer.start( 200,
true );
2126 void KHTMLPart::slotProgressUpdate()
2129 if ( d->m_loadedObjects < d->m_totalObjectCount )
2130 percent = d->m_jobPercent / 4 + ( d->m_loadedObjects*300 ) / ( 4*d->m_totalObjectCount );
2132 percent = d->m_jobPercent;
2134 if( d->m_bComplete )
2137 if (d->m_statusMessagesEnabled) {
2138 if( d->m_bComplete )
2139 emit d->m_extension->infoMessage( i18n(
"Page loaded." ));
2140 else if ( d->m_loadedObjects < d->m_totalObjectCount && percent >= 75 )
2141 emit d->m_extension->infoMessage( i18n(
"%n Image of %1 loaded.",
"%n Images of %1 loaded.", d->m_loadedObjects).arg(d->m_totalObjectCount) );
2144 emit d->m_extension->loadingProgress( percent );
2147 void KHTMLPart::slotJobSpeed( KIO::Job* ,
unsigned long speed )
2149 d->m_jobspeed = speed;
2154 void KHTMLPart::slotJobPercent( KIO::Job* ,
unsigned long percent )
2156 d->m_jobPercent = percent;
2159 d->m_progressUpdateTimer.start( 0,
true );
2162 void KHTMLPart::slotJobDone( KIO::Job* )
2164 d->m_jobPercent = 100;
2167 d->m_progressUpdateTimer.start( 0,
true );
2170 void KHTMLPart::slotUserSheetStatDone( KIO::Job *_job )
2172 using namespace KIO;
2174 if ( _job->error() ) {
2179 const UDSEntry entry =
dynamic_cast<KIO::StatJob *
>( _job )->statResult();
2180 UDSEntry::ConstIterator it = entry.begin();
2181 const UDSEntry::ConstIterator end = entry.end();
2182 for ( ; it !=
end; ++it ) {
2183 if ( ( *it ).m_uds == UDS_MODIFICATION_TIME ) {
2191 const time_t
lastModified =
static_cast<time_t
>( ( *it ).m_long );
2192 if ( d->m_userStyleSheetLastModified >= lastModified ) {
2201 void KHTMLPart::checkCompleted()
2208 if (d->m_doc && !d->m_doc->parsing() && !d->m_focusNodeRestored)
2210 if (d->m_focusNodeNumber >= 0)
2211 d->m_doc->setFocusNode(d->m_doc->nodeWithAbsIndex(d->m_focusNodeNumber));
2213 d->m_focusNodeRestored =
true;
2216 bool bPendingChildRedirection =
false;
2218 ConstFrameIt it = d->m_frames.begin();
2219 const ConstFrameIt end = d->m_frames.end();
2220 for (; it !=
end; ++it ) {
2221 if ( !(*it)->m_bCompleted )
2227 if ( (*it)->m_bPendingRedirection )
2228 bPendingChildRedirection =
true;
2233 ConstFrameIt oi = d->m_objects.begin();
2234 const ConstFrameIt oiEnd = d->m_objects.end();
2236 for (; oi != oiEnd; ++oi )
2237 if ( !(*oi)->m_bCompleted )
2241 if ( d->m_bComplete || (d->m_doc && d->m_doc->parsing()) )
2246 if ( d->m_doc && d->m_doc->docLoader() )
2247 requests = khtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
2257 d->m_bComplete =
true;
2258 d->m_cachePolicy = KProtocolManager::cacheControl();
2259 d->m_totalObjectCount = 0;
2260 d->m_loadedObjects = 0;
2266 if ( !p && !op->d->m_progressUpdateTimer.isActive())
2267 op->d->m_progressUpdateTimer.start( 0,
true );
2270 checkEmitLoadEvent();
2272 bool pendingAction =
false;
2274 if ( !d->m_redirectURL.isEmpty() )
2280 d->m_redirectionTimer.start( 1000 * d->m_delayRedirect,
true );
2285 pendingAction =
true;
2287 else if ( bPendingChildRedirection )
2289 pendingAction =
true;
2296 d->m_view->complete( pendingAction );
2299 TQStringList sheets;
2301 sheets = d->m_doc->availableStyleSheets();
2302 sheets.prepend( i18n(
"Automatic Detection" ) );
2303 d->m_paUseStylesheet->setItems( sheets );
2305 d->m_paUseStylesheet->setEnabled( sheets.count() > 2);
2306 if (sheets.count() > 2)
2308 d->m_paUseStylesheet->setCurrentItem(kMax(sheets.findIndex(d->m_sheetUsed), 0));
2309 slotUseStylesheet();
2315 kdDebug(6050) <<
"DONE: " <<d->m_parsetime.elapsed() <<
endl;
2319 void KHTMLPart::checkEmitLoadEvent()
2321 if ( d->m_bLoadEventEmitted || !d->m_doc || d->m_doc->parsing() )
return;
2323 ConstFrameIt it = d->m_frames.begin();
2324 const ConstFrameIt end = d->m_frames.end();
2325 for (; it !=
end; ++it )
2326 if ( !(*it)->m_bCompleted )
2329 ConstFrameIt oi = d->m_objects.begin();
2330 const ConstFrameIt oiEnd = d->m_objects.end();
2332 for (; oi != oiEnd; ++oi )
2333 if ( !(*oi)->m_bCompleted )
2340 if ( d->m_doc && d->m_doc->docLoader() )
2341 requests = khtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
2346 d->m_bLoadEventEmitted =
true;
2353 return d->m_settings;
2356 #ifndef KDE_NO_COMPAT
2357 KURL KHTMLPart::baseURL()
const
2359 if ( !d->m_doc )
return KURL();
2361 return d->m_doc->baseURL();
2364 TQString KHTMLPart::baseTarget()
const
2366 if ( !d->m_doc )
return TQString();
2368 return d->m_doc->baseTarget();
2374 if ( !d->m_doc )
return KURL( url );
2377 return KURL(d->m_doc->completeURL(url), d->m_decoder->codec()->mibEnum());
2379 return KURL( d->m_doc->completeURL( url ) );
2386 kdDebug(6050) <<
"KHTMLPart::scheduleRedirection delay=" << delay <<
" url=" << url <<
endl;
2387 kdDebug(6050) <<
"current redirectURL=" << d->m_redirectURL <<
" with delay " << d->m_delayRedirect <<
endl;
2388 if( delay < 24*60*60 &&
2389 ( d->m_redirectURL.isEmpty() || delay <= d->m_delayRedirect) ) {
2390 d->m_delayRedirect = delay;
2391 d->m_redirectURL =
url;
2392 d->m_redirectLockHistory = doLockHistory;
2393 kdDebug(6050) <<
" d->m_bComplete=" << d->m_bComplete <<
endl;
2394 if ( d->m_bComplete ) {
2395 d->m_redirectionTimer.stop();
2396 d->m_redirectionTimer.start( kMax(0, 1000 * d->m_delayRedirect),
true );
2401 void KHTMLPart::slotRedirect()
2403 kdDebug(6050) <<
this <<
" slotRedirect()" <<
endl;
2404 TQString u = d->m_redirectURL;
2405 d->m_delayRedirect = 0;
2406 d->m_redirectURL = TQString();
2409 if ( u.find( TQString::fromLatin1(
"javascript:" ), 0,
false ) == 0 )
2412 kdDebug( 6050 ) <<
"KHTMLPart::slotRedirect script=" << script <<
endl;
2414 if ( res.type() == TQVariant::String ) {
2416 write( res.asString() );
2427 if ( openedByJS() && d->m_opener )
2428 cUrl = d->m_opener->url();
2430 if (!kapp || !kapp->authorizeURLAction(
"redirect", cUrl, url))
2432 kdWarning(6050) <<
"KHTMLPart::scheduleRedirection: Redirection from " << cUrl <<
" to " << url <<
" REJECTED!" <<
endl;
2437 if ( urlcmp( u,
m_url.
url(),
true, true ) )
2439 args.
metaData().insert(
"referrer", d->m_pageReferrer);
2453 d->m_urlSelectedOpenedURL =
true;
2454 urlSelected( u, 0, 0,
"_self", args );
2456 if ( !d->m_urlSelectedOpenedURL )
2460 void KHTMLPart::slotRedirection(KIO::Job*,
const KURL& url)
2464 emit d->m_extension->setLocationBarURL( url.
prettyURL() );
2465 d->m_workingURL =
url;
2470 d->m_encoding = name;
2471 d->m_haveEncoding =
override;
2478 d->m_restored =
true;
2480 d->m_restored =
false;
2488 if(d->m_haveEncoding && !d->m_encoding.isEmpty())
2489 return d->m_encoding;
2491 if(d->m_decoder && d->m_decoder->encoding())
2492 return TQString(d->m_decoder->encoding());
2494 return defaultEncoding();
2497 TQString KHTMLPart::defaultEncoding()
const
2499 TQString
encoding = settings()->encoding();
2500 if ( !encoding.isEmpty() )
2505 return "iso-8859-1";
2512 if ( d->m_doc && d->m_doc->docLoader() )
2513 (
void)
new khtml::PartStyleSheetLoader(
this, url.
url(), d->m_doc->docLoader());
2519 d->m_doc->setUserStyleSheet( styleSheet );
2527 HTMLCollectionImpl *anchors =
2528 new HTMLCollectionImpl( d->m_doc, HTMLCollectionImpl::DOC_ANCHORS);
2530 NodeImpl *n = anchors->namedItem(name);
2534 n = d->m_doc->getElementById( name );
2537 d->m_doc->setCSSTarget(n);
2540 bool quirkyName = !n && !d->m_doc->inStrictMode() && (name.isEmpty() || name.lower() ==
"top");
2543 d->m_view->setContentsPos(0, 0);
2546 kdDebug(6050) <<
"KHTMLPart::gotoAnchor node '" << name <<
"' not found" <<
endl;
2552 HTMLElementImpl *a =
static_cast<HTMLElementImpl *
>(n);
2554 a->getUpperLeftCorner(x, y);
2555 if (x <= d->m_view->contentsX())
2558 gox = d->m_view->contentsX();
2559 if ( x + 10 > d->m_view->contentsX()+d->m_view->visibleWidth()) {
2560 a->getLowerRightCorner(x, dummy);
2561 gox = x - d->m_view->visibleWidth() + 10;
2565 d->m_view->setContentsPos(gox, y);
2574 d->m_view->focusNextPrevNode (
true );
2583 d->m_view->focusNextPrevNode (
false );
2590 d->m_settings->setStdFontName(name);
2595 d->m_settings->setFixedFontName(name);
2600 d->m_linkCursor = c;
2605 return d->m_linkCursor;
2610 return d->m_onlyLocalReferences;
2615 d->m_onlyLocalReferences = enable;
2618 void KHTMLPartPrivate::setFlagRecursively(
2619 bool KHTMLPartPrivate::*flag,
bool value)
2622 this->*flag = value;
2626 TQValueList<khtml::ChildFrame*>::Iterator it = m_frames.begin();
2627 const TQValueList<khtml::ChildFrame*>::Iterator itEnd = m_frames.end();
2628 for (; it != itEnd; ++it) {
2630 if (part->inherits(
"KHTMLPart"))
2631 part->d->setFlagRecursively(flag, value);
2636 TQValueList<khtml::ChildFrame*>::Iterator it = m_objects.begin();
2637 const TQValueList<khtml::ChildFrame*>::Iterator itEnd = m_objects.end();
2638 for (; it != itEnd; ++it) {
2640 if (part->inherits(
"KHTMLPart"))
2641 part->d->setFlagRecursively(flag, value);
2648 #ifndef KHTML_NO_CARET
2649 kdDebug(6200) <<
"setCaretMode(" << enable <<
")" <<
endl;
2651 d->setFlagRecursively(&KHTMLPartPrivate::m_caretMode, enable);
2655 view()->initCaret(
true);
2656 view()->ensureCaretVisible();
2660 #endif // KHTML_NO_CARET
2665 return d->m_caretMode;
2670 #ifndef KHTML_NO_CARET
2672 d->setFlagRecursively(&KHTMLPartPrivate::m_designMode, enable);
2676 view()->initCaret(
true);
2677 view()->ensureCaretVisible();
2681 #endif // KHTML_NO_CARET
2686 return d->m_designMode;
2691 #ifndef KHTML_NO_CARET
2693 kdDebug(6200) << k_funcinfo <<
"node: " << node.handle() <<
" nodeName: "
2694 << node.
nodeName().string() <<
" offset: " << offset
2695 <<
" extendSelection " << extendSelection <<
endl;
2697 if (
view()->moveCaretTo(node.handle(), offset, !extendSelection))
2698 emitSelectionChanged();
2699 view()->ensureCaretVisible();
2700 #endif // KHTML_NO_CARET
2705 #ifndef KHTML_NO_CARET
2707 #else // KHTML_NO_CARET
2708 return CaretInvisible;
2709 #endif // KHTML_NO_CARET
2714 #ifndef KHTML_NO_CARET
2715 view()->setCaretDisplayPolicyNonFocused(policy);
2716 #endif // KHTML_NO_CARET
2721 #ifndef KHTML_NO_CARET
2724 NodeImpl *caretNode = xmlDocImpl()->focusNode();
2726 || (caretNode && caretNode->contentEditable())) {
2735 #endif // KHTML_NO_CARET
2742 d->m_findPosEnd = -1;
2743 d->m_findNodeEnd= 0;
2744 d->m_findPosStart = -1;
2745 d->m_findNodeStart = 0;
2746 d->m_findNodePrevious = 0;
2751 bool KHTMLPart::initFindNode(
bool selection,
bool reverse,
bool fromCursor )
2756 DOM::NodeImpl* firstNode = 0L;
2757 if (d->m_doc->isHTMLDocument())
2758 firstNode = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
2760 firstNode = d->m_doc;
2767 if ( firstNode->id() == ID_FRAMESET )
2778 d->m_findNode = reverse ? d->m_selectionEnd.handle() : d->m_selectionStart.handle();
2779 d->m_findPos = reverse ? d->m_endOffset : d->m_startOffset;
2781 d->m_findNodeEnd = reverse ? d->m_selectionStart.handle() : d->m_selectionEnd.handle();
2782 d->m_findPosEnd = reverse ? d->m_startOffset : d->m_endOffset;
2783 d->m_findNodeStart = !reverse ? d->m_selectionStart.handle() : d->m_selectionEnd.handle();
2784 d->m_findPosStart = !reverse ? d->m_startOffset : d->m_endOffset;
2785 d->m_findNodePrevious = d->m_findNodeStart;
2792 d->m_findNode = firstNode;
2793 d->m_findPos = reverse ? -1 : 0;
2795 d->m_findNodeEnd = reverse ? firstNode : 0;
2796 d->m_findPosEnd = reverse ? 0 : -1;
2797 d->m_findNodeStart = !reverse ? firstNode : 0;
2798 d->m_findPosStart = !reverse ? 0 : -1;
2799 d->m_findNodePrevious = d->m_findNodeStart;
2803 khtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
2807 while ( obj->lastChild() )
2809 obj = obj->lastChild();
2812 while ( !obj->element() && obj->objectAbove() )
2814 obj = obj->objectAbove();
2816 d->m_findNode = obj->element();
2826 if ( !initFindNode(
false, !forward, d->m_findNode ) )
2830 if( (d->m_findNode->nodeType() == Node::TEXT_NODE || d->m_findNode->nodeType() == Node::CDATA_SECTION_NODE) && d->m_findNode->renderer() )
2832 DOMString nodeText = d->m_findNode->nodeValue();
2833 DOMStringImpl *t = nodeText.implementation();
2834 TQConstString s(t->s, t->l);
2838 TQRegExp matcher( str );
2839 matcher.setCaseSensitive( caseSensitive );
2840 d->m_findPos = matcher.search(s.string(), d->m_findPos+1);
2841 if ( d->m_findPos != -1 )
2842 matchLen = matcher.matchedLength();
2845 d->m_findPos = s.string().find(str, d->m_findPos+1, caseSensitive);
2846 matchLen = str.length();
2849 if(d->m_findPos != -1)
2852 if(static_cast<khtml::RenderText *>(d->m_findNode->renderer())
2853 ->posOfChar(d->m_findPos, x, y))
2854 d->m_view->setContentsPos(x-50, y-50);
2856 d->m_selectionStart = d->m_findNode;
2857 d->m_startOffset = d->m_findPos;
2858 d->m_selectionEnd = d->m_findNode;
2859 d->m_endOffset = d->m_findPos + matchLen;
2860 d->m_startBeforeEnd =
true;
2862 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
2863 d->m_selectionEnd.handle(), d->m_endOffset );
2864 emitSelectionChanged();
2874 next = d->m_findNode->firstChild();
2876 if(!next) next = d->m_findNode->nextSibling();
2877 while(d->m_findNode && !next) {
2878 d->m_findNode = d->m_findNode->parentNode();
2879 if( d->m_findNode ) {
2880 next = d->m_findNode->nextSibling();
2886 next = d->m_findNode->lastChild();
2888 if (!next ) next = d->m_findNode->previousSibling();
2889 while ( d->m_findNode && !next )
2891 d->m_findNode = d->m_findNode->parentNode();
2894 next = d->m_findNode->previousSibling();
2899 d->m_findNode = next;
2900 if(!d->m_findNode)
return false;
2905 void KHTMLPart::slotFind()
2910 if (!part->inherits(
"KHTMLPart") )
2912 kdError(6000) <<
"slotFind: part is a " << part->className() <<
", can't do a search into it" <<
endl;
2918 void KHTMLPart::slotFindNext()
2923 if (!part->inherits(
"KHTMLPart") )
2925 kdError(6000) <<
"slotFindNext: part is a " << part->className() <<
", can't do a search into it" <<
endl;
2931 void KHTMLPart::slotFindPrev()
2936 if (!part->inherits(
"KHTMLPart") )
2938 kdError(6000) <<
"slotFindNext: part is a " << part->className() <<
", can't do a search into it" <<
endl;
2944 void KHTMLPart::slotFindDone()
2949 void KHTMLPart::slotFindAheadText()
2951 #ifndef KHTML_NO_TYPE_AHEAD_FIND
2955 if (!part->inherits(
"KHTMLPart") )
2957 kdError(6000) <<
"slotFindNext: part is a " << part->className() <<
", can't do a search into it" <<
endl;
2960 static_cast<KHTMLPart *
>( part )->
view()->startFindAhead(
false );
2961 #endif // KHTML_NO_TYPE_AHEAD_FIND
2964 void KHTMLPart::slotFindAheadLink()
2966 #ifndef KHTML_NO_TYPE_AHEAD_FIND
2970 if (!part->inherits(
"KHTMLPart") )
2972 kdError(6000) <<
"slotFindNext: part is a " << part->className() <<
", can't do a search into it" <<
endl;
2975 static_cast<KHTMLPart *
>( part )->
view()->startFindAhead(
true );
2976 #endif // KHTML_NO_TYPE_AHEAD_FIND
2979 void KHTMLPart::enableFindAheadActions(
bool enable )
2985 p->d->m_paFindAheadText->setEnabled( enable );
2986 p->d->m_paFindAheadLinks->setEnabled( enable );
2989 void KHTMLPart::slotFindDialogDestroyed()
2991 d->m_lastFindState.options = d->m_findDialog->options();
2992 d->m_lastFindState.history = d->m_findDialog->findHistory();
2993 d->m_findDialog->deleteLater();
2994 d->m_findDialog = 0L;
3004 if ( d->m_findDialog )
3011 #ifndef QT_NO_CLIPBOARD
3012 disconnect( kapp->clipboard(), TQT_SIGNAL(
selectionChanged()),
this, TQT_SLOT(slotClearSelection()) );
3016 d->m_findDialog =
new KFindDialog(
false ,
widget(),
"khtmlfind" );
3018 d->m_findDialog->setHasCursor( d->m_findNode != 0 );
3019 if ( d->m_findNode )
3020 d->m_lastFindState.options |= KFindDialog::FromCursor;
3023 d->m_findDialog->setFindHistory( d->m_lastFindState.history );
3024 d->m_findDialog->setOptions( d->m_lastFindState.options );
3026 d->m_lastFindState.options = -1;
3027 d->m_lastFindState.last_dir = -1;
3029 d->m_findDialog->show();
3030 connect( d->m_findDialog, TQT_SIGNAL(okClicked()),
this, TQT_SLOT(slotFindNext()) );
3031 connect( d->m_findDialog, TQT_SIGNAL(finished()),
this, TQT_SLOT(slotFindDialogDestroyed()) );
3033 findText( d->m_findDialog->pattern(), 0 ,
widget(), d->m_findDialog );
3042 #ifndef QT_NO_CLIPBOARD
3043 connect( kapp->clipboard(), TQT_SIGNAL(
selectionChanged()), TQT_SLOT(slotClearSelection()) );
3048 d->m_find =
new KFind( str, options, parent, findDialog );
3049 d->m_find->closeFindNextDialog();
3050 connect( d->m_find, TQT_SIGNAL( highlight(
const TQString &,
int,
int ) ),
3051 this, TQT_SLOT( slotHighlight(
const TQString &,
int,
int ) ) );
3057 d->m_lastFindState.options = options;
3058 initFindNode( options & KFindDialog::SelectedText,
3059 options & KFindDialog::FindBackwards,
3060 options & KFindDialog::FromCursor );
3079 view()->updateFindAheadTimeout();
3081 if ( d->m_findDialog )
3083 if ( d->m_find->pattern() != d->m_findDialog->pattern() ) {
3084 d->m_find->setPattern( d->m_findDialog->pattern() );
3085 d->m_find->resetCounts();
3087 options = d->m_findDialog->options();
3088 if ( d->m_lastFindState.options != options )
3090 d->m_find->setOptions( options );
3092 if ( options & KFindDialog::SelectedText )
3095 long difference = d->m_lastFindState.options ^ options;
3096 if ( difference & (KFindDialog::SelectedText | KFindDialog::FromCursor ) )
3099 (void) initFindNode( options & KFindDialog::SelectedText,
3100 options & KFindDialog::FindBackwards,
3101 options & KFindDialog::FromCursor );
3103 d->m_lastFindState.options = options;
3106 options = d->m_lastFindState.options;
3108 options = options ^ KFindDialog::FindBackwards;
3109 if( d->m_find->options() != options )
3110 d->m_find->setOptions( options );
3115 if( d->m_lastFindState.last_dir != -1
3116 &&
bool( d->m_lastFindState.last_dir ) !=
bool( options & KFindDialog::FindBackwards ))
3118 tqSwap( d->m_findNodeEnd, d->m_findNodeStart );
3119 tqSwap( d->m_findPosEnd, d->m_findPosStart );
3120 tqSwap( d->m_findNode, d->m_findNodePrevious );
3122 khtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
3123 khtml::RenderObject* end = d->m_findNodeEnd ? d->m_findNodeEnd->renderer() : 0;
3129 obj = (options & KFindDialog::FindBackwards) ? obj->objectAbove() : obj->objectBelow();
3130 }
while ( obj && ( !obj->element() || obj->isInlineContinuation() ) );
3133 d->m_findNode = obj->element();
3137 d->m_lastFindState.last_dir = ( options & KFindDialog::FindBackwards ) ? 1 : 0;
3139 KFind::Result res = KFind::NoMatch;
3140 khtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
3141 khtml::RenderObject* end = d->m_findNodeEnd ? d->m_findNodeEnd->renderer() : 0;
3142 khtml::RenderTextArea *tmpTextArea=0L;
3144 while( res == KFind::NoMatch )
3146 if ( d->m_find->needData() )
3157 d->m_stringPortions.clear();
3158 bool newLine =
false;
3160 DOM::NodeImpl* lastNode = d->m_findNode;
3161 while ( obj && !newLine )
3165 bool renderAreaText = obj->parent() && (TQCString(obj->parent()->renderName())==
"RenderTextArea");
3166 bool renderLineText = (TQCString(obj->renderName())==
"RenderLineEdit");
3167 if ( renderAreaText )
3169 khtml::RenderTextArea *parent=
static_cast<khtml::RenderTextArea *
>(obj->parent());
3171 s = s.replace(0xa0,
' ');
3172 tmpTextArea = parent;
3174 else if ( renderLineText )
3176 khtml::RenderLineEdit *parentLine=
static_cast<khtml::RenderLineEdit *
>(obj);
3177 if (parentLine->widget()->echoMode() == TQLineEdit::Normal)
3178 s = parentLine->widget()->text();
3179 s = s.replace(0xa0,
' ');
3181 else if ( obj->isText() )
3183 bool isLink =
false;
3186 if ( options & FindLinksOnly )
3188 DOM::NodeImpl *parent = obj->element();
3191 if ( parent->nodeType() == Node::ELEMENT_NODE && parent->id() == ID_A )
3196 parent = parent->parentNode();
3204 if ( isLink && obj->parent()!=tmpTextArea )
3206 s =
static_cast<khtml::RenderText *
>(obj)->data().string();
3207 s = s.replace(0xa0,
' ');
3210 else if ( obj->isBR() )
3212 else if ( !obj->isInline() && !str.isEmpty() )
3215 if ( lastNode == d->m_findNodeEnd )
3216 s.truncate( d->m_findPosEnd );
3219 newLine = s.find(
'\n' ) != -1;
3220 if( !( options & KFindDialog::FindBackwards ))
3223 d->m_stringPortions.append( KHTMLPartPrivate::StringPortion( str.length(), lastNode ) );
3228 for( TQValueList<KHTMLPartPrivate::StringPortion>::Iterator it = d->m_stringPortions.begin();
3229 it != d->m_stringPortions.end();
3231 (*it).index += s.length();
3232 d->m_stringPortions.prepend( KHTMLPartPrivate::StringPortion( 0, lastNode ) );
3247 obj = (options & KFindDialog::FindBackwards) ? obj->objectAbove() : obj->objectBelow();
3248 }
while ( obj && ( !obj->element() || obj->isInlineContinuation() ) );
3251 lastNode = obj->element();
3256 if ( !str.isEmpty() )
3258 d->m_find->setData( str, d->m_findPos );
3262 d->m_findNodePrevious = d->m_findNode;
3263 d->m_findNode = lastNode;
3265 if ( !d->m_find->needData() )
3268 res = d->m_find->find();
3272 if ( res == KFind::NoMatch )
3275 if ( !(options & FindNoPopups) && d->m_find->shouldRestart() )
3278 initFindNode(
false, options & KFindDialog::FindBackwards,
false );
3279 d->m_find->resetCounts();
3287 initFindNode(
false, options & KFindDialog::FindBackwards,
false );
3288 d->m_find->resetCounts();
3289 slotClearSelection();
3294 return res == KFind::Match;
3297 void KHTMLPart::slotHighlight(
const TQString& ,
int index,
int length )
3300 TQValueList<KHTMLPartPrivate::StringPortion>::Iterator it = d->m_stringPortions.begin();
3301 const TQValueList<KHTMLPartPrivate::StringPortion>::Iterator itEnd = d->m_stringPortions.end();
3302 TQValueList<KHTMLPartPrivate::StringPortion>::Iterator prev = it;
3304 while ( it != itEnd && (*it).index <= index )
3309 Q_ASSERT ( prev != itEnd );
3310 DOM::NodeImpl* node = (*prev).node;
3313 d->m_selectionStart = node;
3314 d->m_startOffset = index - (*prev).index;
3316 khtml::RenderObject* obj = node->renderer();
3317 khtml::RenderTextArea *parent = 0L;
3318 khtml::RenderLineEdit *parentLine = 0L;
3319 bool renderLineText =
false;
3321 TQRect highlightedRect;
3322 bool renderAreaText =
false;
3327 renderAreaText = (TQCString(obj->parent()->renderName())==
"RenderTextArea");
3328 renderLineText = (TQCString(obj->renderName())==
"RenderLineEdit");
3331 if( renderAreaText )
3332 parent=
static_cast<khtml::RenderTextArea *
>(obj->parent());
3333 if ( renderLineText )
3334 parentLine=
static_cast<khtml::RenderLineEdit *
>(obj);
3335 if ( !renderLineText )
3340 static_cast<khtml::RenderText *
>(node->renderer())
3341 ->caretPos( d->m_startOffset,
false, x, y, dummy, dummy );
3343 if ( x != -1 || y != -1 )
3345 int gox = d->m_view->contentsX();
3346 if (x+50 > d->m_view->contentsX() + d->m_view->visibleWidth())
3347 gox = x - d->m_view->visibleWidth() + 50;
3348 if (x-10 < d->m_view->contentsX())
3349 gox = x - d->m_view->visibleWidth() - 10;
3350 if (gox < 0) gox = 0;
3351 d->m_view->setContentsPos(gox, y-50);
3352 highlightedRect.setTopLeft( d->m_view->mapToGlobal(TQPoint(x, y)) );
3358 while ( it != itEnd && (*it).index < index + length )
3363 Q_ASSERT ( prev != itEnd );
3365 d->m_selectionEnd = (*prev).node;
3366 d->m_endOffset = index + length - (*prev).index;
3367 d->m_startBeforeEnd =
true;
3370 if(d->m_selectionStart == d->m_selectionEnd)
3372 bool isLink =
false;
3375 DOM::NodeImpl *parent = d->m_selectionStart.handle();
3378 if ( parent->nodeType() == Node::ELEMENT_NODE && parent->id() == ID_A )
3383 parent = parent->parentNode();
3388 d->m_doc->setFocusNode( parent );
3393 kdDebug(6050) <<
"slotHighlight: " << d->m_selectionStart.handle() <<
"," << d->m_startOffset <<
" - " <<
3394 d->m_selectionEnd.handle() <<
"," << d->m_endOffset <<
endl;
3395 it = d->m_stringPortions.begin();
3396 for ( ; it != d->m_stringPortions.end() ; ++it )
3397 kdDebug(6050) <<
" StringPortion: from index=" << (*it).index <<
" -> node=" << (*it).node <<
endl;
3399 if( renderAreaText )
3402 parent->highLightWord( length, d->m_endOffset-length );
3404 else if ( renderLineText )
3407 parentLine->highLightWord( length, d->m_endOffset-length );
3411 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
3412 d->m_selectionEnd.handle(), d->m_endOffset );
3413 if (d->m_selectionEnd.handle()->renderer() )
3415 int x, y, height, dummy;
3416 static_cast<khtml::RenderText *
>(d->m_selectionEnd.handle()->renderer())
3417 ->caretPos( d->m_endOffset,
false, x, y, dummy, height );
3419 if ( x != -1 || y != -1 )
3423 highlightedRect.setBottomRight( d->m_view->mapToGlobal( TQPoint(x, y+height) ) );
3427 emitSelectionChanged();
3430 if ( d->m_findDialog && !highlightedRect.isNull() )
3432 highlightedRect.moveBy( -d->m_view->contentsX(), -d->m_view->contentsY() );
3434 KDialog::avoidArea( d->m_findDialog, highlightedRect );
3441 kdDebug() <<
"selectedTextAsHTML(): selection is not valid. Returning empty selection" <<
endl;
3444 if(d->m_startOffset < 0 || d->m_endOffset <0) {
3445 kdDebug() <<
"invalid values for end/startOffset " << d->m_startOffset <<
" " << d->m_endOffset <<
endl;
3449 if(r.isNull() || r.isDetached())
3451 int exceptioncode = 0;
3452 return r.handle()->toHTML(exceptioncode).string();
3457 bool hasNewLine =
true;
3458 bool seenTDTag =
false;
3462 if(n.
nodeType() == DOM::Node::TEXT_NODE && n.handle()->renderer()) {
3463 DOM::DOMStringImpl *dstr =
static_cast<DOM::TextImpl*
>(n.handle())->renderString();
3464 TQString str(dstr->s, dstr->l);
3465 if(!str.isEmpty()) {
3471 if(n == d->m_selectionStart && n == d->m_selectionEnd)
3472 text = str.mid(d->m_startOffset, d->m_endOffset - d->m_startOffset);
3473 else if(n == d->m_selectionStart)
3474 text = str.mid(d->m_startOffset);
3475 else if(n == d->m_selectionEnd)
3476 text += str.left(d->m_endOffset);
3483 unsigned short id = n.elementId();
3486 text +=
static_cast<HTMLTextAreaElementImpl*
>(n.handle())->value().string();
3489 if (static_cast<HTMLInputElementImpl*>(n.handle())->inputType() != HTMLInputElementImpl::PASSWORD)
3490 text += static_cast<HTMLInputElementImpl*>(n.handle())->value().string();
3493 text +=
static_cast<HTMLSelectElementImpl*
>(n.handle())->value().string();
3500 text +=
static_cast<HTMLImageElementImpl*
>(n.handle())->altText().string();
3534 if(n == d->m_selectionEnd)
break;
3540 unsigned short id = n.elementId();
3584 int end = text.length();
3587 while ((start < end) && (text[start] ==
'\n'))
3591 while ((start < (end-1)) && (text[end-1] ==
'\n') && (text[end-2] ==
'\n'))
3594 return text.mid(start, end-start);
3599 if ( d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() )
3601 if ( d->m_selectionStart == d->m_selectionEnd &&
3602 d->m_startOffset == d->m_endOffset )
3609 if( d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() )
3610 return DOM::Range();
3612 RangeImpl *rng = r.handle();
3614 NodeImpl *n = d->m_selectionStart.handle();
3615 if(!n->parentNode() ||
3617 (!n->renderer()->isReplaced() && !n->renderer()->isBR())) {
3618 rng->setStart( n, d->m_startOffset, exception );
3620 kdDebug(6000) <<
"1 -selection() threw the exception " << exception <<
". Returning empty range." <<
endl;
3621 return DOM::Range();
3625 while ((n = n->previousSibling()))
3627 rng->setStart( d->m_selectionStart.parentNode().handle(), o_start + d->m_startOffset, exception );
3629 kdDebug(6000) <<
"2 - selection() threw the exception " << exception <<
". Returning empty range." <<
endl;
3630 return DOM::Range();
3635 n = d->m_selectionEnd.handle();
3636 if(!n->parentNode() ||
3638 (!n->renderer()->isReplaced() && !n->renderer()->isBR())) {
3640 rng->setEnd( n, d->m_endOffset, exception );
3642 kdDebug(6000) <<
"3 - selection() threw the exception " << exception <<
". Returning empty range." <<
endl;
3643 return DOM::Range();
3648 while ((n = n->previousSibling()))
3650 rng->setEnd( d->m_selectionEnd.parentNode().handle(), o_end + d->m_endOffset, exception);
3652 kdDebug(6000) <<
"4 - selection() threw the exception " << exception <<
". Returning empty range." <<
endl;
3653 return DOM::Range();
3663 s = d->m_selectionStart;
3664 so = d->m_startOffset;
3665 e = d->m_selectionEnd;
3666 eo = d->m_endOffset;
3673 if ( r.collapsed() )
3674 slotClearSelection();
3676 d->m_selectionStart = r.startContainer();
3677 d->m_startOffset = r.startOffset();
3678 d->m_selectionEnd = r.endContainer();
3679 d->m_endOffset = r.endOffset();
3680 d->m_doc->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
3681 d->m_selectionEnd.handle(),d->m_endOffset);
3682 #ifndef KHTML_NO_CARET
3683 bool v = d->m_view->placeCaret();
3684 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
3689 void KHTMLPart::slotClearSelection()
3692 #ifndef KHTML_NO_CARET
3697 d->m_selectionStart = 0;
3698 d->m_startOffset = 0;
3699 d->m_selectionEnd = 0;
3702 if ( d->m_doc ) d->m_doc->clearSelection();
3704 emitSelectionChanged();
3705 #ifndef KHTML_NO_CARET
3706 bool v = d->m_view->placeCaret();
3707 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
3711 void KHTMLPart::resetHoverText()
3713 if( !d->m_overURL.isEmpty() )
3715 d->m_overURL = d->m_overURLTarget = TQString();
3716 emit
onURL( TQString() );
3718 setStatusBarText(TQString(), BarHoverText);
3719 emit d->m_extension->mouseOverInfo(0);
3723 void KHTMLPart::overURL(
const TQString &url,
const TQString &target,
bool )
3728 if ( url.isEmpty() )
3733 if ( url.isEmpty() ) {
3734 setStatusBarText(u.
htmlURL(), BarHoverText);
3738 if (url.find( TQString::fromLatin1(
"javascript:" ),0,
false ) == 0 ) {
3741 if (url.startsWith(
"javascript:window.open"))
3742 jscode += i18n(
" (In new window)");
3743 setStatusBarText( TQStyleSheet::escape( jscode ), BarHoverText );
3747 KFileItem item(u, TQString(), KFileItem::Unknown);
3748 emit d->m_extension->mouseOverInfo(&item);
3752 KMimeType::Ptr typ = KMimeType::findByURL( u );
3755 com = typ->comment( u,
false );
3758 setStatusBarText(u.
htmlURL(), BarHoverText);
3766 TQCString path = TQFile::encodeName( u.
path() );
3769 bool ok = !stat( path.data(), &buff );
3772 if (ok) ok = !lstat( path.data(), &lbuff );
3775 TQString text2 = text;
3777 if (ok && S_ISLNK( lbuff.st_mode ) )
3781 tmp = i18n(
"Symbolic Link");
3783 tmp = i18n(
"%1 (Link)").arg(com);
3784 char buff_two[1024];
3786 int n = readlink ( path.data(), buff_two, 1022);
3791 setStatusBarText(text2, BarHoverText);
3800 else if ( ok && S_ISREG( buff.st_mode ) )
3802 if (buff.st_size < 1024)
3803 text = i18n(
"%2 (%1 bytes)").arg((
long) buff.st_size).arg(text2);
3806 float d = (float) buff.st_size/1024.0;
3807 text = i18n(
"%2 (%1 K)").arg(
KGlobal::locale()->formatNumber(d, 2)).arg(text2);
3812 else if ( ok && S_ISDIR( buff.st_mode ) )
3822 setStatusBarText(text, BarHoverText);
3827 if (target.lower() ==
"_blank")
3829 extra = i18n(
" (In new window)");
3831 else if (!target.isEmpty() &&
3832 (target.lower() !=
"_top") &&
3833 (target.lower() !=
"_self") &&
3834 (target.lower() !=
"_parent"))
3840 extra = i18n(
" (In new window)");
3842 extra = i18n(
" (In other frame)");
3845 if (u.
protocol() == TQString::fromLatin1(
"mailto")) {
3846 TQString mailtoMsg ;
3848 TQStringList queries = TQStringList::split(
'&', u.
query().mid(1));
3849 TQStringList::Iterator it = queries.begin();
3850 const TQStringList::Iterator itEnd = queries.end();
3851 for (; it != itEnd; ++it)
3852 if ((*it).startsWith(TQString::fromLatin1(
"subject=")))
3854 else if ((*it).startsWith(TQString::fromLatin1(
"cc=")))
3856 else if ((*it).startsWith(TQString::fromLatin1(
"bcc=")))
3858 mailtoMsg = TQStyleSheet::escape(mailtoMsg);
3859 mailtoMsg.replace(TQRegExp(
"([\n\r\t]|[ ]{10})"), TQString());
3860 setStatusBarText(
"<qt>"+mailtoMsg, BarHoverText);
3865 else if (u.
protocol() == TQString::fromLatin1(
"http")) {
3867 while (hrefNode.
nodeName().string() != TQString::fromLatin1(
"A") && !hrefNode.
isNull())
3870 if (!hrefNode.
isNull()) {
3872 if (!hreflangNode.
isNull()) {
3873 TQString countryCode = hreflangNode.
nodeValue().string().lower();
3875 if (countryCode == TQString::fromLatin1(
"en"))
3876 countryCode = TQString::fromLatin1(
"gb");
3877 TQString flagImg = TQString::fromLatin1(
"<img src=%1>").arg(
3878 locate(
"locale", TQString::fromLatin1(
"l10n/")
3880 + TQString::fromLatin1(
"/flag.png")));
3881 emit setStatusBarText(flagImg + u.
prettyURL() + extra);
3886 setStatusBarText(u.
htmlURL() + extra, BarHoverText);
3894 void KHTMLPart::urlSelected(
const TQString &url,
int button,
int state,
const TQString &_target,
KParts::URLArgs args )
3899 d->m_urlSelectedOpenedURL = urlSelectedIntern( url, button, state, _target, args );
3903 bool KHTMLPart::urlSelectedIntern(
const TQString &url,
int button,
int state,
const TQString &_target,
KParts::URLArgs args )
3905 bool hasTarget =
false;
3907 TQString target = _target;
3908 if ( target.isEmpty() && d->m_doc )
3909 target = d->m_doc->baseTarget();
3910 if ( !target.isEmpty() )
3913 if ( url.find( TQString::fromLatin1(
"javascript:" ), 0,
false ) == 0 )
3921 if ( url.isEmpty() )
3928 kdDebug(6050) <<
this <<
" urlSelected: complete URL:" << cURL.
url() <<
" target=" << target <<
endl;
3930 if ( state & ControlButton )
3933 emit d->m_extension->createNewWindow( cURL, args );
3937 if ( button == Qt::LeftButton && ( state & ShiftButton ) )
3939 KIO::MetaData metaData;
3940 metaData[
"referrer"] = d->m_referrer;
3941 KHTMLPopupGUIClient::saveURL( d->m_view, i18n(
"Save As" ), cURL, metaData );
3945 if (!checkLinkSecurity(cURL,
3946 i18n(
"<qt>This untrusted page links to<BR><B>%1</B>.<BR>Do you want to follow the link?" ),
3952 args.
metaData().insert(
"main_frame_request",
3954 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
3955 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
3956 args.
metaData().insert(
"PropagateHttpHeader",
"true");
3957 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
3958 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
3960 if ( hasTarget && target !=
"_self" && target !=
"_top" && target !=
"_blank" && target !=
"_parent" )
3963 khtml::ChildFrame *frame = recursiveFrameRequest(
this, cURL, args,
false );
3966 args.
metaData()[
"referrer"] = d->m_referrer;
3967 requestObject( frame, cURL, args );
3972 if (!d->m_referrer.isEmpty() && !args.
metaData().contains(
"referrer"))
3973 args.
metaData()[
"referrer"] = d->m_referrer;
3976 if ( button == Qt::NoButton && (state & ShiftButton) && (state & ControlButton) )
3978 emit d->m_extension->createNewWindow( cURL, args );
3982 if ( state & ShiftButton)
3985 winArgs.lowerWindow =
true;
3987 emit d->m_extension->createNewWindow( cURL, args, winArgs, newPart );
3994 if (cURL.
hasRef() && (!hasTarget || target ==
"_self"))
3997 if (urlcmp(cURL.
url(), curUrl.
url(),
4002 emit d->m_extension->openURLNotify();
4010 if ( !d->m_bComplete && !hasTarget )
4013 view()->viewport()->unsetCursor();
4014 emit d->m_extension->openURLRequest( cURL, args );
4018 void KHTMLPart::slotViewDocumentSource()
4021 bool isTempFile =
false;
4024 KTempFile sourceFile(TQString(), defaultExtension());
4025 if (sourceFile.status() == 0)
4029 url.setPath(sourceFile.name());
4034 (void) KRun::runURL( url, TQString::fromLatin1(
"text/plain"), isTempFile );
4037 void KHTMLPart::slotViewPageInfo()
4039 KHTMLInfoDlg *dlg =
new KHTMLInfoDlg(NULL,
"KHTML Page Info Dialog",
false, (WFlags)WDestructiveClose);
4040 dlg->_close->setGuiItem(KStdGuiItem::close());
4043 dlg->_title->setText(d->m_doc->title().string());
4046 if (
parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
4047 dlg->setCaption(i18n(
"Frame Information"));
4050 TQString editStr = TQString();
4052 if (!d->m_pageServices.isEmpty())
4053 editStr = i18n(
" <a href=\"%1\">[Properties]</a>").arg(d->m_pageServices);
4056 dlg->_url->setText(
"<a href=\"" +
url().
url() +
"\">" + squeezedURL +
"</a>" + editStr);
4059 dlg->_lastModified->hide();
4060 dlg->_lmLabel->hide();
4066 if (enc.isEmpty()) {
4067 dlg->_eLabel->hide();
4068 dlg->_encoding->hide();
4070 dlg->_encoding->setText(enc);
4073 const TQStringList headers = TQStringList::split(
"\n", d->m_httpHeaders);
4075 TQStringList::ConstIterator it = headers.begin();
4076 const TQStringList::ConstIterator itEnd = headers.end();
4078 for (; it != itEnd; ++it) {
4079 const TQStringList header = TQStringList::split(TQRegExp(
":[ ]+"), *it);
4080 if (header.count() != 2)
4082 new TQListViewItem(dlg->_headers, header[0], header[1]);
4090 void KHTMLPart::slotViewFrameSource()
4097 bool isTempFile =
false;
4098 if (!(url.
isLocalFile()) && frame->inherits(
"KHTMLPart"))
4100 long cacheId =
static_cast<KHTMLPart *
>(frame)->d->m_cacheId;
4104 KTempFile sourceFile(TQString(), defaultExtension());
4105 if (sourceFile.status() == 0)
4109 url.
setPath(sourceFile.name());
4115 (void) KRun::runURL( url, TQString::fromLatin1(
"text/plain"), isTempFile );
4121 if (!d->m_doc || !d->m_doc->isHTMLDocument())
4124 TQString relURL =
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4129 void KHTMLPart::slotSaveBackground()
4131 KIO::MetaData metaData;
4132 metaData[
"referrer"] = d->m_referrer;
4133 KHTMLPopupGUIClient::saveURL( d->m_view, i18n(
"Save Background Image As"),
backgroundURL(), metaData );
4136 void KHTMLPart::slotSaveDocument()
4140 if ( srcURL.fileName(
false).isEmpty() )
4141 srcURL.setFileName(
"index" + defaultExtension() );
4143 KIO::MetaData metaData;
4145 KHTMLPopupGUIClient::saveURL( d->m_view, i18n(
"Save As" ), srcURL, metaData,
"text/html", d->m_cacheId );
4148 void KHTMLPart::slotSecurity()
4168 KSSLInfoDlg *kid =
new KSSLInfoDlg(d->m_ssl_in_use,
widget(),
"kssl_info_dlg",
true );
4170 if (d->m_bSecurityInQuestion)
4171 kid->setSecurityInQuestion(
true);
4173 if (d->m_ssl_in_use) {
4174 KSSLCertificate *x = KSSLCertificate::fromString(d->m_ssl_peer_certificate.local8Bit());
4177 const TQStringList cl = TQStringList::split(TQString(
"\n"), d->m_ssl_peer_chain);
4178 TQPtrList<KSSLCertificate> ncl;
4180 ncl.setAutoDelete(
true);
4181 TQStringList::ConstIterator it = cl.begin();
4182 const TQStringList::ConstIterator itEnd = cl.end();
4183 for (; it != itEnd; ++it) {
4184 KSSLCertificate*
const y = KSSLCertificate::fromString((*it).local8Bit());
4185 if (y) ncl.append(y);
4188 if (ncl.count() > 0)
4189 x->chain().setChain(ncl);
4195 d->m_ssl_cipher_desc,
4196 d->m_ssl_cipher_version,
4197 d->m_ssl_cipher_used_bits.toInt(),
4198 d->m_ssl_cipher_bits.toInt(),
4199 (KSSLCertificate::KSSLValidation) d->m_ssl_cert_state.toInt()
4207 void KHTMLPart::slotSaveFrame()
4215 if ( srcURL.fileName(
false).isEmpty() )
4216 srcURL.
setFileName(
"index" + defaultExtension() );
4218 KIO::MetaData metaData;
4220 KHTMLPopupGUIClient::saveURL( d->m_view, i18n(
"Save Frame As" ), srcURL, metaData,
"text/html" );
4223 void KHTMLPart::slotSetEncoding()
4225 d->m_automaticDetection->setItemChecked(
int( d->m_autoDetectLanguage ),
false );
4226 d->m_paSetEncoding->popupMenu()->setItemChecked( 0,
false );
4227 d->m_paSetEncoding->popupMenu()->setItemChecked( d->m_paSetEncoding->popupMenu()->idAt( 2 ), true );
4233 void KHTMLPart::slotUseStylesheet()
4237 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
4238 d->m_sheetUsed = autoselect ? TQString() : d->m_paUseStylesheet->currentText();
4239 d->m_doc->updateStyleSelector();
4243 void KHTMLPart::updateActions()
4245 bool frames =
false;
4247 TQValueList<khtml::ChildFrame*>::ConstIterator it = d->m_frames.begin();
4248 const TQValueList<khtml::ChildFrame*>::ConstIterator end = d->m_frames.end();
4249 for (; it !=
end; ++it )
4250 if ( (*it)->m_type == khtml::ChildFrame::Frame )
4256 d->m_paViewFrame->setEnabled( frames );
4257 d->m_paSaveFrame->setEnabled( frames );
4260 d->m_paFind->setText( i18n(
"&Find in Frame..." ) );
4262 d->m_paFind->setText( i18n(
"&Find..." ) );
4269 bool enableFindAndSelectAll =
true;
4272 enableFindAndSelectAll = frame->inherits(
"KHTMLPart" );
4274 d->m_paFind->setEnabled( enableFindAndSelectAll );
4275 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
4277 bool enablePrintFrame =
false;
4283 enablePrintFrame = ext->metaObject()->slotNames().contains(
"print()" );
4286 d->m_paPrintFrame->setEnabled( enablePrintFrame );
4291 if ( d->m_doc && d->m_doc->isHTMLDocument() &&
static_cast<HTMLDocumentImpl*
>(d->m_doc)->body() && !d->m_bClearing )
4292 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4294 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
4296 if ( d->m_paDebugScript )
4297 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
4301 const ConstFrameIt end = d->m_objects.end();
4302 for(ConstFrameIt it = d->m_objects.begin(); it !=
end; ++it )
4303 if ((*it)->m_frame == frame)
4304 return (*it)->m_liveconnect;
4308 bool KHTMLPart::requestFrame( khtml::RenderPart *frame,
const TQString &url,
const TQString &frameName,
4309 const TQStringList ¶ms,
bool isIFrame )
4312 FrameIt it = d->m_frames.find( frameName );
4313 if ( it == d->m_frames.end() )
4315 khtml::ChildFrame * child =
new khtml::ChildFrame;
4317 child->m_name = frameName;
4318 it = d->m_frames.append( child );
4321 (*it)->m_type = isIFrame ? khtml::ChildFrame::IFrame : khtml::ChildFrame::Frame;
4322 (*it)->m_frame = frame;
4323 (*it)->m_params = params;
4326 if ( url.find( TQString::fromLatin1(
"javascript:" ), 0,
false ) == 0 )
4328 if ( processObjectRequest(*it,
KURL(
"about:blank"), TQString(
"text/html") ) ) {
4333 if ( res.type() == TQVariant::String ) {
4335 p->
write( res.asString() );
4343 return requestObject( *it, u );
4346 TQString KHTMLPart::requestFrameName()
4348 return TQString::fromLatin1(
"<!--frame %1-->").arg(d->m_frameNameId++);
4351 bool KHTMLPart::requestObject( khtml::RenderPart *frame,
const TQString &url,
const TQString &serviceType,
4352 const TQStringList ¶ms )
4355 khtml::ChildFrame *child =
new khtml::ChildFrame;
4356 FrameIt it = d->m_objects.append( child );
4357 (*it)->m_frame = frame;
4358 (*it)->m_type = khtml::ChildFrame::Object;
4359 (*it)->m_params = params;
4363 if (!requestObject( *it,
completeURL( url ), args ) && !(*it)->m_run) {
4364 (*it)->m_bCompleted =
true;
4370 bool KHTMLPart::requestObject( khtml::ChildFrame *child,
const KURL &url,
const KParts::URLArgs &_args )
4372 if (!checkLinkSecurity(url))
4374 kdDebug(6005) <<
this <<
" KHTMLPart::requestObject checkLinkSecurity refused" <<
endl;
4377 if ( child->m_bPreloaded )
4379 kdDebug(6005) <<
"KHTMLPart::requestObject preload" <<
endl;
4380 if ( child->m_frame && child->m_part )
4381 child->m_frame->setWidget( child->m_part->widget() );
4383 child->m_bPreloaded =
false;
4392 child->m_run->abort();
4394 if ( child->m_part && !args.
reload && urlcmp( child->m_part->url().url(), url.
url(),
true, true ) )
4397 child->m_args = args;
4398 child->m_args.
reload = (d->m_cachePolicy == KIO::CC_Reload);
4399 child->m_serviceName = TQString();
4400 if (!d->m_referrer.isEmpty() && !child->m_args.metaData().contains(
"referrer" ))
4401 child->m_args.metaData()[
"referrer"] = d->m_referrer;
4403 child->m_args.metaData().insert(
"PropagateHttpHeader",
"true");
4404 child->m_args.metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4405 child->m_args.metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4406 child->m_args.metaData().insert(
"main_frame_request",
4408 child->m_args.metaData().insert(
"ssl_was_in_use",
4409 d->m_ssl_in_use ?
"TRUE":
"FALSE");
4410 child->m_args.metaData().insert(
"ssl_activate_warnings",
"TRUE");
4411 child->m_args.metaData().insert(
"cross-domain",
toplevelURL().
url());
4415 args.
serviceType = TQString::fromLatin1(
"text/html" );
4418 kdDebug(6050) <<
"Running new KHTMLRun for " <<
this <<
" and child=" << child <<
endl;
4419 child->m_run =
new KHTMLRun(
this, child, url, child->m_args,
true );
4420 d->m_bComplete =
false;
4423 return processObjectRequest( child, url, args.
serviceType );
4427 bool KHTMLPart::processObjectRequest( khtml::ChildFrame *child,
const KURL &_url,
const TQString &mimetype )
4437 if ( d->m_onlyLocalReferences || ( url.
isEmpty() && mimetype.isEmpty() ) )
4439 child->m_bCompleted =
true;
4444 if (child->m_bNotify)
4446 child->m_bNotify =
false;
4447 if ( !child->m_args.lockHistory() )
4448 emit d->m_extension->openURLNotify();
4451 if ( child->m_serviceType != mimetype || !child->m_part )
4456 if ( child->m_type != khtml::ChildFrame::Object )
4458 TQString suggestedFilename;
4460 suggestedFilename = child->m_run->suggestedFilename();
4463 url, mimetype, suggestedFilename );
4465 case KParts::BrowserRun::Save:
4466 KHTMLPopupGUIClient::saveURL(
widget(), i18n(
"Save As" ), url, child->m_args.metaData(), TQString(), 0, suggestedFilename);
4468 case KParts::BrowserRun::Cancel:
4469 child->m_bCompleted =
true;
4478 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 );
4482 if ( child->m_frame )
4483 if (child->m_frame->partLoadingErrorNotify( child, url, mimetype ))
4486 checkEmitLoadEvent();
4491 if ( child->m_part )
4493 if (!::tqqt_cast<KHTMLPart*>(child->m_part) && child->m_jscript)
4494 child->m_jscript->clear();
4497 if (child->m_liveconnect) {
4498 disconnect(child->m_liveconnect, TQT_SIGNAL(partEvent(
const unsigned long,
const TQString &,
const KParts::LiveConnectExtension::ArgList &)), child, TQT_SLOT(liveConnectEvent(
const unsigned long,
const TQString&,
const KParts::LiveConnectExtension::ArgList &)));
4499 child->m_liveconnect = 0L;
4503 child->m_serviceType = mimetype;
4504 if ( child->m_frame && part->
widget() )
4505 child->m_frame->setWidget( part->
widget() );
4507 if ( child->m_type != khtml::ChildFrame::Object )
4512 child->m_part = part;
4514 if (::tqqt_cast<KHTMLPart*>(part)) {
4515 static_cast<KHTMLPart*
>(part)->d->m_frame = child;
4516 }
else if (child->m_frame) {
4517 child->m_liveconnect = KParts::LiveConnectExtension::childObject(part);
4518 if (child->m_liveconnect)
4519 connect(child->m_liveconnect, TQT_SIGNAL(partEvent(
const unsigned long,
const TQString &,
const KParts::LiveConnectExtension::ArgList &)), child, TQT_SLOT(liveConnectEvent(
const unsigned long,
const TQString&,
const KParts::LiveConnectExtension::ArgList &)));
4523 sb->
setStatusBar( d->m_statusBarExtension->statusBar() );
4525 connect( part, TQT_SIGNAL(
started( KIO::Job *) ),
4526 this, TQT_SLOT( slotChildStarted( KIO::Job *) ) );
4527 connect( part, TQT_SIGNAL(
completed() ),
4528 this, TQT_SLOT( slotChildCompleted() ) );
4529 connect( part, TQT_SIGNAL(
completed(
bool) ),
4530 this, TQT_SLOT( slotChildCompleted(
bool) ) );
4531 connect( part, TQT_SIGNAL( setStatusBarText(
const TQString & ) ),
4532 this, TQT_SIGNAL( setStatusBarText(
const TQString & ) ) );
4533 if ( part->inherits(
"KHTMLPart" ) )
4535 connect(
this, TQT_SIGNAL(
completed() ),
4536 part, TQT_SLOT( slotParentCompleted() ) );
4537 connect(
this, TQT_SIGNAL(
completed(
bool) ),
4538 part, TQT_SLOT( slotParentCompleted() ) );
4541 connect( part, TQT_SIGNAL( docCreated() ),
4542 this, TQT_SLOT( slotChildDocCreated() ) );
4547 if ( child->m_extension )
4549 connect( child->m_extension, TQT_SIGNAL( openURLNotify() ),
4550 d->m_extension, TQT_SIGNAL( openURLNotify() ) );
4552 connect( child->m_extension, TQT_SIGNAL( openURLRequestDelayed(
const KURL &,
const KParts::URLArgs & ) ),
4555 connect( child->m_extension, TQT_SIGNAL( createNewWindow(
const KURL &,
const KParts::URLArgs & ) ),
4560 connect( child->m_extension, TQT_SIGNAL(
popupMenu(
const TQPoint &,
const KFileItemList & ) ),
4561 d->m_extension, TQT_SIGNAL(
popupMenu(
const TQPoint &,
const KFileItemList & ) ) );
4562 connect( child->m_extension, TQT_SIGNAL(
popupMenu(
KXMLGUIClient *,
const TQPoint &,
const KFileItemList & ) ),
4566 connect( child->m_extension, TQT_SIGNAL(
popupMenu(
const TQPoint &,
const KURL &,
const TQString &, mode_t ) ),
4567 d->m_extension, TQT_SIGNAL(
popupMenu(
const TQPoint &,
const KURL &,
const TQString &, mode_t ) ) );
4568 connect( child->m_extension, TQT_SIGNAL(
popupMenu(
KXMLGUIClient *,
const TQPoint &,
const KURL &,
const TQString &, mode_t ) ),
4573 connect( child->m_extension, TQT_SIGNAL( infoMessage(
const TQString & ) ),
4574 d->m_extension, TQT_SIGNAL( infoMessage(
const TQString & ) ) );
4579 child->m_extension->setBrowserInterface( d->m_extension->browserInterface() );
4582 else if ( child->m_frame && child->m_part &&
4583 child->m_frame->widget() != child->m_part->widget() )
4584 child->m_frame->setWidget( child->m_part->widget() );
4586 checkEmitLoadEvent();
4589 if ( !child->m_part )
4592 if ( child->m_bPreloaded )
4594 if ( child->m_frame && child->m_part )
4595 child->m_frame->setWidget( child->m_part->widget() );
4597 child->m_bPreloaded =
false;
4601 child->m_args.reload = (d->m_cachePolicy == KIO::CC_Reload);
4607 child->m_args.serviceType = mimetype;
4610 child->m_bCompleted = child->m_type == khtml::ChildFrame::Object;
4612 if ( child->m_extension )
4613 child->m_extension->setURLArgs( child->m_args );
4615 if(url.
protocol() ==
"javascript" || url.
url() ==
"about:blank") {
4616 if (!child->m_part->inherits(
"KHTMLPart"))
4622 if (d->m_doc && p->d->m_doc)
4623 p->d->m_doc->setBaseURL(d->m_doc->baseURL());
4624 if (!url.
url().startsWith(
"about:")) {
4629 p->
write(
"<HTML><TITLE></TITLE><BODY></BODY></HTML>");
4637 bool b = child->m_part->openURL( url );
4638 if (child->m_bCompleted)
4644 child->m_bCompleted =
true;
4651 TQObject *parent,
const char *name,
const TQString &mimetype,
4652 TQString &serviceName, TQStringList &serviceTypes,
4653 const TQStringList ¶ms )
4656 if ( !serviceName.isEmpty() )
4657 constr.append( TQString::fromLatin1(
"Name == '%1'" ).arg( serviceName ) );
4659 KTrader::OfferList offers = KTrader::self()->query( mimetype,
"KParts/ReadOnlyPart", constr, TQString() );
4661 if ( offers.isEmpty() ) {
4662 int pos = mimetype.find(
"-plugin" );
4665 TQString stripped_mime = mimetype.left( pos );
4666 offers = KTrader::self()->query( stripped_mime,
"KParts/ReadOnlyPart", constr, TQString() );
4667 if ( offers.isEmpty() )
4671 KTrader::OfferList::ConstIterator it = offers.begin();
4672 const KTrader::OfferList::ConstIterator itEnd = offers.end();
4673 for ( ; it != itEnd; ++it )
4675 KService::Ptr service = (*it);
4681 const char *className =
"KParts::ReadOnlyPart";
4682 if ( service->serviceTypes().contains(
"Browser/View" ) )
4683 className =
"Browser/View";
4685 if ( factory->inherits(
"KParts::Factory" ) )
4686 res = static_cast<KParts::ReadOnlyPart *>(static_cast<KParts::Factory *>( factory )->createPart( parentWidget, widgetName, parent, name, className, params ));
4688 res =
static_cast<KParts::ReadOnlyPart *
>(factory->create( TQT_TQOBJECT(parentWidget), widgetName, className ));
4691 serviceTypes = service->serviceTypes();
4692 serviceName = service->name();
4697 kdWarning() << TQString(TQString(
"There was an error loading the module %1.\nThe diagnostics is:\n%2")
4706 if ( !d->m_manager && d->m_view )
4708 d->m_manager =
new KParts::PartManager( d->m_view->topLevelWidget(),
this,
"khtml part manager" );
4710 connect( d->m_manager, TQT_SIGNAL( activePartChanged(
KParts::Part * ) ),
4711 this, TQT_SLOT( slotActiveFrameChanged(
KParts::Part * ) ) );
4712 connect( d->m_manager, TQT_SIGNAL( partRemoved(
KParts::Part * ) ),
4716 return d->m_manager;
4719 void KHTMLPart::submitFormAgain()
4721 disconnect(
this, TQT_SIGNAL(
completed()),
this, TQT_SLOT(submitFormAgain()));
4722 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
4723 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 );
4725 delete d->m_submitForm;
4726 d->m_submitForm = 0;
4729 void KHTMLPart::submitFormProxy(
const char *action,
const TQString &url,
const TQByteArray &formData,
const TQString &_target,
const TQString& contentType,
const TQString& boundary )
4731 submitForm(action, url, formData, _target, contentType, boundary);
4734 void KHTMLPart::submitForm(
const char *action,
const TQString &url,
const TQByteArray &formData,
const TQString &_target,
const TQString& contentType,
const TQString& boundary )
4736 kdDebug(6000) <<
this <<
": KHTMLPart::submitForm target=" << _target <<
" url=" << url <<
endl;
4737 if (d->m_formNotification == KHTMLPart::Only) {
4740 }
else if (d->m_formNotification == KHTMLPart::Before) {
4764 if (!d->m_submitForm) {
4766 if (d->m_ssl_in_use) {
4768 "\nA third party may be able to intercept and view this information."
4769 "\nAre you sure you wish to continue?"),
4770 i18n(
"Network Transmission"),
KGuiItem(i18n(
"&Send Unencrypted")));
4774 KSSLSettings kss(
true);
4775 if (kss.warnOnUnencrypted()) {
4777 i18n(
"Warning: Your data is about to be transmitted across the network unencrypted."
4778 "\nAre you sure you wish to continue?"),
4779 i18n(
"Network Transmission"),
4780 KGuiItem(i18n(
"&Send Unencrypted")),
4781 "WarnOnUnencryptedForm");
4783 KConfig *config = kapp->config();
4784 TQString grpNotifMsgs = TQString::fromLatin1(
"Notification Messages");
4787 if (!config->
readBoolEntry(
"WarnOnUnencryptedForm",
true)) {
4790 kss.setWarnOnUnencrypted(
false);
4801 i18n(
"This site is attempting to submit form data via email.\n"
4802 "Do you want to continue?"),
4803 i18n(
"Network Transmission"),
4805 "WarnTriedEmailSubmit");
4816 TQString urlstring = u.
url();
4818 if ( urlstring.find( TQString::fromLatin1(
"javascript:" ), 0,
false ) == 0 ) {
4820 crossFrameExecuteScript( _target, urlstring.right( urlstring.length() - 11) );
4824 if (!checkLinkSecurity(u,
4825 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?" ),
4831 if (!d->m_referrer.isEmpty())
4832 args.
metaData()[
"referrer"] = d->m_referrer;
4834 args.
metaData().insert(
"PropagateHttpHeader",
"true");
4835 args.
metaData().insert(
"ssl_parent_ip", d->m_ssl_parent_ip);
4836 args.
metaData().insert(
"ssl_parent_cert", d->m_ssl_parent_cert);
4837 args.
metaData().insert(
"main_frame_request",
4839 args.
metaData().insert(
"ssl_was_in_use", d->m_ssl_in_use ?
"TRUE":
"FALSE");
4840 args.
metaData().insert(
"ssl_activate_warnings",
"TRUE");
4844 args.
frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
4849 TQString q = u.
query().mid(1);
4850 TQStringList nvps = TQStringList::split(
"&", q);
4851 bool triedToAttach =
false;
4853 TQStringList::Iterator nvp = nvps.begin();
4854 const TQStringList::Iterator nvpEnd = nvps.end();
4859 while (nvp != nvpEnd) {
4860 const TQStringList pair = TQStringList::split(
"=", *nvp);
4861 if (pair.count() >= 2) {
4862 if (pair.first().lower() ==
"attach") {
4863 nvp = nvps.remove(nvp);
4864 triedToAttach =
true;
4874 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");
4878 if (contentType.lower() ==
"multipart/form-data") {
4882 }
else if (contentType.lower() ==
"text/plain") {
4884 TQString tmpbody = TQString::fromLatin1(formData.data(),
4886 tmpbody.replace(TQRegExp(
"[&]"),
"\n");
4887 tmpbody.replace(TQRegExp(
"[+]"),
" ");
4895 nvps.append(TQString(
"body=%1").arg(bodyEnc));
4900 if ( strcmp( action,
"get" ) == 0 ) {
4902 u.
setQuery( TQString::fromLatin1( formData.data(), formData.size() ) );
4910 if (contentType.isNull() || contentType ==
"application/x-www-form-urlencoded")
4911 args.
setContentType(
"Content-Type: application/x-www-form-urlencoded" );
4913 args.
setContentType(
"Content-Type: " + contentType +
"; boundary=" + boundary );
4916 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
4917 if( d->m_submitForm ) {
4918 kdDebug(6000) <<
"KHTMLPart::submitForm ABORTING!" <<
endl;
4921 d->m_submitForm =
new KHTMLPartPrivate::SubmitForm;
4922 d->m_submitForm->submitAction = action;
4923 d->m_submitForm->submitUrl =
url;
4924 d->m_submitForm->submitFormData = formData;
4925 d->m_submitForm->target = _target;
4926 d->m_submitForm->submitContentType = contentType;
4927 d->m_submitForm->submitBoundary = boundary;
4928 connect(
this, TQT_SIGNAL(
completed()),
this, TQT_SLOT(submitFormAgain()));
4932 emit d->m_extension->openURLRequest( u, args );
4942 KParts::BrowserExtension::PopupFlags itemflags=KParts::BrowserExtension::ShowBookmark | KParts::BrowserExtension::ShowReload;
4944 if ( linkUrl.isEmpty() ) {
4950 popupURL = khtmlPart->
url();
4953 itemflags = KParts::BrowserExtension::ShowTextSelectionItems;
4955 itemflags |= KParts::BrowserExtension::ShowNavigationItems;
4958 linkKURL = popupURL;
4961 if (!(d->m_strSelectedURLTarget).isEmpty() &&
4962 (d->m_strSelectedURLTarget.lower() !=
"_top") &&
4963 (d->m_strSelectedURLTarget.lower() !=
"_self") &&
4964 (d->m_strSelectedURLTarget.lower() !=
"_parent")) {
4965 if (d->m_strSelectedURLTarget.lower() ==
"_blank")
4979 KHTMLPopupGUIClient* client =
new KHTMLPopupGUIClient(
this, d->m_popupMenuXML, linkKURL );
4980 TQGuardedPtr<TQObject> guard( client );
4982 TQString mimetype = TQString::fromLatin1(
"text/html" );
4985 if (!linkUrl.isEmpty())
4989 mimetype = KMimeType::findByURL(popupURL,0,
true,
false)->name();
4993 const TQString fname(popupURL.
fileName(
false));
4994 if (!fname.isEmpty() && !popupURL.
hasRef() && popupURL.
query().isEmpty())
4996 KMimeType::Ptr pmt = KMimeType::findByPath(fname,0,
true);
5002 if (pmt->name() != KMimeType::defaultMimeType() &&
5003 !pmt->is(
"application/x-perl") &&
5004 !pmt->is(
"application/x-perl-module") &&
5005 !pmt->is(
"application/x-php") &&
5006 !pmt->is(
"application/x-python-bytecode") &&
5007 !pmt->is(
"application/x-python") &&
5008 !pmt->is(
"application/x-shellscript"))
5009 mimetype = pmt->name();
5016 emit d->m_extension->popupMenu( client, TQCursor::pos(), popupURL, args, itemflags, S_IFREG );
5018 if ( !guard.isNull() ) {
5020 emit
popupMenu(linkUrl, TQCursor::pos());
5021 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
5025 void KHTMLPart::slotParentCompleted()
5028 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
5031 d->m_redirectionTimer.start( 1000 * d->m_delayRedirect,
true );
5035 void KHTMLPart::slotChildStarted( KIO::Job *job )
5037 khtml::ChildFrame *child = frame( TQT_TQOBJECT_CONST(sender()) );
5041 child->m_bCompleted =
false;
5043 if ( d->m_bComplete )
5049 emit d->m_extension->openURLNotify();
5052 d->m_bComplete =
false;
5057 void KHTMLPart::slotChildCompleted()
5059 slotChildCompleted(
false );
5062 void KHTMLPart::slotChildCompleted(
bool pendingAction )
5064 khtml::ChildFrame *child = frame( TQT_TQOBJECT_CONST(sender()) );
5067 kdDebug(6050) <<
this <<
" slotChildCompleted child=" << child <<
" m_frame=" << child->m_frame <<
endl;
5068 child->m_bCompleted =
true;
5069 child->m_bPendingRedirection = pendingAction;
5075 void KHTMLPart::slotChildDocCreated()
5081 if ( d->m_doc && d->m_doc->isHTMLDocument() )
5083 if ( sender()->inherits(
"KHTMLPart") )
5085 DOMString domain =
static_cast<HTMLDocumentImpl*
>(d->m_doc)->domain();
5086 if (htmlFrame->d->m_doc && htmlFrame->d->m_doc->isHTMLDocument() )
5088 static_cast<HTMLDocumentImpl*>(htmlFrame->d->m_doc)->setDomain( domain );
5092 disconnect( htmlFrame, TQT_SIGNAL( docCreated() ),
this, TQT_SLOT( slotChildDocCreated() ) );
5097 khtml::ChildFrame *child = frame( TQT_TQOBJECT_CONST(sender())->parent() );
5101 TQString urlStr = url.
url();
5102 if ( urlStr.find( TQString::fromLatin1(
"javascript:" ), 0,
false ) == 0 ) {
5108 TQString frameName = args.
frameName.lower();
5109 if ( !frameName.isEmpty() ) {
5110 if ( frameName == TQString::fromLatin1(
"_top" ) )
5112 emit d->m_extension->openURLRequest( url, args );
5115 else if ( frameName == TQString::fromLatin1(
"_blank" ) )
5117 emit d->m_extension->createNewWindow( url, args );
5120 else if ( frameName == TQString::fromLatin1(
"_parent" ) )
5123 newArgs.frameName = TQString();
5125 emit d->m_extension->openURLRequest( url, newArgs );
5128 else if ( frameName != TQString::fromLatin1(
"_self" ) )
5130 khtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args );
5134 emit d->m_extension->openURLRequest( url, args );
5142 if ( child && child->m_type != khtml::ChildFrame::Object ) {
5144 child->m_bNotify =
true;
5145 requestObject( child, url, args );
5146 }
else if ( frameName==
"_self" )
5149 newArgs.frameName = TQString();
5150 emit d->m_extension->openURLRequest( url, newArgs );
5156 emit d->m_extension->requestFocus(
this);
5159 khtml::ChildFrame *KHTMLPart::frame(
const TQObject *obj )
5161 assert( obj->inherits(
"KParts::ReadOnlyPart" ) );
5164 FrameIt it = d->m_frames.begin();
5165 const FrameIt end = d->m_frames.end();
5166 for (; it !=
end; ++it )
5170 FrameIt oi = d->m_objects.begin();
5171 const FrameIt oiEnd = d->m_objects.end();
5172 for (; oi != oiEnd; ++oi )
5181 bool KHTMLPart::checkFrameAccess(
KHTMLPart *callingHtmlPart)
5183 if (callingHtmlPart ==
this)
5187 #ifdef DEBUG_FINDFRAME
5188 kdDebug(6050) <<
"KHTMLPart::checkFrameAccess: Empty part " <<
this <<
" URL = " <<
m_url <<
endl;
5199 #ifdef DEBUG_FINDFRAME
5200 kdDebug(6050) <<
"KHTMLPart::checkFrameAccess: actDomain = '" << actDomain.string() <<
"' destDomain = '" << destDomain.string() <<
"'" <<
endl;
5203 if (actDomain == destDomain)
5206 #ifdef DEBUG_FINDFRAME
5209 kdDebug(6050) <<
"KHTMLPart::checkFrameAccess: Unknown part/domain " << callingHtmlPart <<
" tries to access part " <<
this <<
endl;
5218 #ifdef DEBUG_FINDFRAME
5219 kdDebug(6050) <<
"KHTMLPart::findFrameParent: this = " <<
this <<
" URL = " <<
m_url <<
" name = " << name() <<
" findFrameParent( " << f <<
" )" <<
endl;
5224 if (!checkFrameAccess(callingHtmlPart))
5228 if (!childFrame && !
parentPart() && (TQString::fromLocal8Bit(name()) == f))
5231 FrameIt it = d->m_frames.find( f );
5232 const FrameIt end = d->m_frames.
end();
5235 #ifdef DEBUG_FINDFRAME
5236 kdDebug(6050) <<
"KHTMLPart::findFrameParent: FOUND!" <<
endl;
5243 it = d->m_frames.begin();
5244 for (; it !=
end; ++it )
5247 if ( p && p->inherits(
"KHTMLPart" ))
5260 khtml::ChildFrame *childFrame;
5265 if ( p && p->inherits(
"KHTMLPart" ))
5266 return static_cast<KHTMLPart *>(p);
5273 khtml::ChildFrame *childFrame;
5283 while ( part && part->inherits(
"KHTMLPart") &&
5284 static_cast<KHTMLPart *
>(part)->d->m_frames.count() > 0 ) {
5287 if ( !part )
return frameset;
5294 ConstFrameIt it = d->m_frames.find( frameName );
5295 if ( it == d->m_frames.end() )
5301 return (!(*it)->m_frame.isNull());
5308 return kp->jScript();
5310 FrameIt it = d->m_frames.begin();
5311 const FrameIt itEnd = d->m_frames.end();
5313 for (; it != itEnd; ++it)
5314 if (framePart == (*it)->m_part) {
5315 if (!(*it)->m_jscript)
5317 return (*it)->m_jscript;
5324 return ::tqqt_cast<
KHTMLPart *>( parent() );
5327 khtml::ChildFrame *KHTMLPart::recursiveFrameRequest(
KHTMLPart *callingHtmlPart,
const KURL &url,
5330 #ifdef DEBUG_FINDFRAME
5331 kdDebug( 6050 ) <<
"KHTMLPart::recursiveFrameRequest this = " <<
this <<
", frame = " << args.
frameName <<
", url = " << url <<
endl;
5333 khtml::ChildFrame *childFrame;
5337 if (childPart ==
this)
5340 childPart->requestObject( childFrame, url, args );
5346 khtml::ChildFrame *res =
parentPart()->recursiveFrameRequest( callingHtmlPart, url, args, callParent );
5349 parentPart()->requestObject( res, url, args );
5356 static int s_saveStateIndentLevel = 0;
5362 TQString indent = TQString().leftJustify( s_saveStateIndentLevel * 4,
' ' );
5363 const int indentLevel = s_saveStateIndentLevel++;
5364 kdDebug( 6050 ) << indent <<
"saveState this=" <<
this <<
" '" << name() <<
"' saving URL " <<
m_url.
url() <<
endl;
5367 stream <<
m_url << (TQ_INT32)d->m_view->contentsX() << (TQ_INT32)d->m_view->contentsY()
5368 << (TQ_INT32) d->m_view->contentsWidth() << (TQ_INT32) d->m_view->contentsHeight() << (TQ_INT32) d->m_view->marginWidth() << (TQ_INT32) d->m_view->marginHeight();
5371 int focusNodeNumber;
5372 if (!d->m_focusNodeRestored)
5373 focusNodeNumber = d->m_focusNodeNumber;
5374 else if (d->m_doc && d->m_doc->focusNode())
5375 focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
5377 focusNodeNumber = -1;
5378 stream << focusNodeNumber;
5381 stream << d->m_cacheId;
5384 TQStringList docState;
5387 docState = d->m_doc->docState();
5389 stream << d->m_encoding << d->m_sheetUsed << docState;
5391 stream << d->m_zoomFactor;
5393 stream << d->m_httpHeaders;
5394 stream << d->m_pageServices;
5395 stream << d->m_pageReferrer;
5398 stream << d->m_ssl_in_use
5399 << d->m_ssl_peer_certificate
5400 << d->m_ssl_peer_chain
5403 << d->m_ssl_cipher_desc
5404 << d->m_ssl_cipher_version
5405 << d->m_ssl_cipher_used_bits
5406 << d->m_ssl_cipher_bits
5407 << d->m_ssl_cert_state
5408 << d->m_ssl_parent_ip
5409 << d->m_ssl_parent_cert;
5412 TQStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
5414 TQValueList<TQByteArray> frameStateBufferLst;
5416 ConstFrameIt it = d->m_frames.begin();
5417 const ConstFrameIt end = d->m_frames.end();
5418 for (; it !=
end; ++it )
5420 if ( !(*it)->m_part )
5423 frameNameLst << (*it)->m_name;
5424 frameServiceTypeLst << (*it)->m_serviceType;
5425 frameServiceNameLst << (*it)->m_serviceName;
5426 frameURLLst << (*it)->m_part->url();
5429 TQDataStream frameStream( state, IO_WriteOnly );
5431 if ( (*it)->m_extension )
5432 (*it)->m_extension->saveState( frameStream );
5434 frameStateBufferLst << state;
5438 stream << (TQ_UINT32) frameNameLst.count();
5439 stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst;
5441 s_saveStateIndentLevel = indentLevel;
5448 TQ_INT32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
5449 TQ_UINT32 frameCount;
5450 TQStringList
frameNames, frameServiceTypes, docState, frameServiceNames;
5452 TQValueList<TQByteArray> frameStateBuffers;
5453 TQValueList<int> fSizes;
5455 long old_cacheId = d->m_cacheId;
5457 stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
5459 d->m_view->setMarginWidth( mWidth );
5460 d->m_view->setMarginHeight( mHeight );
5464 stream >> d->m_focusNodeNumber;
5465 d->m_focusNodeRestored =
false;
5467 stream >> d->m_cacheId;
5469 stream >> encoding >> sheetUsed >> docState;
5472 d->m_sheetUsed = sheetUsed;
5478 stream >> d->m_httpHeaders;
5479 stream >> d->m_pageServices;
5480 stream >> d->m_pageReferrer;
5483 stream >> d->m_ssl_in_use
5484 >> d->m_ssl_peer_certificate
5485 >> d->m_ssl_peer_chain
5488 >> d->m_ssl_cipher_desc
5489 >> d->m_ssl_cipher_version
5490 >> d->m_ssl_cipher_used_bits
5491 >> d->m_ssl_cipher_bits
5492 >> d->m_ssl_cert_state
5493 >> d->m_ssl_parent_ip
5494 >> d->m_ssl_parent_cert;
5496 setPageSecurity( d->m_ssl_in_use ? Encrypted : NotCrypted );
5498 stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
5499 >> frameURLs >> frameStateBuffers;
5501 d->m_bComplete =
false;
5502 d->m_bLoadEventEmitted =
false;
5508 if (d->m_cacheId == old_cacheId)
5511 d->m_redirectionTimer.stop();
5513 FrameIt fIt = d->m_frames.begin();
5514 const FrameIt fEnd = d->m_frames.end();
5516 for (; fIt != fEnd; ++fIt )
5517 (*fIt)->m_bCompleted =
false;
5519 fIt = d->m_frames.begin();
5521 TQStringList::ConstIterator fNameIt = frameNames.begin();
5522 TQStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
5523 TQStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
5524 KURL::List::ConstIterator fURLIt = frameURLs.begin();
5525 TQValueList<TQByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
5527 for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
5529 khtml::ChildFrame*
const child = *fIt;
5533 if ( child->m_name != *fNameIt || child->m_serviceType != *fServiceTypeIt )
5535 child->m_bPreloaded =
true;
5536 child->m_name = *fNameIt;
5537 child->m_serviceName = *fServiceNameIt;
5538 processObjectRequest( child, *fURLIt, *fServiceTypeIt );
5540 if ( child->m_part )
5542 child->m_bCompleted =
false;
5543 if ( child->m_extension && !(*fBufferIt).isEmpty() )
5545 TQDataStream frameStream( *fBufferIt, IO_ReadOnly );
5546 child->m_extension->restoreState( frameStream );
5549 child->m_part->openURL( *fURLIt );
5557 d->m_extension->setURLArgs( args );
5559 d->m_view->resizeContents( wContents, hContents);
5560 d->m_view->setContentsPos( xOffset, yOffset );
5570 d->m_bCleared =
false;
5573 d->m_sheetUsed = sheetUsed;
5575 TQStringList::ConstIterator fNameIt = frameNames.begin();
5576 const TQStringList::ConstIterator fNameEnd = frameNames.end();
5578 TQStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
5579 TQStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
5580 KURL::List::ConstIterator fURLIt = frameURLs.begin();
5581 TQValueList<TQByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
5583 for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
5585 khtml::ChildFrame*
const newChild =
new khtml::ChildFrame;
5586 newChild->m_bPreloaded =
true;
5587 newChild->m_name = *fNameIt;
5588 newChild->m_serviceName = *fServiceNameIt;
5592 const FrameIt childFrame = d->m_frames.append( newChild );
5594 processObjectRequest( *childFrame, *fURLIt, *fServiceTypeIt );
5596 (*childFrame)->m_bPreloaded =
true;
5598 if ( (*childFrame)->m_part )
5600 if ( (*childFrame)->m_extension ) {
5601 if ( (*childFrame)->m_extension && !(*fBufferIt).isEmpty() )
5603 TQDataStream frameStream( *fBufferIt, IO_ReadOnly );
5604 (*childFrame)->m_extension->restoreState( frameStream );
5607 (*childFrame)->m_part->openURL( *fURLIt );
5618 d->m_extension->setURLArgs( args );
5621 d->m_restored =
true;
5623 d->m_restored =
false;
5647 return d->m_view->nodeUnderMouse();
5652 return d->m_view->nonSharedNodeUnderMouse();
5655 void KHTMLPart::emitSelectionChanged()
5657 emit d->m_extension->enableAction(
"copy",
hasSelection() );
5658 if ( d->m_findDialog )
5667 return d->m_zoomFactor;
5671 static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
5672 static const int zoomSizeCount = (
sizeof(zoomSizes) /
sizeof(
int));
5673 static const int minZoom = 20;
5674 static const int maxZoom = 300;
5677 extern const int KDE_NO_EXPORT fastZoomSizes[] = { 20, 50, 75, 90, 100, 120, 150, 200, 300 };
5678 extern const int KDE_NO_EXPORT fastZoomSizeCount =
sizeof fastZoomSizes /
sizeof fastZoomSizes[0];
5680 void KHTMLPart::slotIncZoom()
5682 zoomIn(zoomSizes, zoomSizeCount);
5685 void KHTMLPart::slotDecZoom()
5687 zoomOut(zoomSizes, zoomSizeCount);
5690 void KHTMLPart::slotIncZoomFast()
5692 zoomIn(fastZoomSizes, fastZoomSizeCount);
5695 void KHTMLPart::slotDecZoomFast()
5697 zoomOut(fastZoomSizes, fastZoomSizeCount);
5700 void KHTMLPart::zoomIn(
const int stepping[],
int count)
5704 if (zoomFactor < maxZoom) {
5706 for (
int i = 0; i < count; ++i)
5707 if (stepping[i] > zoomFactor) {
5708 zoomFactor = stepping[i];
5715 void KHTMLPart::zoomOut(
const int stepping[],
int count)
5717 int zoomFactor = d->m_zoomFactor;
5718 if (zoomFactor > minZoom) {
5720 for (
int i = count-1; i >= 0; --i)
5721 if (stepping[i] < zoomFactor) {
5722 zoomFactor = stepping[i];
5731 if (percent < minZoom) percent = minZoom;
5732 if (percent > maxZoom) percent = maxZoom;
5733 if (d->m_zoomFactor == percent)
return;
5734 d->m_zoomFactor = percent;
5737 TQApplication::setOverrideCursor( tqwaitCursor );
5738 if (d->m_doc->styleSelector())
5739 d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
5740 d->m_doc->recalcStyle( NodeImpl::Force );
5741 TQApplication::restoreOverrideCursor();
5744 ConstFrameIt it = d->m_frames.begin();
5745 const ConstFrameIt end = d->m_frames.end();
5746 for (; it !=
end; ++it )
5747 if ( !( *it )->m_part.isNull() && (*it)->m_part->inherits(
"KHTMLPart" ) ) {
5752 if ( d->m_guiProfile == BrowserViewGUI ) {
5753 d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
5754 d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
5758 void KHTMLPart::slotZoomView(
int delta )
5766 void KHTMLPart::setStatusBarText(
const TQString& text, StatusBarPriority p)
5768 if (!d->m_statusMessagesEnabled)
5771 d->m_statusBarText[p] = text;
5774 TQString tobe = d->m_statusBarText[BarHoverText];
5776 tobe = d->m_statusBarText[BarOverrideText];
5777 if (tobe.isEmpty()) {
5778 tobe = d->m_statusBarText[BarDefaultText];
5779 if (!tobe.isEmpty() && d->m_jobspeed)
5782 tobe += i18n(
"(%1/s)" ).arg( KIO::convertSize( d->m_jobspeed ) );
5786 emit ReadOnlyPart::setStatusBarText(tobe);
5792 setStatusBarText(text, BarOverrideText);
5797 setStatusBarText(text, BarDefaultText);
5802 return d->m_statusBarText[BarOverrideText];
5807 return d->m_statusBarText[BarDefaultText];
5812 return d->m_referrer;
5817 KURL referrerURL =
KURL( d->m_pageReferrer );
5820 TQString protocol = referrerURL.
protocol();
5822 if ((protocol ==
"http") ||
5825 referrerURL.
setRef(TQString());
5826 referrerURL.
setUser(TQString());
5827 referrerURL.
setPass(TQString());
5828 return referrerURL.
url();
5843 d->m_lastModified = lastModif.toString( Qt::LocalDate );
5846 return d->m_lastModified;
5849 void KHTMLPart::slotLoadImages()
5852 d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
5854 ConstFrameIt it = d->m_frames.begin();
5855 const ConstFrameIt end = d->m_frames.end();
5856 for (; it !=
end; ++it )
5857 if ( !( *it )->m_part.isNull() && (*it)->m_part->inherits(
"KHTMLPart" ) ) {
5859 static_cast<KHTMLPart*
>( p )->slotLoadImages();
5863 void KHTMLPart::reparseConfiguration()
5865 KHTMLSettings *settings = KHTMLFactory::defaultHTMLSettings();
5870 d->m_doc->docLoader()->setShowAnimations( settings->showAnimations() );
5872 d->m_bOpenMiddleClick = settings->isOpenMiddleClickEnabled();
5873 d->m_bBackRightClick = settings->isBackRightClickEnabled();
5874 d->m_bJScriptEnabled = settings->isJavaScriptEnabled(
m_url.
host());
5875 setDebugScript( settings->isJavaScriptDebugEnabled() );
5876 d->m_bJavaEnabled = settings->isJavaEnabled(
m_url.
host());
5877 d->m_bPluginsEnabled = settings->isPluginsEnabled(
m_url.
host());
5878 d->m_metaRefreshEnabled = settings->isAutoDelayedActionsEnabled ();
5880 delete d->m_settings;
5881 d->m_settings =
new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
5883 TQApplication::setOverrideCursor( tqwaitCursor );
5884 khtml::CSSStyleSelector::reparseConfiguration();
5885 if(d->m_doc) d->m_doc->updateStyleSelector();
5886 TQApplication::restoreOverrideCursor();
5888 if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled())
5896 ConstFrameIt it = d->m_frames.begin();
5897 const ConstFrameIt end = d->m_frames.end();
5898 for (; it !=
end; ++it )
5899 if (!(*it)->m_bPreloaded)
5900 res += (*it)->m_name;
5905 TQPtrList<KParts::ReadOnlyPart> KHTMLPart::frames()
const
5907 TQPtrList<KParts::ReadOnlyPart> res;
5909 ConstFrameIt it = d->m_frames.begin();
5910 const ConstFrameIt end = d->m_frames.end();
5911 for (; it !=
end; ++it )
5912 if (!(*it)->m_bPreloaded)
5913 res.append( (*it)->m_part );
5920 kdDebug( 6050 ) <<
this <<
"KHTMLPart::openURLInFrame " << url <<
endl;
5921 FrameIt it = d->m_frames.find( urlArgs.
frameName );
5923 if ( it == d->m_frames.end() )
5927 if ( !urlArgs.lockHistory() )
5928 emit d->m_extension->openURLNotify();
5930 requestObject( *it, url, urlArgs );
5945 void KHTMLPart::customEvent( TQCustomEvent *event )
5947 if ( khtml::MousePressEvent::test( event ) )
5953 if ( khtml::MouseDoubleClickEvent::test( event ) )
5959 if ( khtml::MouseMoveEvent::test( event ) )
5965 if ( khtml::MouseReleaseEvent::test( event ) )
5971 if ( khtml::DrawContentsEvent::test( event ) )
5977 KParts::ReadOnlyPart::customEvent( event );
5985 static bool firstRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&startNode,
long &startOffset)
5987 for (khtml::RenderObject *n = renderNode; n; n = n->nextSibling()) {
5989 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
5990 const khtml::InlineTextBoxArray &runs = textRenderer->inlineTextBoxes();
5991 const unsigned lim = runs.count();
5992 for (
unsigned i = 0; i != lim; ++i) {
5993 if (runs[i]->m_y == y && textRenderer->element()) {
5994 startNode = textRenderer->element();
5995 startOffset = runs[i]->m_start;
6001 if (firstRunAt(n->firstChild(), y, startNode, startOffset)) {
6014 static bool lastRunAt(khtml::RenderObject *renderNode,
int y, NodeImpl *&endNode,
long &endOffset)
6016 khtml::RenderObject *n = renderNode;
6020 khtml::RenderObject *
next;
6021 while ((next = n->nextSibling())) {
6026 if (lastRunAt(n->firstChild(), y, endNode, endOffset)) {
6031 khtml::RenderText*
const textRenderer =
static_cast<khtml::RenderText *
>(n);
6032 const khtml::InlineTextBoxArray &runs = textRenderer->inlineTextBoxes();
6033 for (
int i = (
int)runs.count()-1; i >= 0; --i) {
6034 if (runs[i]->m_y == y && textRenderer->element()) {
6035 endNode = textRenderer->element();
6036 endOffset = runs[i]->m_start + runs[i]->m_len;
6042 if (n == renderNode) {
6046 n = n->previousSibling();
6053 TQMouseEvent *_mouse =
event->qmouseEvent();
6054 DOM::Node innerNode =
event->innerNode();
6055 d->m_mousePressNode = innerNode;
6057 d->m_dragStartPos = _mouse->pos();
6059 if ( !event->url().isNull() ) {
6060 d->m_strSelectedURL =
event->url().string();
6061 d->m_strSelectedURLTarget =
event->target().string();
6064 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
6066 if ( _mouse->button() == Qt::LeftButton ||
6067 _mouse->button() == Qt::MidButton )
6069 d->m_bMousePressed =
true;
6071 #ifndef KHTML_NO_SELECTION
6072 if ( _mouse->button() == Qt::LeftButton )
6074 if ( (!d->m_strSelectedURL.isNull() && !
isEditable())
6075 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) )
6077 if ( !innerNode.
isNull() && innerNode.handle()->renderer()) {
6079 DOM::NodeImpl* node = 0;
6080 khtml::RenderObject::SelPointState state;
6081 innerNode.handle()->renderer()->checkSelectionPoint( event->x(),
event->y(),
6082 event->absX()-innerNode.handle()->renderer()->xPos(),
6083 event->absY()-innerNode.handle()->renderer()->yPos(), node, offset, state );
6084 d->m_extendMode = d->ExtendByChar;
6085 #ifdef KHTML_NO_CARET
6086 d->m_selectionStart = node;
6087 d->m_startOffset = offset;
6093 d->m_selectionEnd = d->m_selectionStart;
6094 d->m_endOffset = d->m_startOffset;
6095 d->m_doc->clearSelection();
6096 #else // KHTML_NO_CARET
6097 d->m_view->moveCaretTo(node, offset, (_mouse->state() & ShiftButton) == 0);
6098 #endif // KHTML_NO_CARET
6099 d->m_initialNode = d->m_selectionStart;
6100 d->m_initialOffset = d->m_startOffset;
6105 #ifndef KHTML_NO_CARET
6112 emitSelectionChanged();
6116 d->m_dragLastPos = _mouse->globalPos();
6120 if ( _mouse->button() == Qt::RightButton &&
parentPart() != 0 && d->m_bBackRightClick )
6122 d->m_bRightMousePressed =
true;
6123 }
else if ( _mouse->button() == Qt::RightButton )
6132 TQMouseEvent *_mouse =
event->qmouseEvent();
6133 if ( _mouse->button() == Qt::LeftButton )
6135 d->m_bMousePressed =
true;
6136 DOM::Node innerNode =
event->innerNode();
6138 if ( !innerNode.
isNull() && innerNode.handle()->renderer()) {
6140 DOM::NodeImpl* node = 0;
6141 khtml::RenderObject::SelPointState state;
6142 innerNode.handle()->renderer()->checkSelectionPoint( event->x(),
event->y(),
6143 event->absX()-innerNode.handle()->renderer()->xPos(),
6144 event->absY()-innerNode.handle()->renderer()->yPos(), node, offset, state);
6148 if ( node && node->renderer() )
6151 bool selectLine = (
event->clickCount() == 3);
6152 d->m_extendMode = selectLine ? d->ExtendByLine : d->ExtendByWord;
6155 if (_mouse->state() & ShiftButton) {
6156 d->caretNode() = node;
6157 d->caretOffset() = offset;
6158 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
6159 d->m_selectionStart.handle(), d->m_startOffset,
6160 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
6161 d->m_initialNode = d->m_extendAtEnd ? d->m_selectionStart : d->m_selectionEnd;
6162 d->m_initialOffset = d->m_extendAtEnd ? d->m_startOffset : d->m_endOffset;
6164 d->m_selectionStart = d->m_selectionEnd = node;
6165 d->m_startOffset = d->m_endOffset = offset;
6166 d->m_startBeforeEnd =
true;
6167 d->m_initialNode = node;
6168 d->m_initialOffset = offset;
6173 extendSelection( d->m_selectionStart.handle(), d->m_startOffset, d->m_selectionStart, d->m_startOffset, !d->m_startBeforeEnd, selectLine );
6175 extendSelection( d->m_selectionEnd.handle(), d->m_endOffset, d->m_selectionEnd, d->m_endOffset, d->m_startBeforeEnd, selectLine );
6180 emitSelectionChanged();
6182 ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
6183 d->m_selectionEnd.handle(),d->m_endOffset);
6184 #ifndef KHTML_NO_CARET
6185 bool v = d->m_view->placeCaret();
6186 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
6194 void KHTMLPart::extendSelection( DOM::NodeImpl* node,
long offset,
DOM::Node& selectionNode,
long& selectionOffset,
bool right,
bool selectLines )
6196 khtml::RenderObject* obj = node->renderer();
6198 if (obj->isText() && selectLines) {
6200 khtml::RenderText *renderer =
static_cast<khtml::RenderText *
>(obj);
6201 khtml::InlineTextBox *run = renderer->findInlineTextBox( offset, pos );
6203 DOM::NodeImpl* selNode = 0;
6209 int selectionPointY = run->m_y;
6212 khtml::RenderObject *renderNode = renderer;
6213 while (renderNode && renderNode->isInline())
6214 renderNode = renderNode->parent();
6216 renderNode = renderNode->firstChild();
6221 if (!lastRunAt (renderNode, selectionPointY, selNode, selOfs))
6226 if (!firstRunAt (renderNode, selectionPointY, selNode, selOfs))
6230 selectionNode = selNode;
6231 selectionOffset = selOfs;
6237 if ( obj->isText() ) {
6238 str =
static_cast<khtml::RenderText *
>(obj)->data().string();
6246 selectionNode = node;
6247 selectionOffset = offset;
6251 while ( obj && ( (right && offset >= len-1) || (!right && offset <= 0) ) )
6253 obj = right ? obj->objectBelow() : obj->objectAbove();
6258 if ( obj->isText() )
6259 str = static_cast<khtml::RenderText *>(obj)->data().string();
6260 else if ( obj->isBR() )
6262 else if ( !obj->isInline() ) {
6277 node = obj->element();
6280 Q_ASSERT( offset < len-1 );
6285 Q_ASSERT( offset > 0 );
6290 ch = str[ (int)offset ];
6292 }
while ( !ch.isSpace() && !ch.isPunct() );
6295 if (right) ++selectionOffset;
6298 #ifndef KHTML_NO_SELECTION
6299 void KHTMLPart::extendSelectionTo(
int x,
int y,
int absX,
int absY,
const DOM::Node &innerNode)
6303 DOM::NodeImpl* node=0;
6304 khtml::RenderObject::SelPointState state;
6305 innerNode.handle()->renderer()->checkSelectionPoint( x, y,
6306 absX-innerNode.handle()->renderer()->xPos(),
6307 absY-innerNode.handle()->renderer()->yPos(), node, offset, state);
6308 if (!node || !node->renderer())
return;
6313 bool withinNode = innerNode == node;
6317 if (d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() ||
6318 d->m_initialNode.isNull() ||
6319 !d->m_selectionStart.handle()->renderer() ||
6320 !d->m_selectionEnd.handle()->renderer())
return;
6322 if (d->m_extendMode != d->ExtendByChar) {
6324 bool caretBeforeInit = RangeImpl::compareBoundaryPoints(
6325 d->caretNode().handle(), d->caretOffset(),
6326 d->m_initialNode.handle(), d->m_initialOffset) <= 0;
6327 bool nodeBeforeInit = RangeImpl::compareBoundaryPoints(node, offset,
6328 d->m_initialNode.handle(), d->m_initialOffset) <= 0;
6330 if (caretBeforeInit != nodeBeforeInit) {
6332 extendSelection(d->m_initialNode.handle(), d->m_initialOffset,
6333 d->m_extendAtEnd ? d->m_selectionStart : d->m_selectionEnd,
6334 d->m_extendAtEnd ? d->m_startOffset : d->m_endOffset,
6335 nodeBeforeInit, d->m_extendMode == d->ExtendByLine);
6339 d->caretNode() = node;
6340 d->caretOffset() = offset;
6343 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
6344 d->m_selectionStart.handle(), d->m_startOffset,
6345 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
6347 if ( !d->m_selectionStart.isNull() && !d->m_selectionEnd.isNull() )
6350 if (d->m_extendMode != d->ExtendByChar && withinNode)
6351 extendSelection( node, offset, d->caretNode(), d->caretOffset(), d->m_startBeforeEnd ^ !d->m_extendAtEnd, d->m_extendMode == d->ExtendByLine );
6353 if (d->m_selectionEnd == d->m_selectionStart && d->m_endOffset < d->m_startOffset)
6355 ->setSelection(d->m_selectionStart.handle(),d->m_endOffset,
6356 d->m_selectionEnd.handle(),d->m_startOffset);
6357 else if (d->m_startBeforeEnd)
6359 ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
6360 d->m_selectionEnd.handle(),d->m_endOffset);
6363 ->setSelection(d->m_selectionEnd.handle(),d->m_endOffset,
6364 d->m_selectionStart.handle(),d->m_startOffset);
6366 #ifndef KHTML_NO_CARET
6367 d->m_view->placeCaret();
6371 bool KHTMLPart::isExtendingSelection()
const
6376 return d->m_bMousePressed;
6378 #endif // KHTML_NO_SELECTION
6382 TQMouseEvent *_mouse =
event->qmouseEvent();
6384 if( d->m_bRightMousePressed &&
parentPart() != 0 && d->m_bBackRightClick )
6387 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
6388 d->m_bRightMousePressed =
false;
6393 DOM::Node innerNode =
event->innerNode();
6395 #ifndef QT_NO_DRAGANDDROP
6396 if( d->m_bDnd && d->m_bMousePressed &&
6397 ( (!d->m_strSelectedURL.isEmpty() && !
isEditable())
6398 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) ) ) {
6403 HTMLImageElementImpl *img = 0L;
6404 TQDragObject *drag = 0;
6411 if ( url.length() == 0 && innerNode.handle() && innerNode.handle()->id() == ID_IMG )
6413 img =
static_cast<HTMLImageElementImpl *
>(innerNode.handle());
6414 u =
KURL(
completeURL( khtml::parseURL(img->getAttribute(ATTR_SRC)).
string() ) );
6427 if ( !d->m_referrer.isEmpty() )
6428 urlDrag->
metaData()[
"referrer"] = d->m_referrer;
6430 if( img && img->complete()) {
6432 mdrag->
addDragObject(
new TQImageDrag( img->currentImage(), 0L ) );
6439 if ( !pix.isNull() )
6440 drag->setPixmap( pix );
6447 d->m_bMousePressed =
false;
6448 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
6454 if ( !d->m_bMousePressed )
6459 bool shiftPressed = ( _mouse->state() & ShiftButton );
6462 if ( !innerNode.
isNull() && innerNode.elementId() == ID_IMG )
6464 HTMLImageElementImpl *i =
static_cast<HTMLImageElementImpl *
>(innerNode.handle());
6465 if ( i && i->isServerMap() )
6467 khtml::RenderObject *r = i->renderer();
6470 int absx, absy, vx, vy;
6471 r->absolutePosition(absx, absy);
6472 view()->contentsToViewport( absx, absy, vx, vy );
6474 int x(_mouse->x() - vx), y(_mouse->y() - vy);
6476 d->m_overURL = url.string() + TQString(
"?%1,%2").arg(x).arg(y);
6477 d->m_overURLTarget = target.string();
6478 overURL( d->m_overURL, target.string(), shiftPressed );
6485 if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
6487 d->m_overURL = url.string();
6488 d->m_overURLTarget = target.string();
6489 overURL( d->m_overURL, target.string(), shiftPressed );
6499 #ifndef KHTML_NO_SELECTION
6501 if( d->m_bMousePressed && innerNode.handle() && innerNode.handle()->renderer() &&
6502 ( (_mouse->state() & Qt::LeftButton) != 0 )) {
6503 extendSelectionTo(event->x(),
event->y(),
6504 event->absX(),
event->absY(), innerNode);
6506 if ( d->m_doc && d->m_view ) {
6507 TQPoint diff( _mouse->globalPos() - d->m_dragLastPos );
6509 if ( abs( diff.x() ) > 64 || abs( diff.y() ) > 64 ) {
6510 d->m_view->scrollBy( -diff.x(), -diff.y() );
6511 d->m_dragLastPos = _mouse->globalPos();
6521 DOM::Node innerNode =
event->innerNode();
6524 if ( d->m_bMousePressed ) {
6525 setStatusBarText(TQString(), BarHoverText);
6531 d->m_bMousePressed =
false;
6533 TQMouseEvent *_mouse =
event->qmouseEvent();
6534 if ( _mouse->button() == Qt::RightButton &&
parentPart() != 0 && d->m_bBackRightClick )
6536 d->m_bRightMousePressed =
false;
6539 tmp_iface->
callMethod(
"goHistory(int)", -1 );
6542 #ifndef QT_NO_CLIPBOARD
6543 if ((d->m_guiProfile == BrowserViewGUI) && (_mouse->button() == Qt::MidButton) && (event->url().isNull())) {
6544 kdDebug( 6050 ) <<
"KHTMLPart::khtmlMouseReleaseEvent() MMB shouldOpen="
6545 << d->m_bOpenMiddleClick <<
endl;
6547 if (d->m_bOpenMiddleClick) {
6550 p->d->m_extension->pasteRequest();
6555 #ifndef KHTML_NO_SELECTION
6557 if(d->m_selectionStart == d->m_selectionEnd && d->m_startOffset == d->m_endOffset) {
6558 #ifndef KHTML_NO_CARET
6559 d->m_extendAtEnd =
true;
6561 d->m_selectionStart = 0;
6562 d->m_selectionEnd = 0;
6563 d->m_startOffset = 0;
6566 emitSelectionChanged();
6571 d->m_startBeforeEnd =
false;
6572 if( d->m_selectionStart == d->m_selectionEnd ) {
6573 if( d->m_startOffset < d->m_endOffset )
6574 d->m_startBeforeEnd =
true;
6578 if(n == d->m_selectionEnd) {
6579 d->m_startBeforeEnd =
true;
6592 if (d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() ||
6593 !d->m_selectionStart.handle()->renderer() ||
6594 !d->m_selectionEnd.handle()->renderer())
return;
6595 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
6596 d->m_selectionStart.handle(), d->m_startOffset,
6597 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
6600 if(!d->m_startBeforeEnd)
6602 DOM::Node tmpNode = d->m_selectionStart;
6603 int tmpOffset = d->m_startOffset;
6604 d->m_selectionStart = d->m_selectionEnd;
6605 d->m_startOffset = d->m_endOffset;
6606 d->m_selectionEnd = tmpNode;
6607 d->m_endOffset = tmpOffset;
6608 d->m_startBeforeEnd =
true;
6609 d->m_extendAtEnd = !d->m_extendAtEnd;
6611 #ifndef KHTML_NO_CARET
6612 bool v = d->m_view->placeCaret();
6613 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
6616 #ifndef QT_NO_CLIPBOARD
6618 text.replace(TQChar(0xa0),
' ');
6619 disconnect( kapp->clipboard(), TQT_SIGNAL(
selectionChanged()),
this, TQT_SLOT( slotClearSelection()));
6620 kapp->clipboard()->setText(text,TQClipboard::Selection);
6621 connect( kapp->clipboard(), TQT_SIGNAL(
selectionChanged()), TQT_SLOT( slotClearSelection()));
6624 emitSelectionChanged();
6628 d->m_initialNode = 0;
6629 d->m_initialOffset = 0;
6639 if ( event->activated() )
6641 emitSelectionChanged();
6642 emit d->m_extension->enableAction(
"print", d->m_doc != 0 );
6644 if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
6646 TQPtrList<KAction> lst;
6647 lst.append( d->m_paLoadImages );
6648 plugActionList(
"loadImages", lst );
6653 void KHTMLPart::slotPrintFrame()
6655 if ( d->m_frames.count() == 0 )
6667 TQMetaObject *mo = ext->metaObject();
6669 int idx = mo->findSlot(
"print()",
true );
6672 ext->qt_invoke( idx, o );
6676 void KHTMLPart::slotSelectAll()
6679 if (part && part->inherits(
"KHTMLPart"))
6680 static_cast<KHTMLPart *>(part)->selectAll();
6683 void KHTMLPart::startAutoScroll()
6685 connect(&d->m_scrollTimer, TQT_SIGNAL( timeout() ),
this, TQT_SLOT( slotAutoScroll() ));
6686 d->m_scrollTimer.start(100,
false);
6689 void KHTMLPart::stopAutoScroll()
6691 disconnect(&d->m_scrollTimer, TQT_SIGNAL( timeout() ),
this, TQT_SLOT( slotAutoScroll() ));
6692 if (d->m_scrollTimer.isActive())
6693 d->m_scrollTimer.stop();
6697 void KHTMLPart::slotAutoScroll()
6700 d->m_view->doAutoScroll();
6705 void KHTMLPart::runAdFilter()
6713 TQPtrDictIterator<khtml::CachedObject> it( d->m_doc->docLoader()->m_docObjects );
6714 for ( ; it.current(); ++it )
6715 if ( it.current()->type() == khtml::CachedObject::Image ) {
6716 khtml::CachedImage *image =
static_cast<khtml::CachedImage *
>(it.current());
6717 bool wasBlocked = image->m_wasBlocked;
6718 image->m_wasBlocked = KHTMLFactory::defaultHTMLSettings()->isAdFiltered( d->m_doc->completeURL( (*it).url().string() ) );
6719 if ( image->m_wasBlocked != wasBlocked )
6720 image->do_notify(image->pixmap(), image->valid_rect());
6723 if ( KHTMLFactory::defaultHTMLSettings()->isHideAdsEnabled() ) {
6724 for ( NodeImpl *nextNode, *node = d->m_doc; node; node = nextNode ) {
6727 nextNode = node->traverseNextNode();
6729 if ( node->id() == ID_IMG ||
6730 node->id() == ID_IFRAME ||
6731 (node->id() == ID_INPUT &&
static_cast<HTMLInputElementImpl *
>(node)->inputType() == HTMLInputElementImpl::IMAGE ))
6733 if ( KHTMLFactory::defaultHTMLSettings()->isAdFiltered( d->m_doc->completeURL( static_cast<ElementImpl *>(node)->getAttribute(ATTR_SRC).string() ) ) )
6737 NodeImpl *parent = node->parent();
6741 parent->removeChild(node, exception);
6752 if (!d->m_doc)
return;
6755 if (d->m_doc->isHTMLDocument())
6756 first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6763 while ( first && !(first->renderer()
6764 && ((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE)
6765 || (first->renderer()->isReplaced() && !first->renderer()->firstChild()))))
6767 next = first->firstChild();
6768 if ( !next ) next = first->nextSibling();
6769 while( first && !next )
6771 first = first->parentNode();
6773 next = first->nextSibling();
6779 if (d->m_doc->isHTMLDocument())
6780 last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6787 while ( last && !(last->renderer()
6788 && ((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE)
6789 || (last->renderer()->isReplaced() && !last->renderer()->lastChild()))))
6791 next = last->lastChild();
6792 if ( !next ) next = last->previousSibling();
6793 while ( last && !next )
6795 last = last->parentNode();
6797 next = last->previousSibling();
6802 if ( !first || !last )
6804 Q_ASSERT(first->renderer());
6805 Q_ASSERT(last->renderer());
6806 d->m_selectionStart = first;
6807 d->m_startOffset = 0;
6808 d->m_selectionEnd = last;
6809 d->m_endOffset = last->nodeValue().length();
6810 d->m_startBeforeEnd =
true;
6812 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
6813 d->m_selectionEnd.handle(), d->m_endOffset );
6815 emitSelectionChanged();
6818 bool KHTMLPart::checkLinkSecurity(
const KURL &linkURL,
const TQString &message,
const TQString &button)
6820 bool linkAllowed =
true;
6823 linkAllowed = kapp && kapp->authorizeURLAction(
"redirect",
url(), linkURL);
6825 if ( !linkAllowed ) {
6826 khtml::Tokenizer *tokenizer = d->m_doc->tokenizer();
6828 tokenizer->setOnHold(
true);
6831 if (!message.isEmpty())
6834 message.arg(linkURL.
htmlURL()),
6835 i18n(
"Security Warning" ),
6841 i18n(
"<qt>Access by untrusted page to<BR><B>%1</B><BR> denied.").arg(linkURL.
htmlURL()),
6842 i18n(
"Security Alert" ));
6846 tokenizer->setOnHold(
false);
6855 if ( part == d->m_activeFrame )
6857 d->m_activeFrame = 0L;
6858 if ( !part->inherits(
"KHTMLPart" ) )
6861 factory()->removeClient( part );
6863 if (childClients()->containsRef(part)) {
6864 removeChildClient( part );
6870 void KHTMLPart::slotActiveFrameChanged(
KParts::Part *part )
6875 kdError(6050) <<
"strange error! we activated ourselves" <<
endl;
6880 if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits( TQFRAME_OBJECT_NAME_STRING ) )
6882 TQFrame *frame =
static_cast<TQFrame *
>( d->m_activeFrame->widget() );
6883 if (frame->frameStyle() != TQFrame::NoFrame)
6885 frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken);
6890 if( d->m_activeFrame && !d->m_activeFrame->inherits(
"KHTMLPart" ) )
6893 factory()->removeClient( d->m_activeFrame );
6895 removeChildClient( d->m_activeFrame );
6897 if( part && !part->inherits(
"KHTMLPart" ) )
6900 factory()->addClient( part );
6902 insertChildClient( part );
6906 d->m_activeFrame = part;
6908 if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits( TQFRAME_OBJECT_NAME_STRING ) )
6910 TQFrame *frame =
static_cast<TQFrame *
>( d->m_activeFrame->widget() );
6911 if (frame->frameStyle() != TQFrame::NoFrame)
6913 frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Plain);
6916 kdDebug(6050) <<
"new active frame " << d->m_activeFrame <<
endl;
6927 if (!d->m_doc || !d->m_view)
6931 d->m_doc->setFocusNode(node.handle());
6934 TQRect rect = node.handle()->getRect();
6935 d->m_view->ensureVisible(rect.right(), rect.bottom());
6936 d->m_view->ensureVisible(rect.left(), rect.top());
6941 return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
6944 DOM::EventListener *KHTMLPart::createHTMLEventListener( TQString code, TQString name, NodeImpl* node )
6946 KJSProxy *proxy = jScript();
6951 return proxy->createHTMLEventHandler(
m_url.
url(), name, code, node );
6959 void KHTMLPart::setOpener(
KHTMLPart *_opener)
6961 d->m_opener = _opener;
6964 bool KHTMLPart::openedByJS()
6966 return d->m_openedByJS;
6969 void KHTMLPart::setOpenedByJS(
bool _openedByJS)
6971 d->m_openedByJS = _openedByJS;
6976 khtml::Cache::preloadStyleSheet(url, stylesheet);
6981 khtml::Cache::preloadScript(url, script);
6984 TQCString KHTMLPart::dcopObjectId()
const
6987 id.sprintf(
"html-widget%d", d->m_dcop_counter);
6991 long KHTMLPart::cacheId()
const
6993 return d->m_cacheId;
6996 bool KHTMLPart::restored()
const
6998 return d->m_restored;
7001 bool KHTMLPart::pluginPageQuestionAsked(
const TQString& mimetype)
const
7006 return parent->pluginPageQuestionAsked(mimetype);
7008 return d->m_pluginPageQuestionAsked.contains(mimetype);
7011 void KHTMLPart::setPluginPageQuestionAsked(
const TQString& mimetype)
7014 parentPart()->setPluginPageQuestionAsked(mimetype);
7016 d->m_pluginPageQuestionAsked.append(mimetype);
7019 void KHTMLPart::slotAutomaticDetectionLanguage(
int _id )
7021 d->m_automaticDetection->setItemChecked( _id,
true );
7025 d->m_autoDetectLanguage = khtml::Decoder::SemiautomaticDetection;
7028 d->m_autoDetectLanguage = khtml::Decoder::Arabic;
7031 d->m_autoDetectLanguage = khtml::Decoder::Baltic;
7034 d->m_autoDetectLanguage = khtml::Decoder::CentralEuropean;
7037 d->m_autoDetectLanguage = khtml::Decoder::Chinese;
7040 d->m_autoDetectLanguage = khtml::Decoder::Greek;
7043 d->m_autoDetectLanguage = khtml::Decoder::Hebrew;
7046 d->m_autoDetectLanguage = khtml::Decoder::Japanese;
7049 d->m_autoDetectLanguage = khtml::Decoder::Korean;
7052 d->m_autoDetectLanguage = khtml::Decoder::Russian;
7055 d->m_autoDetectLanguage = khtml::Decoder::Thai;
7058 d->m_autoDetectLanguage = khtml::Decoder::Turkish;
7061 d->m_autoDetectLanguage = khtml::Decoder::Ukrainian;
7064 d->m_autoDetectLanguage = khtml::Decoder::Unicode;
7067 d->m_autoDetectLanguage = khtml::Decoder::WesternEuropean;
7070 d->m_autoDetectLanguage = khtml::Decoder::SemiautomaticDetection;
7074 for (
int i = 0; i <= 14; ++i ) {
7076 d->m_automaticDetection->setItemChecked( i,
false );
7079 d->m_paSetEncoding->popupMenu()->setItemChecked( 0,
true );
7083 if( d->m_manualDetection )
7084 d->m_manualDetection->setCurrentItem( -1 );
7085 d->m_paSetEncoding->popupMenu()->setItemChecked( d->m_paSetEncoding->popupMenu()->idAt( 2 ), false );
7088 khtml::Decoder *KHTMLPart::createDecoder()
7090 khtml::Decoder *dec =
new khtml::Decoder();
7091 if( !d->m_encoding.isNull() )
7092 dec->setEncoding( d->m_encoding.latin1(),
7093 d->m_haveEncoding ? khtml::Decoder::UserChosenEncoding : khtml::Decoder::EncodingFromHTTPHeader);
7097 ?
parentPart()->d->m_decoder->encoding() : settings()->encoding().latin1();
7098 dec->setEncoding(defaultEncoding, khtml::Decoder::DefaultEncoding);
7100 #ifdef APPLE_CHANGES
7102 d->m_doc->setDecoder(d->m_decoder);
7104 dec->setAutoDetectLanguage( d->m_autoDetectLanguage );
7108 void KHTMLPart::emitCaretPositionChanged(
const DOM::Node &node,
long offset) {
7112 void KHTMLPart::restoreScrollPosition()
7117 if ( !d->m_doc || !d->m_doc->parsing() )
7118 disconnect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
7128 if (d->m_view->contentsHeight() - d->m_view->visibleHeight() >= args.
yOffset
7129 || d->m_bComplete) {
7131 disconnect(d->m_view, TQT_SIGNAL(finishedLayout()),
this, TQT_SLOT(restoreScrollPosition()));
7136 void KHTMLPart::openWallet(DOM::HTMLFormElementImpl *form)
7138 #ifndef KHTML_NO_WALLET
7145 p->openWallet(form);
7154 if (d->m_bWalletOpened) {
7155 if (d->m_wallet->isOpen()) {
7156 form->walletOpened(d->m_wallet);
7159 d->m_wallet->deleteLater();
7161 d->m_bWalletOpened =
false;
7166 KWallet::Wallet *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(),
widget() ?
widget()->topLevelWidget()->winId() : 0, KWallet::Wallet::Asynchronous);
7167 d->m_wq =
new KHTMLWalletQueue(
this);
7168 d->m_wq->wallet = wallet;
7169 connect(wallet, TQT_SIGNAL(walletOpened(
bool)), d->m_wq, TQT_SLOT(walletOpened(
bool)));
7170 connect(d->m_wq, TQT_SIGNAL(walletOpened(KWallet::Wallet*)),
this, TQT_SLOT(walletOpened(KWallet::Wallet*)));
7173 d->m_wq->callers.append(KHTMLWalletQueue::Caller(form, form->getDocument()));
7174 #endif // KHTML_NO_WALLET
7178 void KHTMLPart::saveToWallet(
const TQString& key,
const TQMap<TQString,TQString>& data)
7180 #ifndef KHTML_NO_WALLET
7187 p->saveToWallet(key, data);
7192 if (d->m_bWalletOpened) {
7193 if (d->m_wallet->isOpen()) {
7194 if (!d->m_wallet->hasFolder(KWallet::Wallet::FormDataFolder())) {
7195 d->m_wallet->createFolder(KWallet::Wallet::FormDataFolder());
7197 d->m_wallet->setFolder(KWallet::Wallet::FormDataFolder());
7198 d->m_wallet->writeMap(key, data);
7201 d->m_wallet->deleteLater();
7203 d->m_bWalletOpened =
false;
7208 KWallet::Wallet *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(),
widget() ?
widget()->topLevelWidget()->winId() : 0, KWallet::Wallet::Asynchronous);
7209 d->m_wq =
new KHTMLWalletQueue(
this);
7210 d->m_wq->wallet = wallet;
7211 connect(wallet, TQT_SIGNAL(walletOpened(
bool)), d->m_wq, TQT_SLOT(walletOpened(
bool)));
7212 connect(d->m_wq, TQT_SIGNAL(walletOpened(KWallet::Wallet*)),
this, TQT_SLOT(walletOpened(KWallet::Wallet*)));
7214 d->m_wq->savers.append(qMakePair(key, data));
7215 #endif // KHTML_NO_WALLET
7219 void KHTMLPart::dequeueWallet(DOM::HTMLFormElementImpl *form) {
7220 #ifndef KHTML_NO_WALLET
7227 p->dequeueWallet(form);
7232 d->m_wq->callers.remove(KHTMLWalletQueue::Caller(form, form->getDocument()));
7234 #endif // KHTML_NO_WALLET
7238 void KHTMLPart::walletOpened(KWallet::Wallet *wallet) {
7239 #ifndef KHTML_NO_WALLET
7240 assert(!d->m_wallet);
7243 d->m_wq->deleteLater();
7247 d->m_bWalletOpened =
false;
7251 d->m_wallet = wallet;
7252 d->m_bWalletOpened =
true;
7253 connect(d->m_wallet, TQT_SIGNAL(walletClosed()), TQT_SLOT(slotWalletClosed()));
7255 if (!d->m_statusBarWalletLabel) {
7256 d->m_statusBarWalletLabel =
new KURLLabel(d->m_statusBarExtension->statusBar());
7257 d->m_statusBarWalletLabel->setFixedHeight(
instance()->iconLoader()->currentSize(
KIcon::Small));
7258 d->m_statusBarWalletLabel->
setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
7259 d->m_statusBarWalletLabel->setUseCursor(
false);
7260 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0,
false);
7261 d->m_statusBarWalletLabel->setPixmap(SmallIcon(
"wallet_open",
instance()));
7262 connect(d->m_statusBarWalletLabel, TQT_SIGNAL(leftClickedURL()), TQT_SLOT(launchWalletManager()));
7263 connect(d->m_statusBarWalletLabel, TQT_SIGNAL(rightClickedURL()), TQT_SLOT(walletMenu()));
7265 TQToolTip::remove(d->m_statusBarWalletLabel);
7267 TQToolTip::add(d->m_statusBarWalletLabel, i18n(
"The wallet '%1' is open and being used for form data and passwords.").arg(KWallet::Wallet::NetworkWallet()));
7268 #endif // KHTML_NO_WALLET
7272 KWallet::Wallet *KHTMLPart::wallet()
7274 #ifndef KHTML_NO_WALLET
7283 #endif // KHTML_NO_WALLET
7288 void KHTMLPart::slotWalletClosed()
7290 #ifndef KHTML_NO_WALLET
7292 d->m_wallet->deleteLater();
7295 d->m_bWalletOpened =
false;
7296 if (d->m_statusBarWalletLabel) {
7297 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
7298 delete d->m_statusBarWalletLabel;
7299 d->m_statusBarWalletLabel = 0L;
7301 #endif // KHTML_NO_WALLET
7304 void KHTMLPart::launchWalletManager()
7306 #ifndef KHTML_NO_WALLET
7307 if (!DCOPClient::mainClient()->isApplicationRegistered(
"kwalletmanager")) {
7310 DCOPRef r(
"kwalletmanager",
"kwalletmanager-mainwindow#1");
7314 #endif // KHTML_NO_WALLET
7317 void KHTMLPart::walletMenu()
7319 #ifndef KHTML_NO_WALLET
7321 m->insertItem(i18n(
"&Close Wallet"),
this, TQT_SLOT(slotWalletClosed()));
7322 m->popup(TQCursor::pos());
7323 #endif // KHTML_NO_WALLET
7326 void KHTMLPart::slotToggleCaretMode()
7332 d->m_formNotification = fn;
7336 return d->m_formNotification;
7356 return d->m_doc->unsubmittedFormChanges();
7359 void KHTMLPart::setDebugScript(
bool enable )
7361 unplugActionList(
"debugScriptList" );
7363 if (!d->m_paDebugScript) {
7364 d->m_paDebugScript =
new KAction( i18n(
"JavaScript &Debugger" ), 0,
this, TQT_SLOT( slotDebugScript() ), actionCollection(),
"debugScript" );
7366 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
7367 TQPtrList<KAction> lst;
7368 lst.append( d->m_paDebugScript );
7369 plugActionList(
"debugScriptList", lst );
7371 d->m_bJScriptDebugEnabled = enable;
7386 if ( enable && originPart ) {
7387 d->m_openableSuppressedPopups++;
7388 if ( d->m_suppressedPopupOriginParts.findIndex( originPart ) == -1 )
7389 d->m_suppressedPopupOriginParts.append( originPart );
7392 if ( enable && !d->m_statusBarPopupLabel ) {
7393 d->m_statusBarPopupLabel =
new KURLLabel( d->m_statusBarExtension->statusBar() );
7394 d->m_statusBarPopupLabel->setFixedHeight( instance()->iconLoader()->currentSize(
KIcon::Small) );
7395 d->m_statusBarPopupLabel->
setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ));
7396 d->m_statusBarPopupLabel->setUseCursor(
false );
7397 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarPopupLabel, 0,
false );
7398 d->m_statusBarPopupLabel->setPixmap( SmallIcon(
"window_suppressed", instance() ) );
7399 TQToolTip::add( d->m_statusBarPopupLabel, i18n(
"This page was prevented from opening a new window via JavaScript." ) );
7401 connect(d->m_statusBarPopupLabel, TQT_SIGNAL(leftClickedURL()), TQT_SLOT(suppressedPopupMenu()));
7402 if (d->m_settings->jsPopupBlockerPassivePopup()) {
7404 px = MainBarIcon(
"window_suppressed" );
7405 KPassivePopup::message(i18n(
"Popup Window Blocked"),i18n(
"This page has attempted to open a popup window but was blocked.\nYou can click on this icon in the status bar to control this behavior\nor to open the popup."),px,d->m_statusBarPopupLabel);
7407 }
else if ( !enable && d->m_statusBarPopupLabel ) {
7408 TQToolTip::remove( d->m_statusBarPopupLabel );
7409 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarPopupLabel );
7410 delete d->m_statusBarPopupLabel;
7411 d->m_statusBarPopupLabel = 0L;
7415 void KHTMLPart::suppressedPopupMenu() {
7417 m->setCheckable(
true);
7418 if ( d->m_openableSuppressedPopups )
7419 m->insertItem(i18n(
"&Show Blocked Popup Window",
"Show %n Blocked Popup Windows", d->m_openableSuppressedPopups),
this, TQT_SLOT(showSuppressedPopups()));
7420 m->insertItem(i18n(
"Show Blocked Window Passive Popup &Notification"),
this, TQT_SLOT(togglePopupPassivePopup()),0,57);
7421 m->setItemChecked(57,d->m_settings->jsPopupBlockerPassivePopup());
7422 m->insertItem(i18n(
"&Configure JavaScript New Window Policies..."),
this, TQT_SLOT(launchJSConfigDialog()));
7423 m->popup(TQCursor::pos());
7426 void KHTMLPart::togglePopupPassivePopup() {
7428 d->m_settings->setJSPopupBlockerPassivePopup( !d->m_settings->jsPopupBlockerPassivePopup() );
7429 DCOPClient::mainClient()->send(
"konqueror*",
"KonquerorIface",
"reparseConfiguration()", TQByteArray());
7432 void KHTMLPart::showSuppressedPopups() {
7433 for ( TQValueListIterator<TQGuardedPtr<KHTMLPart> > i = d->m_suppressedPopupOriginParts.begin();
7434 i != d->m_suppressedPopupOriginParts.end(); ++i ) {
7436 KJS::Window *w = KJS::Window::retrieveWindow( part );
7438 w->showSuppressedWindows();
7439 w->forgetSuppressedWindows();
7444 d->m_openableSuppressedPopups = 0;
7445 d->m_suppressedPopupOriginParts.clear();
7450 TQString KHTMLPart::defaultExtension()
const
7454 if ( !d->m_doc->isHTMLDocument() )
7456 return d->m_doc->htmlMode() == DOM::DocumentImpl::XHtml ?
".xhtml" :
".html";
7459 bool KHTMLPart::inProgress()
const
7461 if (d->m_runningScripts || (d->m_doc && d->m_doc->parsing()))
7465 ConstFrameIt it = d->m_frames.begin();
7466 const ConstFrameIt end = d->m_frames.end();
7467 for (; it !=
end; ++it ) {
7468 if ((*it)->m_run || !(*it)->m_bCompleted)
7472 return d->m_submitForm || !d->m_redirectURL.isEmpty() || d->m_redirectionTimer.isActive() || d->m_job;
7475 using namespace KParts;
7476 #include "khtml_part.moc"
7477 #include "khtmlpart_p.moc"