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;
181 KHTMLPart * part = ::tqqt_cast<KHTMLPart *>(m_part->parent());
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 );
214 init(
new KHTMLView(
this, parentWidget, widgetname ), prof );
221 KHTMLFactory::registerPart(
this );
229 void KHTMLPart::init(
KHTMLView *view, GUIProfile prof )
231 if ( prof == DefaultGUI )
233 else if ( prof == BrowserViewGUI )
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" );
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" );
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 );
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,
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,
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." ) );
375 d->m_paFind->setWhatsThis( i18n(
"Find text<p>"
376 "Shows a dialog that allows you to find text on the displayed page." ) );
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" ) );
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()),
390 d->m_paFindAheadLinks =
new KAction( i18n(
"Find Links as You Type"),
KShortcut(
'\'' ),
this, TQT_SLOT( slotFindAheadLink()),
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." ) );
411 d->m_paSelectAll->setShortcut(
KShortcut() );
413 d->m_paToggleCaretMode =
new KToggleAction(i18n(
"Toggle Caret Mode"),
414 Key_F7,
this, TQT_SLOT(slotToggleCaretMode()),
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()));
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());
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);
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;
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;
704 d->m_cachePolicy = KIO::CC_Reload;
706 d->m_cachePolicy = KProtocolManager::cacheControl();
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;
1251 bool KHTMLPart::javaEnabled()
const
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;
1280 bool KHTMLPart::pluginsEnabled()
const
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 );
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 );
1360 bool KHTMLPart::autoloadImages()
const
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();
2504 if (
url().protocol().startsWith(
"http" ) )
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();
2665 return d->m_caretMode;
2670 #ifndef KHTML_NO_CARET
2672 d->setFlagRecursively(&KHTMLPartPrivate::m_designMode, enable);
2676 view()->initCaret(
true);
2677 view()->ensureCaretVisible();
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();
2705 #ifndef KHTML_NO_CARET
2708 return CaretInvisible;
2714 #ifndef KHTML_NO_CARET
2715 view()->setCaretDisplayPolicyNonFocused(policy);
2721 #ifndef KHTML_NO_CARET
2724 NodeImpl *caretNode = xmlDocImpl()->focusNode();
2726 || (caretNode && caretNode->contentEditable())) {
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 );
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 );
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() );
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 )
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;
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 )
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)
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;
4100 long cacheId =
static_cast<KHTMLPart *
>(frame)->d->m_cacheId;
4104 KTempFile sourceFile(TQString(), defaultExtension());
4105 if (sourceFile.status() == 0)
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;
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;
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 );
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" ) )
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" );
4709 d->m_manager->setAllowNestedParts(
true );
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")));
4771 if (rc == KMessageBox::Cancel)
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);
4793 if (rc == KMessageBox::Cancel)
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");
4807 if (rc == KMessageBox::Cancel) {
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" ))
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());
5306 KHTMLPart*
const kp = ::tqqt_cast<KHTMLPart*>(framePart);
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 );
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)
5706 for (
int i = 0; i < count; ++i)
5715 void KHTMLPart::zoomOut(
const int stepping[],
int count)
5720 for (
int i = count-1; i >= 0; --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();
5842 TQDateTime lastModif = TQFileInfo(
m_url.
path() ).lastModified();
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 );
5940 bool KHTMLPart::dndEnabled()
const
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();
6097 d->m_view->moveCaretTo(node, offset, (_mouse->state() & ShiftButton) == 0);
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;
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 );
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"))
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);
6830 int response = KMessageBox::Cancel;
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);
6847 return (response==KMessageBox::Continue);
6855 if ( part == d->m_activeFrame )
6857 d->m_activeFrame = 0L;
6858 if ( !part->inherits(
"KHTMLPart" ) )
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" ) )
6897 if( part && !part->inherits(
"KHTMLPart" ) )
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()));
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));
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()));
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()));
7272 KWallet::Wallet *KHTMLPart::wallet()
7274 #ifndef 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;
7304 void KHTMLPart::launchWalletManager()
7306 #ifndef KHTML_NO_WALLET
7307 if (!DCOPClient::mainClient()->isApplicationRegistered(
"kwalletmanager")) {
7310 DCOPRef r(
"kwalletmanager",
"kwalletmanager-mainwindow#1");
7317 void KHTMLPart::walletMenu()
7319 #ifndef KHTML_NO_WALLET
7321 m->insertItem(i18n(
"&Close Wallet"),
this, TQT_SLOT(slotWalletClosed()));
7322 m->popup(TQCursor::pos());
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 )
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 );
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"
This class implements the basic string we use in the DOM.
The Document interface represents the entire HTML or XML document.
Range createRange()
Introduced in DOM Level 2 This method is from the DocumentRange interface.
Introduced in DOM Level 2.
An HTMLDocument is the root of the HTML hierarchy and holds the entire content.
DOMString domain() const
The domain name of the server that served the document, or a null string if the server cannot be iden...
Node getNamedItem(const DOMString &name) const
Retrieves a node specified by name.
The Node interface is the primary datatype for the entire Document Object Model.
Node nextSibling() const
The node immediately following this node.
bool isNull() const
tests if this Node is 0.
DOMString nodeValue() const
The value of this node, depending on its type; see the table above.
Node parentNode() const
The parent of this node.
Node firstChild() const
The first child of this node.
NamedNodeMap attributes() const
A NamedNodeMap containing the attributes of this node (if it is an Element ) or null otherwise.
unsigned short nodeType() const
A code representing the type of the underlying object, as defined above.
DOMString nodeName() const
The name of this node, depending on its type; see the table above.
static int startServiceByDesktopName(const TQString &_name, const TQString &URL, TQString *error=0, TQCString *dcopService=0, int *pid=0, const TQCString &startup_id="", bool noWait=false)
static int kdeinitExec(const TQString &name, const TQStringList &args, TQString *error, int *pid, const TQCString &startup_id)
TQString encodingForName(const TQString &descriptiveName)
TQStringList descriptiveEncodingNames()
void writeEntry(const TQString &pKey, const TQString &pValue, bool bPersistent=true, bool bGlobal=false, bool bNLS=false)
void setGroup(const TQString &group)
bool hasGroup(const TQString &group) const
int readNumEntry(const TQString &pKey, int nDefault=0) const
void deleteEntry(const TQString &pKey, bool bNLS=false, bool bGlobal=false)
bool readBoolEntry(const TQString &pKey, bool bDefault=false) const
static bool avoidArea(TQWidget *widget, const TQRect &area, int screen=-1)
static int dndEventDelay()
static bool showIconsOnPushButtons()
static KConfig * config()
static KCharsets * charsets()
static KLocale * locale()
void addData(long id, const TQByteArray &data)
Add data to the cache entry with id id.
void endData(long id)
Signal end of data for the cache entry with id id.
void cancelFetch(TQObject *recvObj)
Cancel sending data to recvObj.
static KHTMLPageCache * self()
static "constructor".
long createCacheEntry()
Create a new cache entry.
void cancelEntry(long id)
Cancel the entry.
void fetchData(long id, TQObject *recvObj, const char *recvSlot)
Fetch data for cache entry id and send it to slot recvSlot in the object recvObj.
void saveData(long id, TQDataStream *str)
Save the data of cache entry id to the datastream str.
This is the BrowserExtension for a KHTMLPart document.
DCOP interface for KHTML.
This class is khtml's main class.
virtual KParts::ReadOnlyPart * createPart(TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name, const TQString &mimetype, TQString &serviceName, TQStringList &serviceTypes, const TQStringList ¶ms)
This method is called when a new embedded object (include html frames) is to be created.
TQVariant executeScript(const DOM::Node &n, const TQString &script)
Same as executeScript( const TQString & ) except with the Node parameter specifying the 'this' value.
void setFixedFont(const TQString &name)
Sets the fixed font style.
virtual void khtmlDrawContentsEvent(khtml::DrawContentsEvent *)
Eventhandler for the khtml::DrawContentsEvent.
virtual void khtmlMouseReleaseEvent(khtml::MouseReleaseEvent *event)
Eventhandler for the khtml::MouseMouseReleaseEvent.
bool jScriptEnabled() const
Returns true if Javascript support is enabled or false otherwise.
void show()
Convenience method to show the document's view.
void paint(TQPainter *, const TQRect &, int=0, bool *=0)
Paints the HTML page to a TQPainter.
TQString referrer() const
Referrer used for links in this page.
KJavaAppletContext * createJavaContext()
Returns the java context of the applets.
DOM::Document document() const
Returns a reference to the DOM document.
virtual void khtmlMouseMoveEvent(khtml::MouseMoveEvent *event)
Eventhandler for the khtml::MouseMouseMoveEvent.
virtual void saveState(TQDataStream &stream)
Saves the KHTMLPart's complete state (including child frame objects) to the provided TQDataStream.
KHTMLView * view() const
Returns a pointer to the HTML document's view.
CaretDisplayPolicy
Enumeration for displaying the caret.
void setMetaRefreshEnabled(bool enable)
Enable/disable automatic forwarding by <meta http-equiv="refresh" ....
TQString encoding() const
Returns the encoding the page currently uses.
TQCursor urlCursor() const
Returns the cursor which is used when the cursor is on a link.
KHTMLPart * findFrameParent(KParts::ReadOnlyPart *callingPart, const TQString &f, khtml::ChildFrame **childFrame=0)
Recursively finds the part containing the frame with name f and checks if it is accessible by calling...
virtual bool doOpenStream(const TQString &mimeType)
Implements the streaming API of KParts::ReadOnlyPart.
TQString jsDefaultStatusBarText() const
Called by KJS.
bool statusMessagesEnabled() const
Returns true if status messages are enabled.
FormNotification formNotification() const
Determine if signal should be emitted before, instead or never when a submitForm() happens.
void scheduleRedirection(int delay, const TQString &url, bool lockHistory=true)
Schedules a redirection after delay seconds.
KHTMLPart(TQWidget *parentWidget=0, const char *widgetname=0, TQObject *parent=0, const char *name=0, GUIProfile prof=DefaultGUI)
Constructs a new KHTMLPart.
bool prevAnchor()
Go to previous anchor.
KParts::PartManager * partManager()
Returns a reference to the partmanager instance which manages html frame objects.
TQString jsStatusBarText() const
Called by KJS.
virtual void showError(KIO::Job *job)
Called when a certain error situation (i.e.
bool isEditable() const
Returns true if the document is editable, false otherwise.
void setDNDEnabled(bool b)
Enables or disables Drag'n'Drop support.
TQString pageReferrer() const
Referrer used to obtain this page.
KURL completeURL(const TQString &url)
returns a KURL object for the given url.
KURL toplevelURL()
Returns the toplevel (origin) URL of this document, even if this part is a frame or an iframe.
virtual bool openFile()
Internal empty reimplementation of KParts::ReadOnlyPart::openFile .
KHTMLPart * parentPart()
Returns a pointer to the parent KHTMLPart if the part is a frame in an HTML frameset.
virtual void write(const char *str, int len=-1)
Writes another part of the HTML code to the widget.
virtual bool doCloseStream()
Implements the streaming API of KParts::ReadOnlyPart.
void setJSDefaultStatusBarText(const TQString &text)
Called by KJS.
int zoomFactor() const
Returns the current zoom factor.
virtual void restoreState(TQDataStream &stream)
Restores the KHTMLPart's previously saved state (including child frame objects) from the provided TQD...
void formSubmitNotification(const char *action, const TQString &url, const TQByteArray &formData, const TQString &target, const TQString &contentType, const TQString &boundary)
If form notification is on, this will be emitted either for a form submit or before the form submit a...
void onURL(const TQString &url)
Emitted if the cursor is moved over an URL.
KParts::BrowserExtension * browserExtension() const
Returns a pointer to the KParts::BrowserExtension.
void findText()
Starts a new search by popping up a dialog asking the user what he wants to search for.
void nodeActivated(const DOM::Node &)
This signal is emitted when an element retrieves the keyboard focus.
void setCaretPosition(DOM::Node node, long offset, bool extendSelection=false)
Sets the caret to the given position.
KURL backgroundURL() const
Returns the URL for the background Image (used by save background)
KJavaAppletContext * javaContext()
Returns the java context of the applets.
virtual void khtmlMousePressEvent(khtml::MousePressEvent *event)
Eventhandler of the khtml::MousePressEvent.
KParts::ReadOnlyPart * currentFrame() const
Return the current frame (the one that has focus) Not necessarily a direct child of ours,...
TQString documentSource() const
Returns the content of the source document.
bool gotoAnchor(const TQString &name)
Finds the anchor named name.
void setStatusMessagesEnabled(bool enable)
Enable/disable statusbar messages.
void setActiveNode(const DOM::Node &node)
Sets the focused node of the document to the specified node.
DOM::Node nonSharedNodeUnderMouse() const
Returns the Node currently under the mouse that is not shared.
void setUserStyleSheet(const KURL &url)
Sets a user defined style sheet to be used on top of the HTML 4 default style sheet.
void setCaretVisible(bool show)
Sets the visibility of the caret.
virtual bool doWriteStream(const TQByteArray &data)
Implements the streaming API of KParts::ReadOnlyPart.
bool findTextNext()
Finds the next occurence of a string set by findText()
void setJSStatusBarText(const TQString &text)
Called by KJS.
virtual void end()
Call this after your last call to write().
void setEditable(bool enable)
Makes the document editable.
DOM::HTMLDocument htmlDocument() const
Returns a reference to the DOM HTML document (for non-HTML documents, returns null)
TQStringList frameNames() const
Returns a list of names of all frame (including iframe) objects of the current document.
KHTMLPart * findFrame(const TQString &f)
Finds a frame by name.
virtual bool closeURL()
Stops loading the document and kills all data requests (for images, etc.)
virtual void guiActivateEvent(KParts::GUIActivateEvent *event)
Internal reimplementation of KParts::Part::guiActivateEvent .
bool onlyLocalReferences() const
Returns whether only file:/ or data:/ references are allowed to be loaded ( default false ).
void setFormNotification(FormNotification fn)
Determine if signal should be emitted before, instead or never when a submitForm() happens.
TQString selectedTextAsHTML() const
Return the text the user has marked.
void preloadStyleSheet(const TQString &url, const TQString &stylesheet)
Loads a style sheet into the stylesheet cache.
bool hasSelection() const
Has the user selected anything?
void setOnlyLocalReferences(bool enable)
Security option.
DOM::Range selection() const
Returns the selected part of the HTML.
virtual ~KHTMLPart()
Destructor.
void findTextBegin()
Initiates a text search.
DOM::Node activeNode() const
Returns the node that has the keyboard focus.
DOM::Node nodeUnderMouse() const
Returns the Node currently under the mouse.
void setStandardFont(const TQString &name)
Sets the standard font style.
void setURLCursor(const TQCursor &c)
Sets the cursor to use when the cursor is on a link.
bool setEncoding(const TQString &name, bool override=false)
Sets the encoding the page uses.
void setJScriptEnabled(bool enable)
Enable/disable Javascript support.
bool isCaretMode() const
Returns whether caret mode is on/off.
bool isModified() const
Checks whether the page contains unsubmitted form changes.
KJSProxy * framejScript(KParts::ReadOnlyPart *framePart)
Returns child frame framePart its script interpreter.
KParts::ReadOnlyPart * findFramePart(const TQString &f)
Finds a frame by name.
void popupMenu(const TQString &url, const TQPoint &point)
Emitted when the user clicks the right mouse button on the document.
TQString lastModified() const
Last-modified date (in raw string format), if received in the [HTTP] headers.
void preloadScript(const TQString &url, const TQString &script)
Loads a script into the script cache.
void caretPositionChanged(const DOM::Node &node, long offset)
This signal is emitted whenever the caret position has been changed.
KJS::Interpreter * jScriptInterpreter()
Returns the JavaScript interpreter the part is using.
void setCaretDisplayPolicyNonFocused(CaretDisplayPolicy policy)
Sets the caret display policy when the view is not focused.
void hide()
Convenience method to hide the document's view.
void setCaretMode(bool enable)
Enables/disables caret mode.
CaretDisplayPolicy caretDisplayPolicyNonFocused() const
Returns the current caret policy when the view is not focused.
void stopAnimations()
Stops all animated images on the current and child pages.
void setSuppressedPopupIndicator(bool enable)
Shows or hides the suppressed popup indicator.
void setAutoloadImages(bool enable)
Specifies whether images contained in the document should be loaded automatically or not.
virtual void khtmlMouseDoubleClickEvent(khtml::MouseDoubleClickEvent *)
Eventhandler for the khtml::MouseDoubleClickEvent.
void setJavaEnabled(bool enable)
Enables/disables Java applet support.
bool metaRefreshEnabled() const
Returns true if automatic forwarding is enabled.
virtual bool openURL(const KURL &url)
Opens the specified URL url.
void selectionChanged()
This signal is emitted when the selection changes.
bool frameExists(const TQString &frameName)
Returns whether a frame with the specified name is exists or not.
virtual TQString selectedText() const
Returns the text the user has marked.
void htmlError(int errorCode, const TQString &text, const KURL &reqUrl)
presents a detailed error message to the user.
void selectAll()
Marks all text in the document as selected.
virtual void begin(const KURL &url=KURL(), int xOffset=0, int yOffset=0)
Clears the widget and prepares it for new content.
void setPluginsEnabled(bool enable)
Enables or disables plugins, default is enabled.
void setZoomFactor(int percent)
Sets the Zoom factor.
void setSelection(const DOM::Range &)
Sets the current selection.
bool nextAnchor()
Go to the next anchor.
Settings for the HTML view.
void init()
Called by constructor and reparseConfiguration.
Renders and displays HTML in a TQScrollView.
static KLibLoader * self()
TQString lastErrorMessage() const
virtual KLibrary * library(const char *libname)
KLibFactory * factory(const char *libname)
void * symbol(const char *name) const
TQString formatDateTime(const TQDateTime &pDateTime, bool shortFormat=true, bool includeSecs=false) const
TQString formatNumber(double num, int precision=-1) const
const char * encoding() const
void removeCatalogue(const TQString &catalog)
static void information(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, const TQString &dontShowAgainName=TQString::null, int options=Notify)
static void error(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, int options=Notify)
static int warningContinueCancel(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, const KGuiItem &buttonContinue=KStdGuiItem::cont(), const TQString &dontAskAgainName=TQString::null, int options=Notify)
void addDragObject(TQDragObject *dragObject)
static BrowserExtension * childObject(TQObject *obj)
void callMethod(const char *name, const TQVariant &argument)
static AskSaveResult askEmbedOrSave(const KURL &url, const TQString &mimeType, const TQString &suggestedFilename=TQString::null, int flags=0)
virtual void setInstance(KInstance *instance)
virtual void removePart(Part *part)
virtual Part * activePart() const
virtual void addPart(Part *part, bool setActive=true)
virtual void setWidget(TQWidget *widget)
virtual TQWidget * widget()
void canceled(const TQString &errMsg)
void setStatusBar(KStatusBar *status)
static StatusBarExtension * childObject(TQObject *obj)
static TQString rsqueeze(const TQString &str, uint maxlen=40)
static TQString csqueeze(const TQString &str, uint maxlen=40)
TQMap< TQString, TQString > & metaData()
void setUser(const TQString &_txt)
TQString encodedHtmlRef() const
void setRef(const TQString &_txt)
static TQString encode_string(const TQString &str, int encoding_hint=0)
void setPath(const TQString &path)
void setPass(const TQString &_txt)
static List split(const TQString &_url)
TQString protocol() const
TQString queryItem(const TQString &item) const
static KURL join(const List &_list)
void setQuery(const TQString &_txt, int encoding_hint=0)
TQString fileName(bool _ignore_trailing_slash_in_path=true) const
TQString url(int _trailing=0, int encoding_hint=0) const
static TQString decode_string(const TQString &str, int encoding_hint=0)
void setFileName(const TQString &_txt)
TQString prettyURL(int _trailing=0) const
static void activateWindow(WId win, long time=0)
void plugActionList(const TQString &name, const TQPtrList< KAction > &actionList)
void unplugActionList(const TQString &name)
void removeChildClient(KXMLGUIClient *child)
virtual KInstance * instance() const
virtual void setXMLFile(const TQString &file, bool merge=false, bool setXMLDoc=true)
virtual KActionCollection * actionCollection() const
KXMLGUIFactory * factory() const
KAction * action(const char *name) const
const TQPtrList< KXMLGUIClient > * childClients()
void insertChildClient(KXMLGUIClient *child)
void removeClient(KXMLGUIClient *client)
void addClient(KXMLGUIClient *client)
kndbgstream & endl(kndbgstream &s)
kdbgstream kdWarning(int area=0)
kdbgstream kdError(int area=0)
kdbgstream kdDebug(int area=0)
TQString locate(const char *type, const TQString &filename, const KInstance *instance=KGlobal::instance())
The Document Object Model (DOM) is divided into two parts, the COREDOM core DOM, specifying some core...
int event(const TQString &message, const TQString &text=TQString::null) KDE_DEPRECATED
TQString name(StdAccel id)
KAction * saveAs(const TQObject *recvr, const char *slot, KActionCollection *parent, const char *name=0)
KAction * findNext(const TQObject *recvr, const char *slot, KActionCollection *parent, const char *name=0)
KAction * selectAll(const TQObject *recvr, const char *slot, KActionCollection *parent, const char *name=0)
KAction * findPrev(const TQObject *recvr, const char *slot, KActionCollection *parent, const char *name=0)
KAction * find(const TQObject *recvr, const char *slot, KActionCollection *parent, const char *name=0)
void setContentType(const TQString &contentType)
TQString contentType() const
void setNewTab(bool newTab)
void setDoPost(bool enable)
bool redirectedRequest() const
TQMap< TQString, TQString > & metaData()
void setLockHistory(bool lock)
void setForcesNewWindow(bool forcesNewWindow)