• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdehtml
 

tdehtml

  • tdehtml
tdehtml_part.cpp
1/* This file is part of the KDE project
2 *
3 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
4 * 1999 Lars Knoll <knoll@kde.org>
5 * 1999 Antti Koivisto <koivisto@kde.org>
6 * 2000 Simon Hausmann <hausmann@kde.org>
7 * 2000 Stefan Schimanski <1Stein@gmx.de>
8 * 2001-2003 George Staikos <staikos@kde.org>
9 * 2001-2003 Dirk Mueller <mueller@kde.org>
10 * 2000-2005 David Faure <faure@kde.org>
11 * 2002 Apple Computer, Inc.
12 *
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Library General Public
15 * License as published by the Free Software Foundation; either
16 * version 2 of the License, or (at your option) any later version.
17 *
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Library General Public License for more details.
22 *
23 * You should have received a copy of the GNU Library General Public License
24 * along with this library; see the file COPYING.LIB. If not, write to
25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26 * Boston, MA 02110-1301, USA.
27 */
28
29//#define SPEED_DEBUG
30#include "tdehtml_part.h"
31
32#include "tdehtml_pagecache.h"
33
34#include "dom/dom_string.h"
35#include "dom/dom_element.h"
36#include "dom/dom_exception.h"
37#include "html/html_documentimpl.h"
38#include "html/html_baseimpl.h"
39#include "html/html_objectimpl.h"
40#include "html/html_miscimpl.h"
41#include "html/html_imageimpl.h"
42#include "html/html_objectimpl.h"
43#include "rendering/render_text.h"
44#include "rendering/render_frames.h"
45#include "rendering/render_layer.h"
46#include "misc/htmlhashes.h"
47#include "misc/loader.h"
48#include "xml/dom2_eventsimpl.h"
49#include "xml/dom2_rangeimpl.h"
50#include "xml/xml_tokenizer.h"
51#include "css/cssstyleselector.h"
52#include "css/csshelper.h"
53using namespace DOM;
54
55#include "tdehtmlview.h"
56#include <tdeparts/partmanager.h>
57#include "ecma/kjs_proxy.h"
58#include "ecma/kjs_window.h"
59#include "tdehtml_settings.h"
60#include "kjserrordlg.h"
61
62#include <kjs/function.h>
63#include <kjs/interpreter.h>
64
65#include "htmlpageinfo.h"
66
67#include <sys/types.h>
68#include <assert.h>
69#include <unistd.h>
70
71#include <config.h>
72
73#include <dcopclient.h>
74#include <dcopref.h>
75#include <tdestandarddirs.h>
76#include <kstringhandler.h>
77#include <tdeio/job.h>
78#include <tdeio/global.h>
79#include <tdeio/netaccess.h>
80#include <tdeprotocolmanager.h>
81#include <kdebug.h>
82#include <kiconloader.h>
83#include <tdelocale.h>
84#include <kcharsets.h>
85#include <tdemessagebox.h>
86#include <kstdaction.h>
87#include <tdefiledialog.h>
88#include <ktrader.h>
89#include <kdatastream.h>
90#include <tdetempfile.h>
91#include <tdeglobalsettings.h>
92#include <kurldrag.h>
93#include <tdeapplication.h>
94#include <tdeparts/browserinterface.h>
95#if !defined(TQT_NO_DRAGANDDROP)
96#include <tdemultipledrag.h>
97#endif
98#include "../tdeutils/kfinddialog.h"
99#include "../tdeutils/kfind.h"
100
101#include <ksslcertchain.h>
102#include <ksslinfodlg.h>
103
104#include <tdefileitem.h>
105#include <kurifilter.h>
106#include <kstatusbar.h>
107#include <kurllabel.h>
108
109#include <tqclipboard.h>
110#include <tqfile.h>
111#include <tqtooltip.h>
112#include <tqmetaobject.h>
113#include <private/tqucomextra_p.h>
114
115#include "tdehtmlpart_p.h"
116#include "kpassivepopup.h"
117#include "tdepopupmenu.h"
118#include "rendering/render_form.h"
119#include <twin.h>
120
121#define HINT_UTF8 106
122
123namespace tdehtml {
124 class PartStyleSheetLoader : public CachedObjectClient
125 {
126 public:
127 PartStyleSheetLoader(TDEHTMLPart *part, DOM::DOMString url, DocLoader* dl)
128 {
129 m_part = part;
130 m_cachedSheet = dl->requestStyleSheet(url, TQString(), "text/css",
131 true /* "user sheet" */);
132 if (m_cachedSheet)
133 m_cachedSheet->ref( this );
134 }
135 virtual ~PartStyleSheetLoader()
136 {
137 if ( m_cachedSheet ) m_cachedSheet->deref(this);
138 }
139 virtual void setStyleSheet(const DOM::DOMString&, const DOM::DOMString &sheet, const DOM::DOMString &)
140 {
141 if ( m_part )
142 m_part->setUserStyleSheet( sheet.string() );
143
144 delete this;
145 }
146 virtual void error( int, const TQString& ) {
147 delete this;
148 }
149 TQGuardedPtr<TDEHTMLPart> m_part;
150 tdehtml::CachedCSSStyleSheet *m_cachedSheet;
151 };
152}
153
154void tdehtml::ChildFrame::liveConnectEvent(const unsigned long, const TQString & event, const KParts::LiveConnectExtension::ArgList & args)
155{
156 if (!m_part || !m_frame || !m_liveconnect)
157 // hmmm
158 return;
159
160 TQString script;
161 script.sprintf("%s(", event.latin1());
162
163 KParts::LiveConnectExtension::ArgList::const_iterator i = args.begin();
164 const KParts::LiveConnectExtension::ArgList::const_iterator argsBegin = i;
165 const KParts::LiveConnectExtension::ArgList::const_iterator argsEnd = args.end();
166
167 for ( ; i != argsEnd; ++i) {
168 if (i != argsBegin)
169 script += ",";
170 if ((*i).first == KParts::LiveConnectExtension::TypeString) {
171 script += "\"";
172 script += TQString((*i).second).replace('\\', "\\\\").replace('"', "\\\"");
173 script += "\"";
174 } else
175 script += (*i).second;
176 }
177 script += ")";
178 kdDebug(6050) << "tdehtml::ChildFrame::liveConnectEvent " << script << endl;
179
180 TDEHTMLPart * part = ::tqt_cast<TDEHTMLPart *>(m_part->parent());
181 if (!part)
182 return;
183 if (!m_jscript)
184 part->framejScript(m_part);
185 if (m_jscript) {
186 // we have a jscript => a part in an iframe
187 KJS::Completion cmp;
188 m_jscript->evaluate(TQString(), 1, script, 0L, &cmp);
189 } else
190 part->executeScript(m_frame->element(), script);
191}
192
193TDEHTMLFrameList::Iterator TDEHTMLFrameList::find( const TQString &name )
194{
195 Iterator it = begin();
196 const Iterator e = end();
197
198 for (; it!=e; ++it )
199 if ( (*it)->m_name==name )
200 break;
201
202 return it;
203}
204
205TDEHTMLPart::TDEHTMLPart( TQWidget *parentWidget, const char *widgetname, TQObject *parent, const char *name, GUIProfile prof )
206: KParts::ReadOnlyPart( parent, name )
207{
208 d = 0;
209 TDEHTMLFactory::registerPart( this );
210 setInstance( TDEHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
211 // TODO KDE4 - don't load plugins yet
212 //setInstance( TDEHTMLFactory::instance(), false );
213 init( new TDEHTMLView( this, parentWidget, widgetname ), prof );
214}
215
216TDEHTMLPart::TDEHTMLPart( TDEHTMLView *view, TQObject *parent, const char *name, GUIProfile prof )
217: KParts::ReadOnlyPart( parent, name )
218{
219 d = 0;
220 TDEHTMLFactory::registerPart( this );
221 setInstance( TDEHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
222 // TODO KDE4 - don't load plugins yet
223 //setInstance( TDEHTMLFactory::instance(), false );
224 assert( view );
225 init( view, prof );
226}
227
228void TDEHTMLPart::init( TDEHTMLView *view, GUIProfile prof )
229{
230 if ( prof == DefaultGUI )
231 setXMLFile( "tdehtml.rc" );
232 else if ( prof == BrowserViewGUI )
233 setXMLFile( "tdehtml_browser.rc" );
234
235 d = new TDEHTMLPartPrivate(parent());
236
237 d->m_view = view;
238 setWidget( d->m_view );
239
240 d->m_guiProfile = prof;
241 d->m_extension = new TDEHTMLPartBrowserExtension( this, "TDEHTMLBrowserExtension" );
242 d->m_hostExtension = new TDEHTMLPartBrowserHostExtension( this );
243 d->m_statusBarExtension = new KParts::StatusBarExtension( this );
244 d->m_statusBarIconLabel = 0L;
245 d->m_statusBarPopupLabel = 0L;
246 d->m_openableSuppressedPopups = 0;
247
248 d->m_bSecurityInQuestion = false;
249 d->m_paLoadImages = 0;
250 d->m_paDebugScript = 0;
251 d->m_bMousePressed = false;
252 d->m_bRightMousePressed = false;
253 d->m_bCleared = false;
254 d->m_paViewDocument = new TDEAction( i18n( "View Do&cument Source" ), CTRL + Key_U, this, TQ_SLOT( slotViewDocumentSource() ), actionCollection(), "viewDocumentSource" );
255 d->m_paViewFrame = new TDEAction( i18n( "View Frame Source" ), 0, this, TQ_SLOT( slotViewFrameSource() ), actionCollection(), "viewFrameSource" );
256 d->m_paViewInfo = new TDEAction( i18n( "View Document Information" ), CTRL+Key_I, this, TQ_SLOT( slotViewPageInfo() ), actionCollection(), "viewPageInfo" );
257 d->m_paSaveBackground = new TDEAction( i18n( "Save &Background Image As..." ), 0, this, TQ_SLOT( slotSaveBackground() ), actionCollection(), "saveBackground" );
258 d->m_paSaveDocument = KStdAction::saveAs( this, TQ_SLOT( slotSaveDocument() ), actionCollection(), "saveDocument" );
259 if ( parentPart() )
260 d->m_paSaveDocument->setShortcut( TDEShortcut() ); // avoid clashes
261 d->m_paSaveFrame = new TDEAction( i18n( "Save &Frame As..." ), 0, this, TQ_SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" );
262 d->m_paSecurity = new TDEAction( i18n( "Security..." ), "decrypted", 0, this, TQ_SLOT( slotSecurity() ), actionCollection(), "security" );
263 d->m_paSecurity->setWhatsThis( i18n( "Security Settings<p>"
264 "Shows the certificate of the displayed page. Only "
265 "pages that have been transmitted using a secure, encrypted connection have a "
266 "certificate.<p> "
267 "Hint: If the image shows a closed lock, the page has been transmitted over a "
268 "secure connection.") );
269 d->m_paDebugRenderTree = new TDEAction( i18n( "Print Rendering Tree to STDOUT" ), ALT + CTRL + SHIFT + Key_A, this, TQ_SLOT( slotDebugRenderTree() ), actionCollection(), "debugRenderTree" );
270 d->m_paDebugDOMTree = new TDEAction( i18n( "Print DOM Tree to STDOUT" ), ALT + CTRL + SHIFT + Key_D, this, TQ_SLOT( slotDebugDOMTree() ), actionCollection(), "debugDOMTree" );
271 d->m_paStopAnimations = new TDEAction( i18n( "Stop Animated Images" ), 0, this, TQ_SLOT( slotStopAnimations() ), actionCollection(), "stopAnimations" );
272
273 d->m_paSetEncoding = new TDEActionMenu( i18n( "Set &Encoding" ), "charset", actionCollection(), "setEncoding" );
274 d->m_paSetEncoding->setDelayed( false );
275
276 d->m_automaticDetection = new TDEPopupMenu( 0L );
277
278 d->m_automaticDetection->insertItem( i18n( "Semi-Automatic" ), 0 );
279 d->m_automaticDetection->insertItem( i18n( "Arabic" ), 1 );
280 d->m_automaticDetection->insertItem( i18n( "Baltic" ), 2 );
281 d->m_automaticDetection->insertItem( i18n( "Central European" ), 3 );
282 //d->m_automaticDetection->insertItem( i18n( "Chinese" ), 4 );
283 d->m_automaticDetection->insertItem( i18n( "Greek" ), 5 );
284 d->m_automaticDetection->insertItem( i18n( "Hebrew" ), 6 );
285 d->m_automaticDetection->insertItem( i18n( "Japanese" ), 7 );
286 //d->m_automaticDetection->insertItem( i18n( "Korean" ), 8 );
287 d->m_automaticDetection->insertItem( i18n( "Russian" ), 9 );
288 //d->m_automaticDetection->insertItem( i18n( "Thai" ), 10 );
289 d->m_automaticDetection->insertItem( i18n( "Turkish" ), 11 );
290 d->m_automaticDetection->insertItem( i18n( "Ukrainian" ), 12 );
291 //d->m_automaticDetection->insertItem( i18n( "Unicode" ), 13 );
292 d->m_automaticDetection->insertItem( i18n( "Western European" ), 14 );
293
294 connect( d->m_automaticDetection, TQ_SIGNAL( activated( int ) ), this, TQ_SLOT( slotAutomaticDetectionLanguage( int ) ) );
295
296 d->m_paSetEncoding->popupMenu()->insertItem( i18n( "Automatic Detection" ), d->m_automaticDetection, 0 );
297
298 d->m_paSetEncoding->insert( new TDEActionSeparator( actionCollection() ) );
299
300
301 d->m_manualDetection = new TDESelectAction( i18n( "short for Manual Detection", "Manual" ), 0, this, TQ_SLOT( slotSetEncoding() ), actionCollection(), "manualDetection" );
302 TQStringList encodings = TDEGlobal::charsets()->descriptiveEncodingNames();
303 d->m_manualDetection->setItems( encodings );
304 d->m_manualDetection->setCurrentItem( -1 );
305 d->m_paSetEncoding->insert( d->m_manualDetection );
306
307
308 TDEConfig *config = TDEGlobal::config();
309 if ( config->hasGroup( "HTML Settings" ) ) {
310 config->setGroup( "HTML Settings" );
311 tdehtml::Decoder::AutoDetectLanguage language;
312 TQCString name = TQTextCodec::codecForLocale()->name();
313 name = name.lower();
314
315 if ( name == "cp1256" || name == "iso-8859-6" ) {
316 language = tdehtml::Decoder::Arabic;
317 }
318 else if ( name == "cp1257" || name == "iso-8859-13" || name == "iso-8859-4" ) {
319 language = tdehtml::Decoder::Baltic;
320 }
321 else if ( name == "cp1250" || name == "ibm852" || name == "iso-8859-2" || name == "iso-8859-3" ) {
322 language = tdehtml::Decoder::CentralEuropean;
323 }
324 else if ( name == "cp1251" || name == "koi8-r" || name == "iso-8859-5" ) {
325 language = tdehtml::Decoder::Russian;
326 }
327 else if ( name == "koi8-u" ) {
328 language = tdehtml::Decoder::Ukrainian;
329 }
330 else if ( name == "cp1253" || name == "iso-8859-7" ) {
331 language = tdehtml::Decoder::Greek;
332 }
333 else if ( name == "cp1255" || name == "iso-8859-8" || name == "iso-8859-8-i" ) {
334 language = tdehtml::Decoder::Hebrew;
335 }
336 else if ( name == "jis7" || name == "eucjp" || name == "sjis" ) {
337 language = tdehtml::Decoder::Japanese;
338 }
339 else if ( name == "cp1254" || name == "iso-8859-9" ) {
340 language = tdehtml::Decoder::Turkish;
341 }
342 else if ( name == "cp1252" || name == "iso-8859-1" || name == "iso-8859-15" ) {
343 language = tdehtml::Decoder::WesternEuropean;
344 }
345 else
346 language = tdehtml::Decoder::SemiautomaticDetection;
347
348 int _id = config->readNumEntry( "AutomaticDetectionLanguage", language );
349 d->m_automaticDetection->setItemChecked( _id, true );
350 d->m_paSetEncoding->popupMenu()->setItemChecked( 0, true );
351
352 d->m_autoDetectLanguage = static_cast< tdehtml::Decoder::AutoDetectLanguage >( _id );
353 }
354
355
356 d->m_paUseStylesheet = new TDESelectAction( i18n( "Use S&tylesheet"), 0, this, TQ_SLOT( slotUseStylesheet() ), actionCollection(), "useStylesheet" );
357
358 if ( prof == BrowserViewGUI ) {
359 d->m_paIncZoomFactor = new TDEHTMLZoomFactorAction( this, true, i18n(
360 "Enlarge Font" ), "zoom-in", "CTRL++;CTRL+=", this,
361 TQ_SLOT( slotIncZoomFast() ), actionCollection(), "incFontSizes" );
362 d->m_paIncZoomFactor->setWhatsThis( i18n( "Enlarge Font<p>"
363 "Make the font in this window bigger. "
364 "Click and hold down the mouse button for a menu with all available font sizes." ) );
365 d->m_paDecZoomFactor = new TDEHTMLZoomFactorAction( this, false, i18n(
366 "Shrink Font" ), "zoom-out", CTRL + Key_Minus, this,
367 TQ_SLOT( slotDecZoomFast() ), actionCollection(), "decFontSizes" );
368 d->m_paDecZoomFactor->setWhatsThis( i18n( "Shrink Font<p>"
369 "Make the font in this window smaller. "
370 "Click and hold down the mouse button for a menu with all available font sizes." ) );
371 }
372
373 d->m_paFind = KStdAction::find( this, TQ_SLOT( slotFind() ), actionCollection(), "find" );
374 d->m_paFind->setWhatsThis( i18n( "Find text<p>"
375 "Shows a dialog that allows you to find text on the displayed page." ) );
376
377 d->m_paFindNext = KStdAction::findNext( this, TQ_SLOT( slotFindNext() ), actionCollection(), "findNext" );
378 d->m_paFindNext->setWhatsThis( i18n( "Find next<p>"
379 "Find the next occurrence of the text that you "
380 "have found using the <b>Find Text</b> function" ) );
381
382 d->m_paFindPrev = KStdAction::findPrev( this, TQ_SLOT( slotFindPrev() ), actionCollection(), "findPrevious" );
383 d->m_paFindPrev->setWhatsThis( i18n( "Find previous<p>"
384 "Find the previous occurrence of the text that you "
385 "have found using the <b>Find Text</b> function" ) );
386
387 d->m_paFindAheadText = new TDEAction( i18n("Find Text as You Type"), TDEShortcut( '/' ), this, TQ_SLOT( slotFindAheadText()),
388 actionCollection(), "findAheadText");
389 d->m_paFindAheadLinks = new TDEAction( i18n("Find Links as You Type"), TDEShortcut( '\'' ), this, TQ_SLOT( slotFindAheadLink()),
390 actionCollection(), "findAheadLink");
391 d->m_paFindAheadText->setEnabled( false );
392 d->m_paFindAheadLinks->setEnabled( false );
393
394 if ( parentPart() )
395 {
396 d->m_paFind->setShortcut( TDEShortcut() ); // avoid clashes
397 d->m_paFindNext->setShortcut( TDEShortcut() ); // avoid clashes
398 d->m_paFindPrev->setShortcut( TDEShortcut() ); // avoid clashes
399 d->m_paFindAheadText->setShortcut( TDEShortcut());
400 d->m_paFindAheadLinks->setShortcut( TDEShortcut());
401 }
402
403 d->m_paPrintFrame = new TDEAction( i18n( "Print Frame..." ), "frameprint", 0, this, TQ_SLOT( slotPrintFrame() ), actionCollection(), "printFrame" );
404 d->m_paPrintFrame->setWhatsThis( i18n( "Print Frame<p>"
405 "Some pages have several frames. To print only a single frame, click "
406 "on it and then use this function." ) );
407
408 d->m_paSelectAll = KStdAction::selectAll( this, TQ_SLOT( slotSelectAll() ), actionCollection(), "selectAll" );
409 if ( parentPart() )
410 d->m_paSelectAll->setShortcut( TDEShortcut() ); // avoid clashes
411
412 d->m_paToggleCaretMode = new TDEToggleAction(i18n("Toggle Caret Mode"),
413 Key_F7, this, TQ_SLOT(slotToggleCaretMode()),
414 actionCollection(), "caretMode");
415 d->m_paToggleCaretMode->setChecked(isCaretMode());
416 if (parentPart())
417 d->m_paToggleCaretMode->setShortcut(TDEShortcut()); // avoid clashes
418
419 // set the default java(script) flags according to the current host.
420 d->m_bOpenMiddleClick = d->m_settings->isOpenMiddleClickEnabled();
421 d->m_bBackRightClick = d->m_settings->isBackRightClickEnabled();
422 d->m_bJScriptEnabled = d->m_settings->isJavaScriptEnabled();
423 setDebugScript( d->m_settings->isJavaScriptDebugEnabled() );
424 d->m_bJavaEnabled = d->m_settings->isJavaEnabled();
425 d->m_bPluginsEnabled = d->m_settings->isPluginsEnabled();
426
427 // Set the meta-refresh flag...
428 d->m_metaRefreshEnabled = d->m_settings->isAutoDelayedActionsEnabled ();
429
430 connect( view, TQ_SIGNAL( zoomView( int ) ), TQ_SLOT( slotZoomView( int ) ) );
431
432 connect( this, TQ_SIGNAL( completed() ),
433 this, TQ_SLOT( updateActions() ) );
434 connect( this, TQ_SIGNAL( completed( bool ) ),
435 this, TQ_SLOT( updateActions() ) );
436 connect( this, TQ_SIGNAL( started( TDEIO::Job * ) ),
437 this, TQ_SLOT( updateActions() ) );
438
439 d->m_popupMenuXML = KXMLGUIFactory::readConfigFile( locate( "data", "tdehtml/tdehtml_popupmenu.rc", TDEHTMLFactory::instance() ) );
440
441 connect( tdehtml::Cache::loader(), TQ_SIGNAL( requestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ),
442 this, TQ_SLOT( slotLoaderRequestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ) );
443 connect( tdehtml::Cache::loader(), TQ_SIGNAL( requestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
444 this, TQ_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
445 connect( tdehtml::Cache::loader(), TQ_SIGNAL( requestFailed( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
446 this, TQ_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
447
448 connect ( &d->m_progressUpdateTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotProgressUpdate() ) );
449
450 findTextBegin(); //reset find variables
451
452 connect( &d->m_redirectionTimer, TQ_SIGNAL( timeout() ),
453 this, TQ_SLOT( slotRedirect() ) );
454
455 d->m_dcopobject = new TDEHTMLPartIface(this);
456
457 // TODO KDE4 - load plugins now (see also the constructors)
458 //if ( prof == BrowserViewGUI && !parentPart() )
459 // loadPlugins( partObject(), this, instance() );
460
461 // "tdehtml" catalog does not exist, our translations are in tdelibs.
462 // removing this catalog from TDEGlobal::locale() prevents problems
463 // with changing the language in applications at runtime -Thomas Reitelbach
464 TDEGlobal::locale()->removeCatalogue("tdehtml");
465}
466
467TDEHTMLPart::~TDEHTMLPart()
468{
469 //kdDebug(6050) << "TDEHTMLPart::~TDEHTMLPart " << this << endl;
470
471 TDEConfig *config = TDEGlobal::config();
472 config->setGroup( "HTML Settings" );
473 config->writeEntry( "AutomaticDetectionLanguage", d->m_autoDetectLanguage );
474
475 delete d->m_automaticDetection;
476 delete d->m_manualDetection;
477
478 slotWalletClosed();
479 if (!parentPart()) { // only delete it if the top tdehtml_part closes
480 removeJSErrorExtension();
481 delete d->m_statusBarPopupLabel;
482 }
483
484 d->m_find = 0; // deleted by its parent, the view.
485
486 if ( d->m_manager )
487 {
488 d->m_manager->setActivePart( 0 );
489 // We specify "this" as parent qobject for d->manager, so no need to delete it.
490 }
491
492 stopAutoScroll();
493 d->m_redirectionTimer.stop();
494
495 if (!d->m_bComplete)
496 closeURL();
497
498 disconnect( tdehtml::Cache::loader(), TQ_SIGNAL( requestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ),
499 this, TQ_SLOT( slotLoaderRequestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ) );
500 disconnect( tdehtml::Cache::loader(), TQ_SIGNAL( requestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
501 this, TQ_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
502 disconnect( tdehtml::Cache::loader(), TQ_SIGNAL( requestFailed( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
503 this, TQ_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
504
505 clear();
506
507 if ( d->m_view )
508 {
509 d->m_view->hide();
510 d->m_view->viewport()->hide();
511 d->m_view->m_part = 0;
512 }
513
514 // Have to delete this here since we forward declare it in tdehtmlpart_p and
515 // at least some compilers won't call the destructor in this case.
516 delete d->m_jsedlg;
517 d->m_jsedlg = 0;
518
519 if (!parentPart()) // only delete d->m_frame if the top tdehtml_part closes
520 delete d->m_frame;
521 delete d; d = 0;
522 TDEHTMLFactory::deregisterPart( this );
523}
524
525bool TDEHTMLPart::restoreURL( const KURL &url )
526{
527 kdDebug( 6050 ) << "TDEHTMLPart::restoreURL " << url.url() << endl;
528
529 d->m_redirectionTimer.stop();
530
531 /*
532 * That's not a good idea as it will call closeURL() on all
533 * child frames, preventing them from further loading. This
534 * method gets called from restoreState() in case of a full frameset
535 * restoral, and restoreState() calls closeURL() before restoring
536 * anyway.
537 kdDebug( 6050 ) << "closing old URL" << endl;
538 closeURL();
539 */
540
541 d->m_bComplete = false;
542 d->m_bLoadEventEmitted = false;
543 d->m_workingURL = url;
544
545 // set the java(script) flags according to the current host.
546 d->m_bJScriptEnabled = TDEHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
547 setDebugScript( TDEHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
548 d->m_bJavaEnabled = TDEHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
549 d->m_bPluginsEnabled = TDEHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
550
551 m_url = url;
552
553 d->m_restoreScrollPosition = true;
554 disconnect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
555 connect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
556
557 TDEHTMLPageCache::self()->fetchData( d->m_cacheId, this, TQ_SLOT(slotRestoreData(const TQByteArray &)));
558
559 emit started( 0L );
560
561 return true;
562}
563
564
565bool TDEHTMLPart::openURL( const KURL &url )
566{
567 kdDebug( 6050 ) << "TDEHTMLPart(" << this << ")::openURL " << url.url() << endl;
568
569 d->m_redirectionTimer.stop();
570
571 // check to see if this is an "error://" URL. This is caused when an error
572 // occurs before this part was loaded (e.g. KonqRun), and is passed to
573 // tdehtmlpart so that it can display the error.
574 if ( url.protocol() == "error" && url.hasSubURL() ) {
575 closeURL();
576
577 if( d->m_bJScriptEnabled )
578 d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = TQString();
579
585 KURL::List urls = KURL::split( url );
586 //kdDebug(6050) << "Handling error URL. URL count:" << urls.count() << endl;
587
588 if ( urls.count() > 1 ) {
589 KURL mainURL = urls.first();
590 int error = mainURL.queryItem( "error" ).toInt();
591 // error=0 isn't a valid error code, so 0 means it's missing from the URL
592 if ( error == 0 ) error = TDEIO::ERR_UNKNOWN;
593 TQString errorText = mainURL.queryItem( "errText", HINT_UTF8 );
594 urls.pop_front();
595 d->m_workingURL = KURL::join( urls );
596 //kdDebug(6050) << "Emitting fixed URL " << d->m_workingURL.prettyURL() << endl;
597 emit d->m_extension->setLocationBarURL( d->m_workingURL.prettyURL() );
598 htmlError( error, errorText, d->m_workingURL );
599 return true;
600 }
601 }
602
603 if (!parentPart()) { // only do it for toplevel part
604 TQString host = url.isLocalFile() ? "localhost" : url.host();
605 TQString userAgent = KProtocolManager::userAgentForHost(host);
606 if (userAgent != KProtocolManager::userAgentForHost(TQString())) {
607 if (!d->m_statusBarUALabel) {
608 d->m_statusBarUALabel = new KURLLabel(d->m_statusBarExtension->statusBar());
609 d->m_statusBarUALabel->setFixedHeight(instance()->iconLoader()->currentSize(TDEIcon::Small));
610 d->m_statusBarUALabel->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
611 d->m_statusBarUALabel->setUseCursor(false);
612 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarUALabel, 0, false);
613 d->m_statusBarUALabel->setPixmap(SmallIcon("agent", instance()));
614 } else {
615 TQToolTip::remove(d->m_statusBarUALabel);
616 }
617 TQToolTip::add(d->m_statusBarUALabel, i18n("The fake user-agent '%1' is in use.").arg(userAgent));
618 } else if (d->m_statusBarUALabel) {
619 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarUALabel);
620 delete d->m_statusBarUALabel;
621 d->m_statusBarUALabel = 0L;
622 }
623 }
624
625 KParts::URLArgs args( d->m_extension->urlArgs() );
626
627 // in case
628 // a) we have no frameset (don't test m_frames.count(), iframes get in there)
629 // b) the url is identical with the currently displayed one (except for the htmlref!)
630 // c) the url request is not a POST operation and
631 // d) the caller did not request to reload the page
632 // e) there was no HTTP redirection meanwhile (testcase: webmin's software/tree.cgi)
633 // => we don't reload the whole document and
634 // we just jump to the requested html anchor
635 bool isFrameSet = false;
636 if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
637 HTMLDocumentImpl* htmlDoc = static_cast<HTMLDocumentImpl*>(d->m_doc);
638 isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
639 }
640
641 if ( url.hasRef() && !isFrameSet )
642 {
643 bool noReloadForced = !args.reload && !args.redirectedRequest() && !args.doPost();
644 if (noReloadForced && urlcmp( url.url(), m_url.url(), true, true ))
645 {
646 kdDebug( 6050 ) << "TDEHTMLPart::openURL, jumping to anchor. m_url = " << url.url() << endl;
647 m_url = url;
648 emit started( 0L );
649
650 if ( !gotoAnchor( url.encodedHtmlRef()) )
651 gotoAnchor( url.htmlRef() );
652
653 d->m_bComplete = true;
654 if (d->m_doc)
655 d->m_doc->setParsing(false);
656
657 kdDebug( 6050 ) << "completed..." << endl;
658 emit completed();
659 return true;
660 }
661 }
662
663 // Save offset of viewport when page is reloaded to be compliant
664 // to every other capable browser out there.
665 if (args.reload) {
666 args.xOffset = d->m_view->contentsX();
667 args.yOffset = d->m_view->contentsY();
668 d->m_extension->setURLArgs(args);
669 }
670
671 if (!d->m_restored)
672 closeURL();
673
674 d->m_restoreScrollPosition = d->m_restored;
675 disconnect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
676 connect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
677
678 // initializing m_url to the new url breaks relative links when opening such a link after this call and _before_ begin() is called (when the first
679 // data arrives) (Simon)
680 m_url = url;
681 if(m_url.protocol().startsWith( "http" ) && !m_url.host().isEmpty() &&
682 m_url.path().isEmpty()) {
683 m_url.setPath("/");
684 emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
685 }
686 // copy to m_workingURL after fixing m_url above
687 d->m_workingURL = m_url;
688
689 args.metaData().insert("main_frame_request", parentPart() == 0 ? "TRUE" : "FALSE" );
690 args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
691 args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
692 args.metaData().insert("PropagateHttpHeader", "true");
693 args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE" : "FALSE" );
694 args.metaData().insert("ssl_activate_warnings", "TRUE" );
695 args.metaData().insert("cross-domain", toplevelURL().url());
696
697 if (d->m_restored)
698 {
699 args.metaData().insert("referrer", d->m_pageReferrer);
700 d->m_cachePolicy = TDEIO::CC_Cache;
701 }
702 else if (args.reload)
703 d->m_cachePolicy = TDEIO::CC_Reload;
704 else
705 d->m_cachePolicy = KProtocolManager::cacheControl();
706
707 if ( args.doPost() && (m_url.protocol().startsWith("http")) )
708 {
709 d->m_job = TDEIO::http_post( m_url, args.postData, false );
710 d->m_job->addMetaData("content-type", args.contentType() );
711 }
712 else
713 {
714 d->m_job = TDEIO::get( m_url, false, false );
715 d->m_job->addMetaData("cache", TDEIO::getCacheControlString(d->m_cachePolicy));
716 }
717
718 if (widget())
719 d->m_job->setWindow(widget()->topLevelWidget());
720 d->m_job->addMetaData(args.metaData());
721
722 connect( d->m_job, TQ_SIGNAL( result( TDEIO::Job* ) ),
723 TQ_SLOT( slotFinished( TDEIO::Job* ) ) );
724 connect( d->m_job, TQ_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
725 TQ_SLOT( slotData( TDEIO::Job*, const TQByteArray& ) ) );
726 connect ( d->m_job, TQ_SIGNAL( infoMessage( TDEIO::Job*, const TQString& ) ),
727 TQ_SLOT( slotInfoMessage(TDEIO::Job*, const TQString& ) ) );
728 connect( d->m_job, TQ_SIGNAL(redirection(TDEIO::Job*, const KURL& ) ),
729 TQ_SLOT( slotRedirection(TDEIO::Job*, const KURL&) ) );
730
731 d->m_bComplete = false;
732 d->m_bLoadEventEmitted = false;
733
734 // delete old status bar msg's from kjs (if it _was_ activated on last URL)
735 if( d->m_bJScriptEnabled )
736 d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = TQString();
737
738 // set the javascript flags according to the current url
739 d->m_bJScriptEnabled = TDEHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
740 setDebugScript( TDEHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
741 d->m_bJavaEnabled = TDEHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
742 d->m_bPluginsEnabled = TDEHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
743
744
745 connect( d->m_job, TQ_SIGNAL( speed( TDEIO::Job*, unsigned long ) ),
746 this, TQ_SLOT( slotJobSpeed( TDEIO::Job*, unsigned long ) ) );
747
748 connect( d->m_job, TQ_SIGNAL( percent( TDEIO::Job*, unsigned long ) ),
749 this, TQ_SLOT( slotJobPercent( TDEIO::Job*, unsigned long ) ) );
750
751 connect( d->m_job, TQ_SIGNAL( result( TDEIO::Job* ) ),
752 this, TQ_SLOT( slotJobDone( TDEIO::Job* ) ) );
753
754 d->m_jobspeed = 0;
755
756 // If this was an explicit reload and the user style sheet should be used,
757 // do a stat to see whether the stylesheet was changed in the meanwhile.
758 if ( args.reload && !settings()->userStyleSheet().isEmpty() ) {
759 KURL url( settings()->userStyleSheet() );
760 TDEIO::StatJob *job = TDEIO::stat( url, false /* don't show progress */ );
761 connect( job, TQ_SIGNAL( result( TDEIO::Job * ) ),
762 this, TQ_SLOT( slotUserSheetStatDone( TDEIO::Job * ) ) );
763 }
764 emit started( 0L );
765
766 return true;
767}
768
769bool TDEHTMLPart::closeURL()
770{
771 if ( d->m_job )
772 {
773 TDEHTMLPageCache::self()->cancelEntry(d->m_cacheId);
774 d->m_job->kill();
775 d->m_job = 0;
776 }
777
778 if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
779 HTMLDocumentImpl* hdoc = static_cast<HTMLDocumentImpl*>( d->m_doc );
780
781 if ( hdoc->body() && d->m_bLoadEventEmitted ) {
782 hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT, false, false );
783 if ( d->m_doc )
784 d->m_doc->updateRendering();
785 d->m_bLoadEventEmitted = false;
786 }
787 }
788
789 d->m_bComplete = true; // to avoid emitting completed() in slotFinishedParsing() (David)
790 d->m_bLoadEventEmitted = true; // don't want that one either
791 d->m_cachePolicy = KProtocolManager::cacheControl(); // reset cache policy
792
793 disconnect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
794
795 TDEHTMLPageCache::self()->cancelFetch(this);
796 if ( d->m_doc && d->m_doc->parsing() )
797 {
798 kdDebug( 6050 ) << " was still parsing... calling end " << endl;
799 slotFinishedParsing();
800 d->m_doc->setParsing(false);
801 }
802
803 if ( !d->m_workingURL.isEmpty() )
804 {
805 // Aborted before starting to render
806 kdDebug( 6050 ) << "Aborted before starting to render, reverting location bar to " << m_url.prettyURL() << endl;
807 emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
808 }
809
810 d->m_workingURL = KURL();
811
812 if ( d->m_doc && d->m_doc->docLoader() )
813 tdehtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
814
815 // tell all subframes to stop as well
816 {
817 ConstFrameIt it = d->m_frames.begin();
818 const ConstFrameIt end = d->m_frames.end();
819 for (; it != end; ++it )
820 {
821 if ( (*it)->m_run )
822 (*it)->m_run->abort();
823 if ( !( *it )->m_part.isNull() )
824 ( *it )->m_part->closeURL();
825 }
826 }
827 // tell all objects to stop as well
828 {
829 ConstFrameIt it = d->m_objects.begin();
830 const ConstFrameIt end = d->m_objects.end();
831 for (; it != end; ++it)
832 {
833 if ( !( *it )->m_part.isNull() )
834 ( *it )->m_part->closeURL();
835 }
836 }
837 // Stop any started redirections as well!! (DA)
838 if ( d && d->m_redirectionTimer.isActive() )
839 d->m_redirectionTimer.stop();
840
841 // null node activated.
842 emit nodeActivated(Node());
843
844 // make sure before clear() runs, we pop out of a dialog's message loop
845 if ( d->m_view )
846 d->m_view->closeChildDialogs();
847
848 return true;
849}
850
851DOM::HTMLDocument TDEHTMLPart::htmlDocument() const
852{
853 if (d->m_doc && d->m_doc->isHTMLDocument())
854 return static_cast<HTMLDocumentImpl*>(d->m_doc);
855 else
856 return static_cast<HTMLDocumentImpl*>(0);
857}
858
859DOM::Document TDEHTMLPart::document() const
860{
861 return d->m_doc;
862}
863
864TQString TDEHTMLPart::documentSource() const
865{
866 TQString sourceStr;
867 if ( !( m_url.isLocalFile() ) && TDEHTMLPageCache::self()->isComplete( d->m_cacheId ) )
868 {
869 TQByteArray sourceArray;
870 TQDataStream dataStream( sourceArray, IO_WriteOnly );
871 TDEHTMLPageCache::self()->saveData( d->m_cacheId, &dataStream );
872 TQTextStream stream( sourceArray, IO_ReadOnly );
873 stream.setCodec( TQTextCodec::codecForName( encoding().latin1() ) );
874 sourceStr = stream.read();
875 } else
876 {
877 TQString tmpFile;
878 if( TDEIO::NetAccess::download( m_url, tmpFile, NULL ) )
879 {
880 TQFile f( tmpFile );
881 if ( f.open( IO_ReadOnly ) )
882 {
883 TQTextStream stream( &f );
884 stream.setCodec( TQTextCodec::codecForName( encoding().latin1() ) );
885 sourceStr = stream.read();
886 f.close();
887 }
888 TDEIO::NetAccess::removeTempFile( tmpFile );
889 }
890 }
891
892 return sourceStr;
893}
894
895
896KParts::BrowserExtension *TDEHTMLPart::browserExtension() const
897{
898 return d->m_extension;
899}
900
901KParts::BrowserHostExtension *TDEHTMLPart::browserHostExtension() const
902{
903 return d->m_hostExtension;
904}
905
906TDEHTMLView *TDEHTMLPart::view() const
907{
908 return d->m_view;
909}
910
911void TDEHTMLPart::setStatusMessagesEnabled( bool enable )
912{
913 d->m_statusMessagesEnabled = enable;
914}
915
916KJS::Interpreter *TDEHTMLPart::jScriptInterpreter()
917{
918 KJSProxy *proxy = jScript();
919 if (!proxy || proxy->paused())
920 return 0;
921
922 return proxy->interpreter();
923}
924
925bool TDEHTMLPart::statusMessagesEnabled() const
926{
927 return d->m_statusMessagesEnabled;
928}
929
930void TDEHTMLPart::setJScriptEnabled( bool enable )
931{
932 if ( !enable && jScriptEnabled() && d->m_frame && d->m_frame->m_jscript ) {
933 d->m_frame->m_jscript->clear();
934 }
935 d->m_bJScriptForce = enable;
936 d->m_bJScriptOverride = true;
937}
938
939bool TDEHTMLPart::jScriptEnabled() const
940{
941 if(onlyLocalReferences()) return false;
942
943 if ( d->m_bJScriptOverride )
944 return d->m_bJScriptForce;
945 return d->m_bJScriptEnabled;
946}
947
948void TDEHTMLPart::setMetaRefreshEnabled( bool enable )
949{
950 d->m_metaRefreshEnabled = enable;
951}
952
953bool TDEHTMLPart::metaRefreshEnabled() const
954{
955 return d->m_metaRefreshEnabled;
956}
957
958// Define this to disable dlopening kjs_html, when directly linking to it.
959// You need to edit tdehtml/Makefile.am to add ./ecma/libkjs_html.la to LIBADD
960// and to edit tdehtml/ecma/Makefile.am to s/kjs_html/libkjs_html/, remove libtdehtml from LIBADD,
961// remove LDFLAGS line, and replace kde_module with either lib (shared) or noinst (static)
962// Also, change the order of "ecma" and "." in tdehtml's SUBDIRS line.
963// OK - that's the default now, use the opposite of the above instructions to go back
964// to "dlopening it" - but it breaks exception catching in kjs_binding.cpp
965#define DIRECT_LINKAGE_TO_ECMA
966
967#ifdef DIRECT_LINKAGE_TO_ECMA
968extern "C" { KJSProxy *kjs_html_init(tdehtml::ChildFrame * childframe); }
969#endif
970
971static bool createJScript(tdehtml::ChildFrame *frame)
972{
973#ifndef DIRECT_LINKAGE_TO_ECMA
974 KLibrary *lib = KLibLoader::self()->library("kjs_html");
975 if ( !lib ) {
976 setJScriptEnabled( false );
977 return false;
978 }
979 // look for plain C init function
980 void *sym = lib->symbol("kjs_html_init");
981 if ( !sym ) {
982 lib->unload();
983 setJScriptEnabled( false );
984 return false;
985 }
986 typedef KJSProxy* (*initFunction)(tdehtml::ChildFrame *);
987 initFunction initSym = (initFunction) sym;
988 frame->m_jscript = (*initSym)(d->m_frame);
989 frame->m_kjs_lib = lib;
990#else
991 frame->m_jscript = kjs_html_init(frame);
992 // frame->m_kjs_lib remains 0L.
993#endif
994 return true;
995}
996
997KJSProxy *TDEHTMLPart::jScript()
998{
999 if (!jScriptEnabled()) return 0;
1000
1001 if ( !d->m_frame ) {
1002 TDEHTMLPart * p = parentPart();
1003 if (!p) {
1004 d->m_frame = new tdehtml::ChildFrame;
1005 d->m_frame->m_part = this;
1006 } else {
1007 ConstFrameIt it = p->d->m_frames.begin();
1008 const ConstFrameIt end = p->d->m_frames.end();
1009 for (; it != end; ++it)
1010 if ((*it)->m_part.operator->() == this) {
1011 d->m_frame = *it;
1012 break;
1013 }
1014 }
1015 if ( !d->m_frame )
1016 return 0;
1017 }
1018 if ( !d->m_frame->m_jscript )
1019 if (!createJScript(d->m_frame))
1020 return 0;
1021 if (d->m_bJScriptDebugEnabled)
1022 d->m_frame->m_jscript->setDebugEnabled(true);
1023
1024 return d->m_frame->m_jscript;
1025}
1026
1027TQVariant TDEHTMLPart::crossFrameExecuteScript(const TQString& target, const TQString& script)
1028{
1029 TDEHTMLPart* destpart = this;
1030
1031 TQString trg = target.lower();
1032
1033 if (target == "_top") {
1034 while (destpart->parentPart())
1035 destpart = destpart->parentPart();
1036 }
1037 else if (target == "_parent") {
1038 if (parentPart())
1039 destpart = parentPart();
1040 }
1041 else if (target == "_self" || target == "_blank") {
1042 // we always allow these
1043 }
1044 else {
1045 destpart = findFrame(target);
1046 if (!destpart)
1047 destpart = this;
1048 }
1049
1050 // easy way out?
1051 if (destpart == this)
1052 return executeScript(DOM::Node(), script);
1053
1054 // now compare the domains
1055 if (destpart->checkFrameAccess(this))
1056 return destpart->executeScript(DOM::Node(), script);
1057
1058 // eww, something went wrong. better execute it in our frame
1059 return executeScript(DOM::Node(), script);
1060}
1061
1062//Enable this to see all JS scripts being executed
1063//#define KJS_VERBOSE
1064
1065KJSErrorDlg *TDEHTMLPart::jsErrorExtension() {
1066 if (!d->m_settings->jsErrorsEnabled()) {
1067 return 0L;
1068 }
1069
1070 if (parentPart()) {
1071 return parentPart()->jsErrorExtension();
1072 }
1073
1074 if (!d->m_statusBarJSErrorLabel) {
1075 d->m_statusBarJSErrorLabel = new KURLLabel(d->m_statusBarExtension->statusBar());
1076 d->m_statusBarJSErrorLabel->setFixedHeight(instance()->iconLoader()->currentSize(TDEIcon::Small));
1077 d->m_statusBarJSErrorLabel->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
1078 d->m_statusBarJSErrorLabel->setUseCursor(false);
1079 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarJSErrorLabel, 0, false);
1080 TQToolTip::add(d->m_statusBarJSErrorLabel, i18n("This web page contains coding errors."));
1081 d->m_statusBarJSErrorLabel->setPixmap(SmallIcon("bug", instance()));
1082 connect(d->m_statusBarJSErrorLabel, TQ_SIGNAL(leftClickedURL()), TQ_SLOT(launchJSErrorDialog()));
1083 connect(d->m_statusBarJSErrorLabel, TQ_SIGNAL(rightClickedURL()), TQ_SLOT(jsErrorDialogContextMenu()));
1084 }
1085 if (!d->m_jsedlg) {
1086 d->m_jsedlg = new KJSErrorDlg;
1087 d->m_jsedlg->setURL(m_url.prettyURL());
1088 if (TDEGlobalSettings::showIconsOnPushButtons()) {
1089 d->m_jsedlg->_clear->setIconSet(SmallIconSet("locationbar_erase"));
1090 d->m_jsedlg->_close->setIconSet(SmallIconSet("window-close"));
1091 }
1092 }
1093 return d->m_jsedlg;
1094}
1095
1096void TDEHTMLPart::removeJSErrorExtension() {
1097 if (parentPart()) {
1098 parentPart()->removeJSErrorExtension();
1099 return;
1100 }
1101 if (d->m_statusBarJSErrorLabel != 0) {
1102 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarJSErrorLabel );
1103 delete d->m_statusBarJSErrorLabel;
1104 d->m_statusBarJSErrorLabel = 0;
1105 }
1106 delete d->m_jsedlg;
1107 d->m_jsedlg = 0;
1108}
1109
1110void TDEHTMLPart::disableJSErrorExtension() {
1111 removeJSErrorExtension();
1112 // These two lines are really kind of hacky, and it sucks to do this inside
1113 // TDEHTML but I don't know of anything that's reasonably easy as an alternative
1114 // right now. It makes me wonder if there should be a more clean way to
1115 // contact all running "TDEHTML" instance as opposed to Konqueror instances too.
1116 d->m_settings->setJSErrorsEnabled(false);
1117 DCOPClient::mainClient()->send("konqueror*", "KonquerorIface", "reparseConfiguration()", TQByteArray());
1118}
1119
1120void TDEHTMLPart::jsErrorDialogContextMenu() {
1121 TDEPopupMenu *m = new TDEPopupMenu(0L);
1122 m->insertItem(i18n("&Hide Errors"), this, TQ_SLOT(removeJSErrorExtension()));
1123 m->insertItem(i18n("&Disable Error Reporting"), this, TQ_SLOT(disableJSErrorExtension()));
1124 m->popup(TQCursor::pos());
1125}
1126
1127void TDEHTMLPart::launchJSErrorDialog() {
1128 KJSErrorDlg *dlg = jsErrorExtension();
1129 if (dlg) {
1130 dlg->show();
1131 dlg->raise();
1132 }
1133}
1134
1135void TDEHTMLPart::launchJSConfigDialog() {
1136 TQStringList args;
1137 args << "tdehtml_java_js";
1138 TDEApplication::tdeinitExec( "tdecmshell", args );
1139}
1140
1141TQVariant TDEHTMLPart::executeScript(const TQString& filename, int baseLine, const DOM::Node& n, const TQString& script)
1142{
1143#ifdef KJS_VERBOSE
1144 // The script is now printed by KJS's Parser::parse
1145 kdDebug(6070) << "executeScript: caller='" << name() << "' filename=" << filename << " baseLine=" << baseLine /*<< " script=" << script*/ << endl;
1146#endif
1147 KJSProxy *proxy = jScript();
1148
1149 if (!proxy || proxy->paused())
1150 return TQVariant();
1151
1152 KJS::Completion comp;
1153
1154 TQVariant ret = proxy->evaluate(filename, baseLine, script, n, &comp);
1155
1156 /*
1157 * Error handling
1158 */
1159 if (comp.complType() == KJS::Throw && !comp.value().isNull()) {
1160 KJSErrorDlg *dlg = jsErrorExtension();
1161 if (dlg) {
1162 KJS::UString msg = comp.value().toString(proxy->interpreter()->globalExec());
1163 dlg->addError(i18n("<b>Error</b>: %1: %2").arg(filename, msg.qstring()));
1164 }
1165 }
1166
1167 // Handle immediate redirects now (e.g. location='foo')
1168 if ( !d->m_redirectURL.isEmpty() && d->m_delayRedirect == -1 )
1169 {
1170 kdDebug(6070) << "executeScript done, handling immediate redirection NOW" << endl;
1171 // Must abort tokenizer, no further script must execute.
1172 tdehtml::Tokenizer* t = d->m_doc->tokenizer();
1173 if(t)
1174 t->abort();
1175 d->m_redirectionTimer.start( 0, true );
1176 }
1177
1178 return ret;
1179}
1180
1181TQVariant TDEHTMLPart::executeScript( const TQString &script )
1182{
1183 return executeScript( DOM::Node(), script );
1184}
1185
1186TQVariant TDEHTMLPart::executeScript( const DOM::Node &n, const TQString &script )
1187{
1188#ifdef KJS_VERBOSE
1189 kdDebug(6070) << "TDEHTMLPart::executeScript caller='" << name() << "' node=" << n.nodeName().string().latin1() << "(" << (n.isNull() ? 0 : n.nodeType()) << ") " /* << script */ << endl;
1190#endif
1191 KJSProxy *proxy = jScript();
1192
1193 if (!proxy || proxy->paused())
1194 return TQVariant();
1195 ++(d->m_runningScripts);
1196 KJS::Completion comp;
1197 const TQVariant ret = proxy->evaluate( TQString(), 1, script, n, &comp );
1198 --(d->m_runningScripts);
1199
1200 /*
1201 * Error handling
1202 */
1203 if (comp.complType() == KJS::Throw && !comp.value().isNull()) {
1204 KJSErrorDlg *dlg = jsErrorExtension();
1205 if (dlg) {
1206 KJS::UString msg = comp.value().toString(proxy->interpreter()->globalExec());
1207 dlg->addError(i18n("<b>Error</b>: node %1: %2").arg(n.nodeName().string()).arg(msg.qstring()));
1208 }
1209 }
1210
1211 if (!d->m_runningScripts && d->m_doc && !d->m_doc->parsing() && d->m_submitForm )
1212 submitFormAgain();
1213
1214#ifdef KJS_VERBOSE
1215 kdDebug(6070) << "TDEHTMLPart::executeScript - done" << endl;
1216#endif
1217 return ret;
1218}
1219
1220bool TDEHTMLPart::scheduleScript(const DOM::Node &n, const TQString& script)
1221{
1222 //kdDebug(6050) << "TDEHTMLPart::scheduleScript "<< script << endl;
1223
1224 d->scheduledScript = script;
1225 d->scheduledScriptNode = n;
1226
1227 return true;
1228}
1229
1230TQVariant TDEHTMLPart::executeScheduledScript()
1231{
1232 if( d->scheduledScript.isEmpty() )
1233 return TQVariant();
1234
1235 //kdDebug(6050) << "executing delayed " << d->scheduledScript << endl;
1236
1237 TQVariant ret = executeScript( d->scheduledScriptNode, d->scheduledScript );
1238 d->scheduledScript = TQString();
1239 d->scheduledScriptNode = DOM::Node();
1240
1241 return ret;
1242}
1243
1244void TDEHTMLPart::setJavaEnabled( bool enable )
1245{
1246 d->m_bJavaForce = enable;
1247 d->m_bJavaOverride = true;
1248}
1249
1250bool TDEHTMLPart::javaEnabled() const
1251{
1252 if (onlyLocalReferences()) return false;
1253
1254#ifndef TQ_WS_QWS
1255 if( d->m_bJavaOverride )
1256 return d->m_bJavaForce;
1257 return d->m_bJavaEnabled;
1258#else
1259 return false;
1260#endif
1261}
1262
1263KJavaAppletContext *TDEHTMLPart::javaContext()
1264{
1265 return 0;
1266}
1267
1268KJavaAppletContext *TDEHTMLPart::createJavaContext()
1269{
1270 return 0;
1271}
1272
1273void TDEHTMLPart::setPluginsEnabled( bool enable )
1274{
1275 d->m_bPluginsForce = enable;
1276 d->m_bPluginsOverride = true;
1277}
1278
1279bool TDEHTMLPart::pluginsEnabled() const
1280{
1281 if (onlyLocalReferences()) return false;
1282
1283 if ( d->m_bPluginsOverride )
1284 return d->m_bPluginsForce;
1285 return d->m_bPluginsEnabled;
1286}
1287
1288static int s_DOMTreeIndentLevel = 0;
1289
1290void TDEHTMLPart::slotDebugDOMTree()
1291{
1292 if ( d->m_doc && d->m_doc->firstChild() )
1293 tqDebug("%s", d->m_doc->firstChild()->toString().string().latin1());
1294
1295 // Now print the contents of the frames that contain HTML
1296
1297 const int indentLevel = s_DOMTreeIndentLevel++;
1298
1299 ConstFrameIt it = d->m_frames.begin();
1300 const ConstFrameIt end = d->m_frames.end();
1301 for (; it != end; ++it )
1302 if ( !( *it )->m_part.isNull() && (*it)->m_part->inherits( "TDEHTMLPart" ) ) {
1303 KParts::ReadOnlyPart* const p = ( *it )->m_part;
1304 kdDebug(6050) << TQString().leftJustify(s_DOMTreeIndentLevel*4,' ') << "FRAME " << p->name() << " " << endl;
1305 static_cast<TDEHTMLPart*>( p )->slotDebugDOMTree();
1306 }
1307 s_DOMTreeIndentLevel = indentLevel;
1308}
1309
1310void TDEHTMLPart::slotDebugScript()
1311{
1312 if (jScript())
1313 jScript()->showDebugWindow();
1314}
1315
1316void TDEHTMLPart::slotDebugRenderTree()
1317{
1318#ifndef NDEBUG
1319 if ( d->m_doc ) {
1320 d->m_doc->renderer()->printTree();
1321 // dump out the contents of the rendering & DOM trees
1322// TQString dumps;
1323// TQTextStream outputStream(dumps,IO_WriteOnly);
1324// d->m_doc->renderer()->layer()->dump( outputStream );
1325// kdDebug() << "dump output:" << "\n" + dumps;
1326 }
1327#endif
1328}
1329
1330void TDEHTMLPart::slotStopAnimations()
1331{
1332 stopAnimations();
1333}
1334
1335void TDEHTMLPart::setAutoloadImages( bool enable )
1336{
1337 if ( d->m_doc && d->m_doc->docLoader()->autoloadImages() == enable )
1338 return;
1339
1340 if ( d->m_doc )
1341 d->m_doc->docLoader()->setAutoloadImages( enable );
1342
1343 unplugActionList( "loadImages" );
1344
1345 if ( enable ) {
1346 delete d->m_paLoadImages;
1347 d->m_paLoadImages = 0;
1348 }
1349 else if ( !d->m_paLoadImages )
1350 d->m_paLoadImages = new TDEAction( i18n( "Display Images on Page" ), "images_display", 0, this, TQ_SLOT( slotLoadImages() ), actionCollection(), "loadImages" );
1351
1352 if ( d->m_paLoadImages ) {
1353 TQPtrList<TDEAction> lst;
1354 lst.append( d->m_paLoadImages );
1355 plugActionList( "loadImages", lst );
1356 }
1357}
1358
1359bool TDEHTMLPart::autoloadImages() const
1360{
1361 if ( d->m_doc )
1362 return d->m_doc->docLoader()->autoloadImages();
1363
1364 return true;
1365}
1366
1367void TDEHTMLPart::clear()
1368{
1369 if ( d->m_bCleared )
1370 return;
1371
1372 d->m_bCleared = true;
1373
1374 d->m_bClearing = true;
1375
1376 {
1377 ConstFrameIt it = d->m_frames.begin();
1378 const ConstFrameIt end = d->m_frames.end();
1379 for(; it != end; ++it )
1380 {
1381 // Stop HTMLRun jobs for frames
1382 if ( (*it)->m_run )
1383 (*it)->m_run->abort();
1384 }
1385 }
1386
1387 {
1388 ConstFrameIt it = d->m_objects.begin();
1389 const ConstFrameIt end = d->m_objects.end();
1390 for(; it != end; ++it )
1391 {
1392 // Stop HTMLRun jobs for objects
1393 if ( (*it)->m_run )
1394 (*it)->m_run->abort();
1395 }
1396 }
1397
1398
1399 findTextBegin(); // resets d->m_findNode and d->m_findPos
1400 d->m_mousePressNode = DOM::Node();
1401
1402
1403 if ( d->m_doc )
1404 {
1405 if (d->m_doc->attached()) //the view may have detached it already
1406 d->m_doc->detach();
1407 }
1408
1409 // Moving past doc so that onUnload works.
1410 if ( d->m_frame && d->m_frame->m_jscript )
1411 d->m_frame->m_jscript->clear();
1412
1413 // stopping marquees
1414 if (d->m_doc && d->m_doc->renderer() && d->m_doc->renderer()->layer())
1415 d->m_doc->renderer()->layer()->suspendMarquees();
1416
1417 if ( d->m_view )
1418 d->m_view->clear();
1419
1420 // do not dereference the document before the jscript and view are cleared, as some destructors
1421 // might still try to access the document.
1422 if ( d->m_doc ) {
1423 d->m_doc->deref();
1424 }
1425 d->m_doc = 0;
1426
1427 delete d->m_decoder;
1428 d->m_decoder = 0;
1429
1430 // We don't want to change between parts if we are going to delete all of them anyway
1431 if (partManager()) {
1432 disconnect( partManager(), TQ_SIGNAL( activePartChanged( KParts::Part * ) ),
1433 this, TQ_SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
1434 }
1435
1436 if (d->m_frames.count())
1437 {
1438 TDEHTMLFrameList frames = d->m_frames;
1439 d->m_frames.clear();
1440 ConstFrameIt it = frames.begin();
1441 const ConstFrameIt end = frames.end();
1442 for(; it != end; ++it )
1443 {
1444 if ( (*it)->m_part )
1445 {
1446 partManager()->removePart( (*it)->m_part );
1447 delete (KParts::ReadOnlyPart *)(*it)->m_part;
1448 }
1449 delete *it;
1450 }
1451 }
1452 d->m_suppressedPopupOriginParts.clear();
1453
1454 if (d->m_objects.count())
1455 {
1456 TDEHTMLFrameList objects = d->m_objects;
1457 d->m_objects.clear();
1458 ConstFrameIt oi = objects.begin();
1459 const ConstFrameIt oiEnd = objects.end();
1460
1461 for (; oi != oiEnd; ++oi )
1462 delete *oi;
1463 }
1464
1465 // Listen to part changes again
1466 if (partManager()) {
1467 connect( partManager(), TQ_SIGNAL( activePartChanged( KParts::Part * ) ),
1468 this, TQ_SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
1469 }
1470
1471 d->m_delayRedirect = 0;
1472 d->m_redirectURL = TQString();
1473 d->m_redirectionTimer.stop();
1474 d->m_redirectLockHistory = true;
1475 d->m_bClearing = false;
1476 d->m_frameNameId = 1;
1477 d->m_bFirstData = true;
1478
1479 d->m_bMousePressed = false;
1480
1481 d->m_selectionStart = DOM::Node();
1482 d->m_selectionEnd = DOM::Node();
1483 d->m_startOffset = 0;
1484 d->m_endOffset = 0;
1485#ifndef TQT_NO_CLIPBOARD
1486 connect( tdeApp->clipboard(), TQ_SIGNAL( selectionChanged()), TQ_SLOT( slotClearSelection()));
1487#endif
1488
1489 d->m_jobPercent = 0;
1490
1491 if ( !d->m_haveEncoding )
1492 d->m_encoding = TQString();
1493#ifdef SPEED_DEBUG
1494 d->m_parsetime.restart();
1495#endif
1496}
1497
1498bool TDEHTMLPart::openFile()
1499{
1500 return true;
1501}
1502
1503DOM::HTMLDocumentImpl *TDEHTMLPart::docImpl() const
1504{
1505 if ( d && d->m_doc && d->m_doc->isHTMLDocument() )
1506 return static_cast<HTMLDocumentImpl*>(d->m_doc);
1507 return 0;
1508}
1509
1510DOM::DocumentImpl *TDEHTMLPart::xmlDocImpl() const
1511{
1512 if ( d )
1513 return d->m_doc;
1514 return 0;
1515}
1516
1517void TDEHTMLPart::slotInfoMessage(TDEIO::Job* tdeio_job, const TQString& msg)
1518{
1519 assert(d->m_job == tdeio_job);
1520
1521 if (!parentPart())
1522 setStatusBarText(msg, BarDefaultText);
1523}
1524
1525void TDEHTMLPart::setPageSecurity( PageSecurity sec )
1526{
1527 emit d->m_extension->setPageSecurity( sec );
1528 if ( sec != NotCrypted && !d->m_statusBarIconLabel && !parentPart() ) {
1529 d->m_statusBarIconLabel = new KURLLabel( d->m_statusBarExtension->statusBar() );
1530 d->m_statusBarIconLabel->setFixedHeight( instance()->iconLoader()->currentSize(TDEIcon::Small) );
1531 d->m_statusBarIconLabel->setSizePolicy(TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ));
1532 d->m_statusBarIconLabel->setUseCursor( false );
1533 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarIconLabel, 0, false );
1534 connect( d->m_statusBarIconLabel, TQ_SIGNAL( leftClickedURL() ), TQ_SLOT( slotSecurity() ) );
1535 } else if (d->m_statusBarIconLabel) {
1536 TQToolTip::remove(d->m_statusBarIconLabel);
1537 }
1538
1539 if (d->m_statusBarIconLabel) {
1540 if (d->m_ssl_in_use)
1541 TQToolTip::add(d->m_statusBarIconLabel,
1542 i18n("Session is secured with %1 bit %2.").arg(d->m_ssl_cipher_used_bits).arg(d->m_ssl_cipher));
1543 else TQToolTip::add(d->m_statusBarIconLabel, i18n("Session is not secured."));
1544 }
1545
1546 TQString iconName;
1547 switch (sec) {
1548 case NotCrypted:
1549 iconName = "decrypted";
1550 if ( d->m_statusBarIconLabel ) {
1551 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarIconLabel );
1552 delete d->m_statusBarIconLabel;
1553 d->m_statusBarIconLabel = 0L;
1554 }
1555 break;
1556 case Encrypted:
1557 iconName = "encrypted";
1558 break;
1559 case Mixed:
1560 iconName = "halfencrypted";
1561 break;
1562 }
1563 d->m_paSecurity->setIcon( iconName );
1564 if ( d->m_statusBarIconLabel )
1565 d->m_statusBarIconLabel->setPixmap( SmallIcon( iconName, instance() ) );
1566}
1567
1568void TDEHTMLPart::slotData( TDEIO::Job* tdeio_job, const TQByteArray &data )
1569{
1570 assert ( d->m_job == tdeio_job );
1571
1572 //kdDebug( 6050 ) << "slotData: " << data.size() << endl;
1573 // The first data ?
1574 if ( !d->m_workingURL.isEmpty() )
1575 {
1576 //kdDebug( 6050 ) << "begin!" << endl;
1577
1578 // We must suspend TDEIO while we're inside begin() because it can cause
1579 // crashes if a window (such as kjsdebugger) goes back into the event loop,
1580 // more data arrives, and begin() gets called again (re-entered).
1581 d->m_job->suspend();
1582 begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
1583 d->m_job->resume();
1584
1585 if (d->m_cachePolicy == TDEIO::CC_Refresh)
1586 d->m_doc->docLoader()->setCachePolicy(TDEIO::CC_Verify);
1587 else
1588 d->m_doc->docLoader()->setCachePolicy(d->m_cachePolicy);
1589
1590 d->m_workingURL = KURL();
1591
1592 d->m_cacheId = TDEHTMLPageCache::self()->createCacheEntry();
1593
1594 // When the first data arrives, the metadata has just been made available
1595 d->m_httpHeaders = d->m_job->queryMetaData("HTTP-Headers");
1596 time_t cacheCreationDate = d->m_job->queryMetaData("cache-creation-date").toLong();
1597 d->m_doc->docLoader()->setCacheCreationDate(cacheCreationDate);
1598
1599 d->m_pageServices = d->m_job->queryMetaData("PageServices");
1600 d->m_pageReferrer = d->m_job->queryMetaData("referrer");
1601 d->m_bSecurityInQuestion = false;
1602 d->m_ssl_in_use = (d->m_job->queryMetaData("ssl_in_use") == "TRUE");
1603
1604 {
1605 TDEHTMLPart *p = parentPart();
1606 if (p && p->d->m_ssl_in_use != d->m_ssl_in_use) {
1607 while (p->parentPart()) p = p->parentPart();
1608
1609 p->setPageSecurity( Mixed );
1610 p->d->m_bSecurityInQuestion = true;
1611 }
1612 }
1613
1614 setPageSecurity( d->m_ssl_in_use ? Encrypted : NotCrypted );
1615
1616 // Shouldn't all of this be done only if ssl_in_use == true ? (DF)
1617 d->m_ssl_parent_ip = d->m_job->queryMetaData("ssl_parent_ip");
1618 d->m_ssl_parent_cert = d->m_job->queryMetaData("ssl_parent_cert");
1619 d->m_ssl_peer_certificate = d->m_job->queryMetaData("ssl_peer_certificate");
1620 d->m_ssl_peer_chain = d->m_job->queryMetaData("ssl_peer_chain");
1621 d->m_ssl_peer_ip = d->m_job->queryMetaData("ssl_peer_ip");
1622 d->m_ssl_cipher = d->m_job->queryMetaData("ssl_cipher");
1623 d->m_ssl_cipher_desc = d->m_job->queryMetaData("ssl_cipher_desc");
1624 d->m_ssl_cipher_version = d->m_job->queryMetaData("ssl_cipher_version");
1625 d->m_ssl_cipher_used_bits = d->m_job->queryMetaData("ssl_cipher_used_bits");
1626 d->m_ssl_cipher_bits = d->m_job->queryMetaData("ssl_cipher_bits");
1627 d->m_ssl_cert_state = d->m_job->queryMetaData("ssl_cert_state");
1628
1629 if (d->m_statusBarIconLabel) {
1630 TQToolTip::remove(d->m_statusBarIconLabel);
1631 if (d->m_ssl_in_use) {
1632 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));
1633 } else {
1634 TQToolTip::add(d->m_statusBarIconLabel, i18n("Session is not secured."));
1635 }
1636 }
1637
1638 // Check for charset meta-data
1639 TQString qData = d->m_job->queryMetaData("charset");
1640 if ( !qData.isEmpty() && !d->m_haveEncoding ) // only use information if the user didn't override the settings
1641 d->m_encoding = qData;
1642
1643
1644 // Support for http-refresh
1645 qData = d->m_job->queryMetaData("http-refresh");
1646 if( !qData.isEmpty())
1647 d->m_doc->processHttpEquiv("refresh", qData);
1648
1649 // DISABLED: Support Content-Location per section 14.14 of RFC 2616.
1650 // See BR# 51185,BR# 82747
1651 /*
1652 TQString baseURL = d->m_job->queryMetaData ("content-location");
1653 if (!baseURL.isEmpty())
1654 d->m_doc->setBaseURL(KURL( d->m_doc->completeURL(baseURL) ));
1655 */
1656
1657 // Support for Content-Language
1658 TQString language = d->m_job->queryMetaData("content-language");
1659 if (!language.isEmpty())
1660 d->m_doc->setContentLanguage(language);
1661
1662 if ( !m_url.isLocalFile() ) {
1663 // Support for http last-modified
1664 d->m_lastModified = d->m_job->queryMetaData("modified");
1665 } else
1666 d->m_lastModified = TQString(); // done on-demand by lastModified()
1667 }
1668
1669 TDEHTMLPageCache::self()->addData(d->m_cacheId, data);
1670 write( data.data(), data.size() );
1671 if (d->m_frame && d->m_frame->m_jscript)
1672 d->m_frame->m_jscript->dataReceived();
1673}
1674
1675void TDEHTMLPart::slotRestoreData(const TQByteArray &data )
1676{
1677 // The first data ?
1678 if ( !d->m_workingURL.isEmpty() )
1679 {
1680 long saveCacheId = d->m_cacheId;
1681 TQString savePageReferrer = d->m_pageReferrer;
1682 TQString saveEncoding = d->m_encoding;
1683 begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
1684 d->m_encoding = saveEncoding;
1685 d->m_pageReferrer = savePageReferrer;
1686 d->m_cacheId = saveCacheId;
1687 d->m_workingURL = KURL();
1688 }
1689
1690 //kdDebug( 6050 ) << "slotRestoreData: " << data.size() << endl;
1691 write( data.data(), data.size() );
1692
1693 if (data.size() == 0)
1694 {
1695 //kdDebug( 6050 ) << "slotRestoreData: <<end of data>>" << endl;
1696 // End of data.
1697 if (d->m_doc && d->m_doc->parsing())
1698 end(); //will emit completed()
1699 }
1700}
1701
1702void TDEHTMLPart::showError( TDEIO::Job* job )
1703{
1704 kdDebug(6050) << "TDEHTMLPart::showError d->m_bParsing=" << (d->m_doc && d->m_doc->parsing()) << " d->m_bComplete=" << d->m_bComplete
1705 << " d->m_bCleared=" << d->m_bCleared << endl;
1706
1707 if (job->error() == TDEIO::ERR_NO_CONTENT)
1708 return;
1709
1710 if ( (d->m_doc && d->m_doc->parsing()) || d->m_workingURL.isEmpty() ) // if we got any data already
1711 job->showErrorDialog( /*d->m_view*/ );
1712 else
1713 {
1714 htmlError( job->error(), job->errorText(), d->m_workingURL );
1715 }
1716}
1717
1718// This is a protected method, placed here because of it's relevance to showError
1719void TDEHTMLPart::htmlError( int errorCode, const TQString& text, const KURL& reqUrl )
1720{
1721 kdDebug(6050) << "TDEHTMLPart::htmlError errorCode=" << errorCode << " text=" << text << endl;
1722 // make sure we're not executing any embedded JS
1723 bool bJSFO = d->m_bJScriptForce;
1724 bool bJSOO = d->m_bJScriptOverride;
1725 d->m_bJScriptForce = false;
1726 d->m_bJScriptOverride = true;
1727 begin();
1728 TQString errText = TQString::fromLatin1( "<HTML dir=%1><HEAD><TITLE>" )
1729 .arg(TQApplication::reverseLayout() ? "rtl" : "ltr");
1730 errText += i18n( "Error while loading %1" ).arg( reqUrl.htmlURL() );
1731 errText += TQString::fromLatin1( "</TITLE></HEAD><BODY><P>" );
1732 errText += i18n( "An error occurred while loading <B>%1</B>:" ).arg( reqUrl.htmlURL() );
1733 errText += TQString::fromLatin1( "</P>" );
1734 errText += TQStyleSheet::convertFromPlainText( TDEIO::buildErrorString( errorCode, text ) );
1735 errText += TQString::fromLatin1( "</BODY></HTML>" );
1736 write(errText);
1737 end();
1738
1739 d->m_bJScriptForce = bJSFO;
1740 d->m_bJScriptOverride = bJSOO;
1741
1742 // make the working url the current url, so that reload works and
1743 // emit the progress signals to advance one step in the history
1744 // (so that 'back' works)
1745 m_url = reqUrl; // same as d->m_workingURL
1746 d->m_workingURL = KURL();
1747 emit started( 0 );
1748 emit completed();
1749 return;
1750 // following disabled until 3.1
1751
1752 TQString errorName, techName, description;
1753 TQStringList causes, solutions;
1754
1755 TQByteArray raw = TDEIO::rawErrorDetail( errorCode, text, &reqUrl );
1756 TQDataStream stream(raw, IO_ReadOnly);
1757
1758 stream >> errorName >> techName >> description >> causes >> solutions;
1759
1760 TQString url, protocol, datetime;
1761 url = reqUrl.prettyURL();
1762 protocol = reqUrl.protocol();
1763 datetime = TDEGlobal::locale()->formatDateTime( TQDateTime::currentDateTime(),
1764 false );
1765
1766 TQString doc = TQString::fromLatin1( "<html><head><title>" );
1767 doc += i18n( "Error: " );
1768 doc += errorName;
1769 doc += TQString::fromLatin1( " - %1</title></head><body><h1>" ).arg( url );
1770 doc += i18n( "The requested operation could not be completed" );
1771 doc += TQString::fromLatin1( "</h1><h2>" );
1772 doc += errorName;
1773 doc += TQString::fromLatin1( "</h2>" );
1774 if ( !techName.isNull() ) {
1775 doc += TQString::fromLatin1( "<h2>" );
1776 doc += i18n( "Technical Reason: " );
1777 doc += techName;
1778 doc += TQString::fromLatin1( "</h2>" );
1779 }
1780 doc += TQString::fromLatin1( "<h3>" );
1781 doc += i18n( "Details of the Request:" );
1782 doc += TQString::fromLatin1( "</h3><ul><li>" );
1783 doc += i18n( "URL: %1" ).arg( url );
1784 doc += TQString::fromLatin1( "</li><li>" );
1785 if ( !protocol.isNull() ) {
1786 // uncomment for 3.1... i18n change
1787 // doc += i18n( "Protocol: %1" ).arg( protocol ).arg( protocol );
1788 doc += TQString::fromLatin1( "</li><li>" );
1789 }
1790 doc += i18n( "Date and Time: %1" ).arg( datetime );
1791 doc += TQString::fromLatin1( "</li><li>" );
1792 doc += i18n( "Additional Information: %1" ).arg( text );
1793 doc += TQString::fromLatin1( "</li></ul><h3>" );
1794 doc += i18n( "Description:" );
1795 doc += TQString::fromLatin1( "</h3><p>" );
1796 doc += description;
1797 doc += TQString::fromLatin1( "</p>" );
1798 if ( causes.count() ) {
1799 doc += TQString::fromLatin1( "<h3>" );
1800 doc += i18n( "Possible Causes:" );
1801 doc += TQString::fromLatin1( "</h3><ul><li>" );
1802 doc += causes.join( "</li><li>" );
1803 doc += TQString::fromLatin1( "</li></ul>" );
1804 }
1805 if ( solutions.count() ) {
1806 doc += TQString::fromLatin1( "<h3>" );
1807 doc += i18n( "Possible Solutions:" );
1808 doc += TQString::fromLatin1( "</h3><ul><li>" );
1809 doc += solutions.join( "</li><li>" );
1810 doc += TQString::fromLatin1( "</li></ul>" );
1811 }
1812 doc += TQString::fromLatin1( "</body></html>" );
1813
1814 write( doc );
1815 end();
1816}
1817
1818void TDEHTMLPart::slotFinished( TDEIO::Job * job )
1819{
1820 d->m_job = 0L;
1821 d->m_jobspeed = 0L;
1822
1823 if (job->error())
1824 {
1825 TDEHTMLPageCache::self()->cancelEntry(d->m_cacheId);
1826
1827 // The following catches errors that occur as a result of HTTP
1828 // to FTP redirections where the FTP URL is a directory. Since
1829 // TDEIO cannot change a redirection request from GET to LISTDIR,
1830 // we have to take care of it here once we know for sure it is
1831 // a directory...
1832 if (job->error() == TDEIO::ERR_IS_DIRECTORY)
1833 {
1834 KParts::URLArgs args;
1835 emit d->m_extension->openURLRequest( d->m_workingURL, args );
1836 }
1837 else
1838 {
1839 emit canceled( job->errorString() );
1840 // TODO: what else ?
1841 checkCompleted();
1842 showError( job );
1843 }
1844
1845 return;
1846 }
1847 TDEIO::TransferJob *tjob = ::tqt_cast<TDEIO::TransferJob*>(job);
1848 if (tjob && tjob->isErrorPage()) {
1849 tdehtml::RenderPart *renderPart = d->m_frame ? static_cast<tdehtml::RenderPart *>(d->m_frame->m_frame) : 0;
1850 if (renderPart) {
1851 HTMLObjectElementImpl* elt = static_cast<HTMLObjectElementImpl *>(renderPart->element());
1852 if (!elt)
1853 return;
1854 elt->renderAlternative();
1855 checkCompleted();
1856 }
1857 if (d->m_bComplete) return;
1858 }
1859
1860 //kdDebug( 6050 ) << "slotFinished" << endl;
1861
1862 TDEHTMLPageCache::self()->endData(d->m_cacheId);
1863 if (d->m_frame && d->m_frame->m_jscript)
1864 d->m_frame->m_jscript->dataReceived();
1865
1866 if ( d->m_doc && d->m_doc->docLoader()->expireDate() && m_url.protocol().lower().startsWith("http"))
1867 TDEIO::http_update_cache(m_url, false, d->m_doc->docLoader()->expireDate());
1868
1869 d->m_workingURL = KURL();
1870
1871 if ( d->m_doc && d->m_doc->parsing())
1872 end(); //will emit completed()
1873}
1874
1875void TDEHTMLPart::begin( const KURL &url, int xOffset, int yOffset )
1876{
1877 // No need to show this for a new page until an error is triggered
1878 if (!parentPart()) {
1879 removeJSErrorExtension();
1880 setSuppressedPopupIndicator( false );
1881 d->m_openableSuppressedPopups = 0;
1882 for ( TQValueListIterator<TQGuardedPtr<TDEHTMLPart> > i = d->m_suppressedPopupOriginParts.begin();
1883 i != d->m_suppressedPopupOriginParts.end(); ++i ) {
1884
1885 if (TDEHTMLPart* part = *i) {
1886 KJS::Window *w = KJS::Window::retrieveWindow( part );
1887 if (w)
1888 w->forgetSuppressedWindows();
1889 }
1890 }
1891 }
1892
1893 clear();
1894 d->m_bCleared = false;
1895 d->m_cacheId = 0;
1896 d->m_bComplete = false;
1897 d->m_bLoadEventEmitted = false;
1898
1899 if(url.isValid()) {
1900 TQString urlString = url.url();
1901 TDEHTMLFactory::vLinks()->insert( urlString );
1902 TQString urlString2 = url.prettyURL();
1903 if ( urlString != urlString2 ) {
1904 TDEHTMLFactory::vLinks()->insert( urlString2 );
1905 }
1906 }
1907
1908
1909 // ###
1910 //stopParser();
1911
1912 KParts::URLArgs args( d->m_extension->urlArgs() );
1913 args.xOffset = xOffset;
1914 args.yOffset = yOffset;
1915 d->m_extension->setURLArgs( args );
1916
1917 d->m_pageReferrer = TQString();
1918
1919 KURL ref(url);
1920 d->m_referrer = ref.protocol().startsWith("http") ? ref.url() : "";
1921
1922 m_url = url;
1923
1924 bool servedAsXHTML = args.serviceType == "application/xhtml+xml";
1925 bool servedAsXML = KMimeType::mimeType(args.serviceType)->is( "text/xml" );
1926 // ### not sure if XHTML documents served as text/xml should use DocumentImpl or HTMLDocumentImpl
1927 if ( servedAsXML && !servedAsXHTML ) { // any XML derivative, except XHTML
1928 d->m_doc = DOMImplementationImpl::instance()->createDocument( d->m_view );
1929 } else {
1930 d->m_doc = DOMImplementationImpl::instance()->createHTMLDocument( d->m_view );
1931 // HTML or XHTML? (#86446)
1932 static_cast<HTMLDocumentImpl *>(d->m_doc)->setHTMLRequested( !servedAsXHTML );
1933 }
1934#ifndef TDEHTML_NO_CARET
1935// d->m_view->initCaret();
1936#endif
1937
1938 d->m_doc->ref();
1939 d->m_doc->setURL( m_url.url() );
1940 if (!d->m_doc->attached())
1941 d->m_doc->attach( );
1942 d->m_doc->setBaseURL( KURL() );
1943 d->m_doc->docLoader()->setShowAnimations( TDEHTMLFactory::defaultHTMLSettings()->showAnimations() );
1944 emit docCreated();
1945
1946 d->m_paUseStylesheet->setItems(TQStringList());
1947 d->m_paUseStylesheet->setEnabled( false );
1948
1949 setAutoloadImages( TDEHTMLFactory::defaultHTMLSettings()->autoLoadImages() );
1950 TQString userStyleSheet = TDEHTMLFactory::defaultHTMLSettings()->userStyleSheet();
1951 if ( !userStyleSheet.isEmpty() )
1952 setUserStyleSheet( KURL( userStyleSheet ) );
1953
1954 d->m_doc->setRestoreState(args.docState);
1955 d->m_doc->open();
1956 connect(d->m_doc,TQ_SIGNAL(finishedParsing()),this,TQ_SLOT(slotFinishedParsing()));
1957
1958 emit d->m_extension->enableAction( "print", true );
1959
1960 d->m_doc->setParsing(true);
1961}
1962
1963void TDEHTMLPart::write( const char *str, int len )
1964{
1965 if ( !d->m_decoder )
1966 d->m_decoder = createDecoder();
1967
1968 if ( len == -1 )
1969 len = strlen( str );
1970
1971 if ( len == 0 )
1972 return;
1973
1974 TQString decoded = d->m_decoder->decode( str, len );
1975
1976 if(decoded.isEmpty()) return;
1977
1978 if(d->m_bFirstData) {
1979 // determine the parse mode
1980 d->m_doc->determineParseMode( decoded );
1981 d->m_bFirstData = false;
1982
1983 //kdDebug(6050) << "TDEHTMLPart::write haveEnc = " << d->m_haveEncoding << endl;
1984 // ### this is still quite hacky, but should work a lot better than the old solution
1985 if(d->m_decoder->visuallyOrdered()) d->m_doc->setVisuallyOrdered();
1986 d->m_doc->setDecoderCodec(d->m_decoder->codec());
1987 d->m_doc->recalcStyle( NodeImpl::Force );
1988 }
1989
1990 tdehtml::Tokenizer* t = d->m_doc->tokenizer();
1991 if(t)
1992 t->write( decoded, true );
1993}
1994
1995void TDEHTMLPart::write( const TQString &str )
1996{
1997 if ( str.isNull() )
1998 return;
1999
2000 if(d->m_bFirstData) {
2001 // determine the parse mode
2002 d->m_doc->setParseMode( DocumentImpl::Strict );
2003 d->m_bFirstData = false;
2004 }
2005 tdehtml::Tokenizer* t = d->m_doc->tokenizer();
2006 if(t)
2007 t->write( str, true );
2008}
2009
2010void TDEHTMLPart::end()
2011{
2012 if (d->m_doc) {
2013 if (d->m_decoder) {
2014 TQString decoded = d->m_decoder->flush();
2015 if (d->m_bFirstData) {
2016 d->m_bFirstData = false;
2017 d->m_doc->determineParseMode(decoded);
2018 }
2019 write(decoded);
2020 }
2021 d->m_doc->finishParsing();
2022 }
2023}
2024
2025bool TDEHTMLPart::doOpenStream( const TQString& mimeType )
2026{
2027 KMimeType::Ptr mime = KMimeType::mimeType(mimeType);
2028 if ( mime->is( "text/html" ) || mime->is( "text/xml" ) )
2029 {
2030 begin( url() );
2031 return true;
2032 }
2033 return false;
2034}
2035
2036bool TDEHTMLPart::doWriteStream( const TQByteArray& data )
2037{
2038 write( data.data(), data.size() );
2039 return true;
2040}
2041
2042bool TDEHTMLPart::doCloseStream()
2043{
2044 end();
2045 return true;
2046}
2047
2048
2049void TDEHTMLPart::paint(TQPainter *p, const TQRect &rc, int yOff, bool *more)
2050{
2051 if (!d->m_view) return;
2052 d->m_view->paint(p, rc, yOff, more);
2053}
2054
2055void TDEHTMLPart::stopAnimations()
2056{
2057 if ( d->m_doc )
2058 d->m_doc->docLoader()->setShowAnimations( TDEHTMLSettings::KAnimationDisabled );
2059
2060 ConstFrameIt it = d->m_frames.begin();
2061 const ConstFrameIt end = d->m_frames.end();
2062 for (; it != end; ++it )
2063 if ( !(*it)->m_part.isNull() && (*it)->m_part->inherits( "TDEHTMLPart" ) ) {
2064 KParts::ReadOnlyPart* const p = ( *it )->m_part;
2065 static_cast<TDEHTMLPart*>( p )->stopAnimations();
2066 }
2067}
2068
2069void TDEHTMLPart::resetFromScript()
2070{
2071 closeURL();
2072 d->m_bComplete = false;
2073 d->m_bLoadEventEmitted = false;
2074 disconnect(d->m_doc,TQ_SIGNAL(finishedParsing()),this,TQ_SLOT(slotFinishedParsing()));
2075 connect(d->m_doc,TQ_SIGNAL(finishedParsing()),this,TQ_SLOT(slotFinishedParsing()));
2076 d->m_doc->setParsing(true);
2077
2078 emit started( 0L );
2079}
2080
2081void TDEHTMLPart::slotFinishedParsing()
2082{
2083 d->m_doc->setParsing(false);
2084 checkEmitLoadEvent();
2085 disconnect(d->m_doc,TQ_SIGNAL(finishedParsing()),this,TQ_SLOT(slotFinishedParsing()));
2086
2087 if (!d->m_view)
2088 return; // We are probably being destructed.
2089
2090 checkCompleted();
2091}
2092
2093void TDEHTMLPart::slotLoaderRequestStarted( tdehtml::DocLoader* dl, tdehtml::CachedObject *obj )
2094{
2095 if ( obj && obj->type() == tdehtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
2096 TDEHTMLPart* p = this;
2097 while ( p ) {
2098 TDEHTMLPart* const op = p;
2099 ++(p->d->m_totalObjectCount);
2100 p = p->parentPart();
2101 if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount
2102 && !op->d->m_progressUpdateTimer.isActive())
2103 op->d->m_progressUpdateTimer.start( 200, true );
2104 }
2105 }
2106}
2107
2108void TDEHTMLPart::slotLoaderRequestDone( tdehtml::DocLoader* dl, tdehtml::CachedObject *obj )
2109{
2110 if ( obj && obj->type() == tdehtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
2111 TDEHTMLPart* p = this;
2112 while ( p ) {
2113 TDEHTMLPart* const op = p;
2114 ++(p->d->m_loadedObjects);
2115 p = p->parentPart();
2116 if ( !p && op->d->m_loadedObjects <= op->d->m_totalObjectCount && op->d->m_jobPercent <= 100
2117 && !op->d->m_progressUpdateTimer.isActive())
2118 op->d->m_progressUpdateTimer.start( 200, true );
2119 }
2120 }
2121
2122 checkCompleted();
2123}
2124
2125void TDEHTMLPart::slotProgressUpdate()
2126{
2127 int percent;
2128 if ( d->m_loadedObjects < d->m_totalObjectCount )
2129 percent = d->m_jobPercent / 4 + ( d->m_loadedObjects*300 ) / ( 4*d->m_totalObjectCount );
2130 else
2131 percent = d->m_jobPercent;
2132
2133 if( d->m_bComplete )
2134 percent = 100;
2135
2136 if (d->m_statusMessagesEnabled) {
2137 if( d->m_bComplete )
2138 emit d->m_extension->infoMessage( i18n( "Page loaded." ));
2139 else if ( d->m_loadedObjects < d->m_totalObjectCount && percent >= 75 )
2140 emit d->m_extension->infoMessage( i18n( "%n Image of %1 loaded.", "%n Images of %1 loaded.", d->m_loadedObjects).arg(d->m_totalObjectCount) );
2141 }
2142
2143 emit d->m_extension->loadingProgress( percent );
2144}
2145
2146void TDEHTMLPart::slotJobSpeed( TDEIO::Job* /*job*/, unsigned long speed )
2147{
2148 d->m_jobspeed = speed;
2149 if (!parentPart())
2150 setStatusBarText(jsStatusBarText(), BarOverrideText);
2151}
2152
2153void TDEHTMLPart::slotJobPercent( TDEIO::Job* /*job*/, unsigned long percent )
2154{
2155 d->m_jobPercent = percent;
2156
2157 if ( !parentPart() )
2158 d->m_progressUpdateTimer.start( 0, true );
2159}
2160
2161void TDEHTMLPart::slotJobDone( TDEIO::Job* /*job*/ )
2162{
2163 d->m_jobPercent = 100;
2164
2165 if ( !parentPart() )
2166 d->m_progressUpdateTimer.start( 0, true );
2167}
2168
2169void TDEHTMLPart::slotUserSheetStatDone( TDEIO::Job *_job )
2170{
2171 using namespace TDEIO;
2172
2173 if ( _job->error() ) {
2174 showError( _job );
2175 return;
2176 }
2177
2178 const UDSEntry entry = dynamic_cast<TDEIO::StatJob *>( _job )->statResult();
2179 UDSEntry::ConstIterator it = entry.begin();
2180 const UDSEntry::ConstIterator end = entry.end();
2181 for ( ; it != end; ++it ) {
2182 if ( ( *it ).m_uds == UDS_MODIFICATION_TIME ) {
2183 break;
2184 }
2185 }
2186
2187 // If the filesystem supports modification times, only reload the
2188 // user-defined stylesheet if necessary - otherwise always reload.
2189 if ( it != end ) {
2190 const time_t lastModified = static_cast<time_t>( ( *it ).m_long );
2191 if ( d->m_userStyleSheetLastModified >= lastModified ) {
2192 return;
2193 }
2194 d->m_userStyleSheetLastModified = lastModified;
2195 }
2196
2197 setUserStyleSheet( KURL( settings()->userStyleSheet() ) );
2198}
2199
2200void TDEHTMLPart::checkCompleted()
2201{
2202// kdDebug( 6050 ) << "TDEHTMLPart::checkCompleted() " << this << " " << name() << endl;
2203// kdDebug( 6050 ) << " parsing: " << (d->m_doc && d->m_doc->parsing()) << endl;
2204// kdDebug( 6050 ) << " complete: " << d->m_bComplete << endl;
2205
2206 // restore the cursor position
2207 if (d->m_doc && !d->m_doc->parsing() && !d->m_focusNodeRestored)
2208 {
2209 if (d->m_focusNodeNumber >= 0)
2210 d->m_doc->setFocusNode(d->m_doc->nodeWithAbsIndex(d->m_focusNodeNumber));
2211
2212 d->m_focusNodeRestored = true;
2213 }
2214
2215 bool bPendingChildRedirection = false;
2216 // Any frame that hasn't completed yet ?
2217 ConstFrameIt it = d->m_frames.begin();
2218 const ConstFrameIt end = d->m_frames.end();
2219 for (; it != end; ++it ) {
2220 if ( !(*it)->m_bCompleted )
2221 {
2222 //kdDebug( 6050 ) << this << " is waiting for " << (*it)->m_part << endl;
2223 return;
2224 }
2225 // Check for frames with pending redirections
2226 if ( (*it)->m_bPendingRedirection )
2227 bPendingChildRedirection = true;
2228 }
2229
2230 // Any object that hasn't completed yet ?
2231 {
2232 ConstFrameIt oi = d->m_objects.begin();
2233 const ConstFrameIt oiEnd = d->m_objects.end();
2234
2235 for (; oi != oiEnd; ++oi )
2236 if ( !(*oi)->m_bCompleted )
2237 return;
2238 }
2239 // Are we still parsing - or have we done the completed stuff already ?
2240 if ( d->m_bComplete || (d->m_doc && d->m_doc->parsing()) )
2241 return;
2242
2243 // Still waiting for images/scripts from the loader ?
2244 int requests = 0;
2245 if ( d->m_doc && d->m_doc->docLoader() )
2246 requests = tdehtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
2247
2248 if ( requests > 0 )
2249 {
2250 //kdDebug(6050) << "still waiting for images/scripts from the loader - requests:" << requests << endl;
2251 return;
2252 }
2253
2254 // OK, completed.
2255 // Now do what should be done when we are really completed.
2256 d->m_bComplete = true;
2257 d->m_cachePolicy = KProtocolManager::cacheControl(); // reset cache policy
2258 d->m_totalObjectCount = 0;
2259 d->m_loadedObjects = 0;
2260
2261 TDEHTMLPart* p = this;
2262 while ( p ) {
2263 TDEHTMLPart* op = p;
2264 p = p->parentPart();
2265 if ( !p && !op->d->m_progressUpdateTimer.isActive())
2266 op->d->m_progressUpdateTimer.start( 0, true );
2267 }
2268
2269 checkEmitLoadEvent(); // if we didn't do it before
2270
2271 bool pendingAction = false;
2272
2273 if ( !d->m_redirectURL.isEmpty() )
2274 {
2275 // DA: Do not start redirection for frames here! That action is
2276 // deferred until the parent emits a completed signal.
2277 if ( parentPart() == 0 ) {
2278 //kdDebug(6050) << this << " starting redirection timer" << endl;
2279 d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
2280 } else {
2281 //kdDebug(6050) << this << " not toplevel -> not starting redirection timer. Waiting for slotParentCompleted." << endl;
2282 }
2283
2284 pendingAction = true;
2285 }
2286 else if ( bPendingChildRedirection )
2287 {
2288 pendingAction = true;
2289 }
2290
2291 // the view will emit completed on our behalf,
2292 // either now or at next repaint if one is pending
2293
2294 //kdDebug(6050) << this << " asks the view to emit completed. pendingAction=" << pendingAction << endl;
2295 d->m_view->complete( pendingAction );
2296
2297 // find the alternate stylesheets
2298 TQStringList sheets;
2299 if (d->m_doc)
2300 sheets = d->m_doc->availableStyleSheets();
2301 sheets.prepend( i18n( "Automatic Detection" ) );
2302 d->m_paUseStylesheet->setItems( sheets );
2303
2304 d->m_paUseStylesheet->setEnabled( sheets.count() > 2);
2305 if (sheets.count() > 2)
2306 {
2307 d->m_paUseStylesheet->setCurrentItem(kMax(sheets.findIndex(d->m_sheetUsed), 0));
2308 slotUseStylesheet();
2309 }
2310
2311 setJSDefaultStatusBarText(TQString());
2312
2313#ifdef SPEED_DEBUG
2314 kdDebug(6050) << "DONE: " <<d->m_parsetime.elapsed() << endl;
2315#endif
2316}
2317
2318void TDEHTMLPart::checkEmitLoadEvent()
2319{
2320 if ( d->m_bLoadEventEmitted || !d->m_doc || d->m_doc->parsing() ) return;
2321
2322 ConstFrameIt it = d->m_frames.begin();
2323 const ConstFrameIt end = d->m_frames.end();
2324 for (; it != end; ++it )
2325 if ( !(*it)->m_bCompleted ) // still got a frame running -> too early
2326 return;
2327
2328 ConstFrameIt oi = d->m_objects.begin();
2329 const ConstFrameIt oiEnd = d->m_objects.end();
2330
2331 for (; oi != oiEnd; ++oi )
2332 if ( !(*oi)->m_bCompleted ) // still got a object running -> too early
2333 return;
2334
2335 // Still waiting for images/scripts from the loader ?
2336 // (onload must happen afterwards, #45607)
2337 // ## This makes this method very similar to checkCompleted. A brave soul should try merging them.
2338 int requests = 0;
2339 if ( d->m_doc && d->m_doc->docLoader() )
2340 requests = tdehtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
2341
2342 if ( requests > 0 )
2343 return;
2344
2345 d->m_bLoadEventEmitted = true;
2346 if (d->m_doc)
2347 d->m_doc->close();
2348}
2349
2350const TDEHTMLSettings *TDEHTMLPart::settings() const
2351{
2352 return d->m_settings;
2353}
2354
2355#ifndef KDE_NO_COMPAT
2356KURL TDEHTMLPart::baseURL() const
2357{
2358 if ( !d->m_doc ) return KURL();
2359
2360 return d->m_doc->baseURL();
2361}
2362
2363TQString TDEHTMLPart::baseTarget() const
2364{
2365 if ( !d->m_doc ) return TQString();
2366
2367 return d->m_doc->baseTarget();
2368}
2369#endif
2370
2371KURL TDEHTMLPart::completeURL( const TQString &url )
2372{
2373 if ( !d->m_doc ) return KURL( url );
2374
2375 if (d->m_decoder)
2376 return KURL(d->m_doc->completeURL(url), d->m_decoder->codec()->mibEnum());
2377
2378 return KURL( d->m_doc->completeURL( url ) );
2379}
2380
2381// Called by ecma/kjs_window in case of redirections from Javascript,
2382// and by xml/dom_docimpl.cpp in case of http-equiv meta refresh.
2383void TDEHTMLPart::scheduleRedirection( int delay, const TQString &url, bool doLockHistory )
2384{
2385 kdDebug(6050) << "TDEHTMLPart::scheduleRedirection delay=" << delay << " url=" << url << endl;
2386 kdDebug(6050) << "current redirectURL=" << d->m_redirectURL << " with delay " << d->m_delayRedirect << endl;
2387 if( delay < 24*60*60 &&
2388 ( d->m_redirectURL.isEmpty() || delay <= d->m_delayRedirect) ) {
2389 d->m_delayRedirect = delay;
2390 d->m_redirectURL = url;
2391 d->m_redirectLockHistory = doLockHistory;
2392 kdDebug(6050) << " d->m_bComplete=" << d->m_bComplete << endl;
2393 if ( d->m_bComplete ) {
2394 d->m_redirectionTimer.stop();
2395 d->m_redirectionTimer.start( kMax(0, 1000 * d->m_delayRedirect), true );
2396 }
2397 }
2398}
2399
2400void TDEHTMLPart::slotRedirect()
2401{
2402 kdDebug(6050) << this << " slotRedirect()" << endl;
2403 TQString u = d->m_redirectURL;
2404 d->m_delayRedirect = 0;
2405 d->m_redirectURL = TQString();
2406
2407 // SYNC check with ecma/kjs_window.cpp::goURL !
2408 if ( u.find( TQString::fromLatin1( "javascript:" ), 0, false ) == 0 )
2409 {
2410 TQString script = KURL::decode_string( u.right( u.length() - 11 ) );
2411 kdDebug( 6050 ) << "TDEHTMLPart::slotRedirect script=" << script << endl;
2412 TQVariant res = executeScript( DOM::Node(), script );
2413 if ( res.type() == TQVariant::String ) {
2414 begin( url() );
2415 write( res.asString() );
2416 end();
2417 }
2418 emit completed();
2419 return;
2420 }
2421 KParts::URLArgs args;
2422 KURL cUrl( m_url );
2423 KURL url( u );
2424
2425 // handle windows opened by JS
2426 if ( openedByJS() && d->m_opener )
2427 cUrl = d->m_opener->url();
2428
2429 if (!tdeApp || !tdeApp->authorizeURLAction("redirect", cUrl, url))
2430 {
2431 kdWarning(6050) << "TDEHTMLPart::scheduleRedirection: Redirection from " << cUrl << " to " << url << " REJECTED!" << endl;
2432 emit completed();
2433 return;
2434 }
2435
2436 if ( urlcmp( u, m_url.url(), true, true ) )
2437 {
2438 args.metaData().insert("referrer", d->m_pageReferrer);
2439 }
2440
2441 // For javascript and META-tag based redirections:
2442 // - We don't take cross-domain-ness in consideration if we are the
2443 // toplevel frame because the new URL may be in a different domain as the current URL
2444 // but that's ok.
2445 // - If we are not the toplevel frame then we check against the toplevelURL()
2446 if (parentPart())
2447 args.metaData().insert("cross-domain", toplevelURL().url());
2448
2449 args.setLockHistory( d->m_redirectLockHistory );
2450 // _self: make sure we don't use any <base target=>'s
2451
2452 d->m_urlSelectedOpenedURL = true; // In case overriden, default to success
2453 urlSelected( u, 0, 0, "_self", args );
2454
2455 if ( !d->m_urlSelectedOpenedURL ) // urlSelected didn't open a url, so emit completed ourselves
2456 emit completed();
2457}
2458
2459void TDEHTMLPart::slotRedirection(TDEIO::Job*, const KURL& url)
2460{
2461 // the slave told us that we got redirected
2462 //kdDebug( 6050 ) << "redirection by TDEIO to " << url.url() << endl;
2463 emit d->m_extension->setLocationBarURL( url.prettyURL() );
2464 d->m_workingURL = url;
2465}
2466
2467bool TDEHTMLPart::setEncoding( const TQString &name, bool override )
2468{
2469 d->m_encoding = name;
2470 d->m_haveEncoding = override;
2471
2472 if( !m_url.isEmpty() ) {
2473 // reload document
2474 closeURL();
2475 KURL url = m_url;
2476 m_url = 0;
2477 d->m_restored = true;
2478 openURL(url);
2479 d->m_restored = false;
2480 }
2481
2482 return true;
2483}
2484
2485TQString TDEHTMLPart::encoding() const
2486{
2487 if(d->m_haveEncoding && !d->m_encoding.isEmpty())
2488 return d->m_encoding;
2489
2490 if(d->m_decoder && d->m_decoder->encoding())
2491 return TQString(d->m_decoder->encoding());
2492
2493 return defaultEncoding();
2494}
2495
2496TQString TDEHTMLPart::defaultEncoding() const
2497{
2498 TQString encoding = settings()->encoding();
2499 if ( !encoding.isEmpty() )
2500 return encoding;
2501 // HTTP requires the default encoding to be latin1, when neither
2502 // the user nor the page requested a particular encoding.
2503 if ( url().protocol().startsWith( "http" ) )
2504 return "iso-8859-1";
2505 else
2506 return TDEGlobal::locale()->encoding();
2507}
2508
2509void TDEHTMLPart::setUserStyleSheet(const KURL &url)
2510{
2511 if ( d->m_doc && d->m_doc->docLoader() )
2512 (void) new tdehtml::PartStyleSheetLoader(this, url.url(), d->m_doc->docLoader());
2513}
2514
2515void TDEHTMLPart::setUserStyleSheet(const TQString &styleSheet)
2516{
2517 if ( d->m_doc )
2518 d->m_doc->setUserStyleSheet( styleSheet );
2519}
2520
2521bool TDEHTMLPart::gotoAnchor( const TQString &name )
2522{
2523 if (!d->m_doc)
2524 return false;
2525
2526 HTMLCollectionImpl *anchors =
2527 new HTMLCollectionImpl( d->m_doc, HTMLCollectionImpl::DOC_ANCHORS);
2528 anchors->ref();
2529 NodeImpl *n = anchors->namedItem(name);
2530 anchors->deref();
2531
2532 if(!n) {
2533 n = d->m_doc->getElementById( name );
2534 }
2535
2536 d->m_doc->setCSSTarget(n); // Setting to null will clear the current target.
2537
2538 // Implement the rule that "" and "top" both mean top of page as in other browsers.
2539 bool quirkyName = !n && !d->m_doc->inStrictMode() && (name.isEmpty() || name.lower() == "top");
2540
2541 if (quirkyName) {
2542 d->m_view->setContentsPos(0, 0);
2543 return true;
2544 } else if (!n) {
2545 kdDebug(6050) << "TDEHTMLPart::gotoAnchor node '" << name << "' not found" << endl;
2546 return false;
2547 }
2548
2549 int x = 0, y = 0;
2550 int gox, dummy;
2551 HTMLElementImpl *a = static_cast<HTMLElementImpl *>(n);
2552
2553 a->getUpperLeftCorner(x, y);
2554 if (x <= d->m_view->contentsX())
2555 gox = x - 10;
2556 else {
2557 gox = d->m_view->contentsX();
2558 if ( x + 10 > d->m_view->contentsX()+d->m_view->visibleWidth()) {
2559 a->getLowerRightCorner(x, dummy);
2560 gox = x - d->m_view->visibleWidth() + 10;
2561 }
2562 }
2563
2564 d->m_view->setContentsPos(gox, y);
2565
2566 return true;
2567}
2568
2569bool TDEHTMLPart::nextAnchor()
2570{
2571 if (!d->m_doc)
2572 return false;
2573 d->m_view->focusNextPrevNode ( true );
2574
2575 return true;
2576}
2577
2578bool TDEHTMLPart::prevAnchor()
2579{
2580 if (!d->m_doc)
2581 return false;
2582 d->m_view->focusNextPrevNode ( false );
2583
2584 return true;
2585}
2586
2587void TDEHTMLPart::setStandardFont( const TQString &name )
2588{
2589 d->m_settings->setStdFontName(name);
2590}
2591
2592void TDEHTMLPart::setFixedFont( const TQString &name )
2593{
2594 d->m_settings->setFixedFontName(name);
2595}
2596
2597void TDEHTMLPart::setURLCursor( const TQCursor &c )
2598{
2599 d->m_linkCursor = c;
2600}
2601
2602TQCursor TDEHTMLPart::urlCursor() const
2603{
2604 return d->m_linkCursor;
2605}
2606
2607bool TDEHTMLPart::onlyLocalReferences() const
2608{
2609 return d->m_onlyLocalReferences;
2610}
2611
2612void TDEHTMLPart::setOnlyLocalReferences(bool enable)
2613{
2614 d->m_onlyLocalReferences = enable;
2615}
2616
2617void TDEHTMLPartPrivate::setFlagRecursively(
2618 bool TDEHTMLPartPrivate::*flag, bool value)
2619{
2620 // first set it on the current one
2621 this->*flag = value;
2622
2623 // descend into child frames recursively
2624 {
2625 TQValueList<tdehtml::ChildFrame*>::Iterator it = m_frames.begin();
2626 const TQValueList<tdehtml::ChildFrame*>::Iterator itEnd = m_frames.end();
2627 for (; it != itEnd; ++it) {
2628 TDEHTMLPart* const part = static_cast<TDEHTMLPart *>((KParts::ReadOnlyPart *)(*it)->m_part);
2629 if (part->inherits("TDEHTMLPart"))
2630 part->d->setFlagRecursively(flag, value);
2631 }/*next it*/
2632 }
2633 // do the same again for objects
2634 {
2635 TQValueList<tdehtml::ChildFrame*>::Iterator it = m_objects.begin();
2636 const TQValueList<tdehtml::ChildFrame*>::Iterator itEnd = m_objects.end();
2637 for (; it != itEnd; ++it) {
2638 TDEHTMLPart* const part = static_cast<TDEHTMLPart *>((KParts::ReadOnlyPart *)(*it)->m_part);
2639 if (part->inherits("TDEHTMLPart"))
2640 part->d->setFlagRecursively(flag, value);
2641 }/*next it*/
2642 }
2643}
2644
2645void TDEHTMLPart::setCaretMode(bool enable)
2646{
2647#ifndef TDEHTML_NO_CARET
2648 kdDebug(6200) << "setCaretMode(" << enable << ")" << endl;
2649 if (isCaretMode() == enable) return;
2650 d->setFlagRecursively(&TDEHTMLPartPrivate::m_caretMode, enable);
2651 // FIXME: this won't work on frames as expected
2652 if (!isEditable()) {
2653 if (enable) {
2654 view()->initCaret(true);
2655 view()->ensureCaretVisible();
2656 } else
2657 view()->caretOff();
2658 }/*end if*/
2659#endif // TDEHTML_NO_CARET
2660}
2661
2662bool TDEHTMLPart::isCaretMode() const
2663{
2664 return d->m_caretMode;
2665}
2666
2667void TDEHTMLPart::setEditable(bool enable)
2668{
2669#ifndef TDEHTML_NO_CARET
2670 if (isEditable() == enable) return;
2671 d->setFlagRecursively(&TDEHTMLPartPrivate::m_designMode, enable);
2672 // FIXME: this won't work on frames as expected
2673 if (!isCaretMode()) {
2674 if (enable) {
2675 view()->initCaret(true);
2676 view()->ensureCaretVisible();
2677 } else
2678 view()->caretOff();
2679 }/*end if*/
2680#endif // TDEHTML_NO_CARET
2681}
2682
2683bool TDEHTMLPart::isEditable() const
2684{
2685 return d->m_designMode;
2686}
2687
2688void TDEHTMLPart::setCaretPosition(DOM::Node node, long offset, bool extendSelection)
2689{
2690#ifndef TDEHTML_NO_CARET
2691#if 0
2692 kdDebug(6200) << k_funcinfo << "node: " << node.handle() << " nodeName: "
2693 << node.nodeName().string() << " offset: " << offset
2694 << " extendSelection " << extendSelection << endl;
2695#endif
2696 if (view()->moveCaretTo(node.handle(), offset, !extendSelection))
2697 emitSelectionChanged();
2698 view()->ensureCaretVisible();
2699#endif // TDEHTML_NO_CARET
2700}
2701
2702TDEHTMLPart::CaretDisplayPolicy TDEHTMLPart::caretDisplayPolicyNonFocused() const
2703{
2704#ifndef TDEHTML_NO_CARET
2705 return (CaretDisplayPolicy)view()->caretDisplayPolicyNonFocused();
2706#else // TDEHTML_NO_CARET
2707 return CaretInvisible;
2708#endif // TDEHTML_NO_CARET
2709}
2710
2711void TDEHTMLPart::setCaretDisplayPolicyNonFocused(CaretDisplayPolicy policy)
2712{
2713#ifndef TDEHTML_NO_CARET
2714 view()->setCaretDisplayPolicyNonFocused(policy);
2715#endif // TDEHTML_NO_CARET
2716}
2717
2718void TDEHTMLPart::setCaretVisible(bool show)
2719{
2720#ifndef TDEHTML_NO_CARET
2721 if (show) {
2722
2723 NodeImpl *caretNode = xmlDocImpl()->focusNode();
2724 if (isCaretMode() || isEditable()
2725 || (caretNode && caretNode->contentEditable())) {
2726 view()->caretOn();
2727 }/*end if*/
2728
2729 } else {
2730
2731 view()->caretOff();
2732
2733 }/*end if*/
2734#endif // TDEHTML_NO_CARET
2735}
2736
2737void TDEHTMLPart::findTextBegin()
2738{
2739 d->m_findPos = -1;
2740 d->m_findNode = 0;
2741 d->m_findPosEnd = -1;
2742 d->m_findNodeEnd= 0;
2743 d->m_findPosStart = -1;
2744 d->m_findNodeStart = 0;
2745 d->m_findNodePrevious = 0;
2746 delete d->m_find;
2747 d->m_find = 0L;
2748}
2749
2750bool TDEHTMLPart::initFindNode( bool selection, bool reverse, bool fromCursor )
2751{
2752 if ( !d->m_doc )
2753 return false;
2754
2755 DOM::NodeImpl* firstNode = 0L;
2756 if (d->m_doc->isHTMLDocument())
2757 firstNode = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
2758 else
2759 firstNode = d->m_doc;
2760
2761 if ( !firstNode )
2762 {
2763 //kdDebug(6050) << k_funcinfo << "no first node (body or doc) -> return false" << endl;
2764 return false;
2765 }
2766 if ( firstNode->id() == ID_FRAMESET )
2767 {
2768 //kdDebug(6050) << k_funcinfo << "FRAMESET -> return false" << endl;
2769 return false;
2770 }
2771
2772 if ( selection && hasSelection() )
2773 {
2774 //kdDebug(6050) << k_funcinfo << "using selection" << endl;
2775 if ( !fromCursor )
2776 {
2777 d->m_findNode = reverse ? d->m_selectionEnd.handle() : d->m_selectionStart.handle();
2778 d->m_findPos = reverse ? d->m_endOffset : d->m_startOffset;
2779 }
2780 d->m_findNodeEnd = reverse ? d->m_selectionStart.handle() : d->m_selectionEnd.handle();
2781 d->m_findPosEnd = reverse ? d->m_startOffset : d->m_endOffset;
2782 d->m_findNodeStart = !reverse ? d->m_selectionStart.handle() : d->m_selectionEnd.handle();
2783 d->m_findPosStart = !reverse ? d->m_startOffset : d->m_endOffset;
2784 d->m_findNodePrevious = d->m_findNodeStart;
2785 }
2786 else // whole document
2787 {
2788 //kdDebug(6050) << k_funcinfo << "whole doc" << endl;
2789 if ( !fromCursor )
2790 {
2791 d->m_findNode = firstNode;
2792 d->m_findPos = reverse ? -1 : 0;
2793 }
2794 d->m_findNodeEnd = reverse ? firstNode : 0;
2795 d->m_findPosEnd = reverse ? 0 : -1;
2796 d->m_findNodeStart = !reverse ? firstNode : 0;
2797 d->m_findPosStart = !reverse ? 0 : -1;
2798 d->m_findNodePrevious = d->m_findNodeStart;
2799 if ( reverse )
2800 {
2801 // Need to find out the really last object, to start from it
2802 tdehtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
2803 if ( obj )
2804 {
2805 // find the last object in the render tree
2806 while ( obj->lastChild() )
2807 {
2808 obj = obj->lastChild();
2809 }
2810 // now get the last object with a NodeImpl associated
2811 while ( !obj->element() && obj->objectAbove() )
2812 {
2813 obj = obj->objectAbove();
2814 }
2815 d->m_findNode = obj->element();
2816 }
2817 }
2818 }
2819 return true;
2820}
2821
2822// Old method (its API limits the available features - remove in KDE-4)
2823bool TDEHTMLPart::findTextNext( const TQString &str, bool forward, bool caseSensitive, bool isRegExp )
2824{
2825 if ( !initFindNode( false, !forward, d->m_findNode ) )
2826 return false;
2827 while(1)
2828 {
2829 if( (d->m_findNode->nodeType() == Node::TEXT_NODE || d->m_findNode->nodeType() == Node::CDATA_SECTION_NODE) && d->m_findNode->renderer() )
2830 {
2831 DOMString nodeText = d->m_findNode->nodeValue();
2832 DOMStringImpl *t = nodeText.implementation();
2833 TQConstString s(t->s, t->l);
2834
2835 int matchLen = 0;
2836 if ( isRegExp ) {
2837 TQRegExp matcher( str );
2838 matcher.setCaseSensitive( caseSensitive );
2839 d->m_findPos = matcher.search(s.string(), d->m_findPos+1);
2840 if ( d->m_findPos != -1 )
2841 matchLen = matcher.matchedLength();
2842 }
2843 else {
2844 d->m_findPos = s.string().find(str, d->m_findPos+1, caseSensitive);
2845 matchLen = str.length();
2846 }
2847
2848 if(d->m_findPos != -1)
2849 {
2850 int x = 0, y = 0;
2851 if(static_cast<tdehtml::RenderText *>(d->m_findNode->renderer())
2852 ->posOfChar(d->m_findPos, x, y))
2853 d->m_view->setContentsPos(x-50, y-50);
2854
2855 d->m_selectionStart = d->m_findNode;
2856 d->m_startOffset = d->m_findPos;
2857 d->m_selectionEnd = d->m_findNode;
2858 d->m_endOffset = d->m_findPos + matchLen;
2859 d->m_startBeforeEnd = true;
2860
2861 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
2862 d->m_selectionEnd.handle(), d->m_endOffset );
2863 emitSelectionChanged();
2864 return true;
2865 }
2866 }
2867 d->m_findPos = -1;
2868
2869 NodeImpl *next;
2870
2871 if ( forward )
2872 {
2873 next = d->m_findNode->firstChild();
2874
2875 if(!next) next = d->m_findNode->nextSibling();
2876 while(d->m_findNode && !next) {
2877 d->m_findNode = d->m_findNode->parentNode();
2878 if( d->m_findNode ) {
2879 next = d->m_findNode->nextSibling();
2880 }
2881 }
2882 }
2883 else
2884 {
2885 next = d->m_findNode->lastChild();
2886
2887 if (!next ) next = d->m_findNode->previousSibling();
2888 while ( d->m_findNode && !next )
2889 {
2890 d->m_findNode = d->m_findNode->parentNode();
2891 if( d->m_findNode )
2892 {
2893 next = d->m_findNode->previousSibling();
2894 }
2895 }
2896 }
2897
2898 d->m_findNode = next;
2899 if(!d->m_findNode) return false;
2900 }
2901}
2902
2903
2904void TDEHTMLPart::slotFind()
2905{
2906 KParts::ReadOnlyPart *part = currentFrame();
2907 if (!part)
2908 return;
2909 if (!part->inherits("TDEHTMLPart") )
2910 {
2911 kdError(6000) << "slotFind: part is a " << part->className() << ", can't do a search into it" << endl;
2912 return;
2913 }
2914 static_cast<TDEHTMLPart *>( part )->findText();
2915}
2916
2917void TDEHTMLPart::slotFindNext()
2918{
2919 KParts::ReadOnlyPart *part = currentFrame();
2920 if (!part)
2921 return;
2922 if (!part->inherits("TDEHTMLPart") )
2923 {
2924 kdError(6000) << "slotFindNext: part is a " << part->className() << ", can't do a search into it" << endl;
2925 return;
2926 }
2927 static_cast<TDEHTMLPart *>( part )->findTextNext();
2928}
2929
2930void TDEHTMLPart::slotFindPrev()
2931{
2932 KParts::ReadOnlyPart *part = currentFrame();
2933 if (!part)
2934 return;
2935 if (!part->inherits("TDEHTMLPart") )
2936 {
2937 kdError(6000) << "slotFindNext: part is a " << part->className() << ", can't do a search into it" << endl;
2938 return;
2939 }
2940 static_cast<TDEHTMLPart *>( part )->findTextNext( true ); // reverse
2941}
2942
2943void TDEHTMLPart::slotFindDone()
2944{
2945 // ### remove me
2946}
2947
2948void TDEHTMLPart::slotFindAheadText()
2949{
2950#ifndef TDEHTML_NO_TYPE_AHEAD_FIND
2951 KParts::ReadOnlyPart *part = currentFrame();
2952 if (!part)
2953 return;
2954 if (!part->inherits("TDEHTMLPart") )
2955 {
2956 kdError(6000) << "slotFindNext: part is a " << part->className() << ", can't do a search into it" << endl;
2957 return;
2958 }
2959 static_cast<TDEHTMLPart *>( part )->view()->startFindAhead( false );
2960#endif // TDEHTML_NO_TYPE_AHEAD_FIND
2961}
2962
2963void TDEHTMLPart::slotFindAheadLink()
2964{
2965#ifndef TDEHTML_NO_TYPE_AHEAD_FIND
2966 KParts::ReadOnlyPart *part = currentFrame();
2967 if (!part)
2968 return;
2969 if (!part->inherits("TDEHTMLPart") )
2970 {
2971 kdError(6000) << "slotFindNext: part is a " << part->className() << ", can't do a search into it" << endl;
2972 return;
2973 }
2974 static_cast<TDEHTMLPart *>( part )->view()->startFindAhead( true );
2975#endif // TDEHTML_NO_TYPE_AHEAD_FIND
2976}
2977
2978void TDEHTMLPart::enableFindAheadActions( bool enable )
2979{
2980 // only the topmost one has shortcuts
2981 TDEHTMLPart* p = this;
2982 while( p->parentPart())
2983 p = p->parentPart();
2984 p->d->m_paFindAheadText->setEnabled( enable );
2985 p->d->m_paFindAheadLinks->setEnabled( enable );
2986}
2987
2988void TDEHTMLPart::slotFindDialogDestroyed()
2989{
2990 d->m_lastFindState.options = d->m_findDialog->options();
2991 d->m_lastFindState.history = d->m_findDialog->findHistory();
2992 d->m_findDialog->deleteLater();
2993 d->m_findDialog = 0L;
2994}
2995
2996void TDEHTMLPart::findText()
2997{
2998 // First do some init to make sure we can search in this frame
2999 if ( !d->m_doc )
3000 return;
3001
3002 // Raise if already opened
3003 if ( d->m_findDialog )
3004 {
3005 KWin::activateWindow( d->m_findDialog->winId() );
3006 return;
3007 }
3008
3009 // The lineedit of the dialog would make tdehtml lose its selection, otherwise
3010#ifndef TQT_NO_CLIPBOARD
3011 disconnect( tdeApp->clipboard(), TQ_SIGNAL(selectionChanged()), this, TQ_SLOT(slotClearSelection()) );
3012#endif
3013
3014 // Now show the dialog in which the user can choose options.
3015 d->m_findDialog = new KFindDialog( false /*non-modal*/, widget(), "tdehtmlfind" );
3016 d->m_findDialog->setHasSelection( hasSelection() );
3017 d->m_findDialog->setHasCursor( d->m_findNode != 0 );
3018 if ( d->m_findNode ) // has a cursor -> default to 'FromCursor'
3019 d->m_lastFindState.options |= KFindDialog::FromCursor;
3020
3021 // TODO? optionsDialog.setPattern( d->m_lastFindState.text );
3022 d->m_findDialog->setFindHistory( d->m_lastFindState.history );
3023 d->m_findDialog->setOptions( d->m_lastFindState.options );
3024
3025 d->m_lastFindState.options = -1; // force update in findTextNext
3026 d->m_lastFindState.last_dir = -1;
3027
3028 d->m_findDialog->show();
3029 connect( d->m_findDialog, TQ_SIGNAL(okClicked()), this, TQ_SLOT(slotFindNext()) );
3030 connect( d->m_findDialog, TQ_SIGNAL(finished()), this, TQ_SLOT(slotFindDialogDestroyed()) );
3031
3032 findText( d->m_findDialog->pattern(), 0 /*options*/, widget(), d->m_findDialog );
3033}
3034
3035void TDEHTMLPart::findText( const TQString &str, long options, TQWidget *parent, KFindDialog *findDialog )
3036{
3037 // First do some init to make sure we can search in this frame
3038 if ( !d->m_doc )
3039 return;
3040
3041#ifndef TQT_NO_CLIPBOARD
3042 connect( tdeApp->clipboard(), TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotClearSelection()) );
3043#endif
3044
3045 // Create the KFind object
3046 delete d->m_find;
3047 d->m_find = new KFind( str, options, parent, findDialog );
3048 d->m_find->closeFindNextDialog(); // we use KFindDialog non-modal, so we don't want other dlg popping up
3049 connect( d->m_find, TQ_SIGNAL( highlight( const TQString &, int, int ) ),
3050 this, TQ_SLOT( slotHighlight( const TQString &, int, int ) ) );
3051 //connect(d->m_find, TQ_SIGNAL( findNext() ),
3052 // this, TQ_SLOT( slotFindNext() ) );
3053
3054 if ( !findDialog )
3055 {
3056 d->m_lastFindState.options = options;
3057 initFindNode( options & KFindDialog::SelectedText,
3058 options & KFindDialog::FindBackwards,
3059 options & KFindDialog::FromCursor );
3060 }
3061}
3062
3063bool TDEHTMLPart::findTextNext()
3064{
3065 return findTextNext( false );
3066}
3067
3068// New method
3069bool TDEHTMLPart::findTextNext( bool reverse )
3070{
3071 if (!d->m_find)
3072 {
3073 // We didn't show the find dialog yet, let's do it then (#49442)
3074 findText();
3075 return false;
3076 }
3077
3078 view()->updateFindAheadTimeout();
3079 long options = 0;
3080 if ( d->m_findDialog ) // 0 when we close the dialog
3081 {
3082 if ( d->m_find->pattern() != d->m_findDialog->pattern() ) {
3083 d->m_find->setPattern( d->m_findDialog->pattern() );
3084 d->m_find->resetCounts();
3085 }
3086 options = d->m_findDialog->options();
3087 if ( d->m_lastFindState.options != options )
3088 {
3089 d->m_find->setOptions( options );
3090
3091 if ( options & KFindDialog::SelectedText )
3092 Q_ASSERT( hasSelection() );
3093
3094 long difference = d->m_lastFindState.options ^ options;
3095 if ( difference & (KFindDialog::SelectedText | KFindDialog::FromCursor ) )
3096 {
3097 // Important options changed -> reset search range
3098 (void) initFindNode( options & KFindDialog::SelectedText,
3099 options & KFindDialog::FindBackwards,
3100 options & KFindDialog::FromCursor );
3101 }
3102 d->m_lastFindState.options = options;
3103 }
3104 } else
3105 options = d->m_lastFindState.options;
3106 if( reverse )
3107 options = options ^ KFindDialog::FindBackwards;
3108 if( d->m_find->options() != options )
3109 d->m_find->setOptions( options );
3110
3111 // Changing find direction. Start and end nodes must be switched.
3112 // Additionally since d->m_findNode points after the last node
3113 // that was searched, it needs to be "after" it in the opposite direction.
3114 if( d->m_lastFindState.last_dir != -1
3115 && bool( d->m_lastFindState.last_dir ) != bool( options & KFindDialog::FindBackwards ))
3116 {
3117 tqSwap( d->m_findNodeEnd, d->m_findNodeStart );
3118 tqSwap( d->m_findPosEnd, d->m_findPosStart );
3119 tqSwap( d->m_findNode, d->m_findNodePrevious );
3120 // d->m_findNode now point at the end of the last searched line - advance one node
3121 tdehtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
3122 tdehtml::RenderObject* end = d->m_findNodeEnd ? d->m_findNodeEnd->renderer() : 0;
3123 if ( obj == end )
3124 obj = 0L;
3125 else if ( obj )
3126 {
3127 do {
3128 obj = (options & KFindDialog::FindBackwards) ? obj->objectAbove() : obj->objectBelow();
3129 } while ( obj && ( !obj->element() || obj->isInlineContinuation() ) );
3130 }
3131 if ( obj )
3132 d->m_findNode = obj->element();
3133 else
3134 d->m_findNode = 0;
3135 }
3136 d->m_lastFindState.last_dir = ( options & KFindDialog::FindBackwards ) ? 1 : 0;
3137
3138 KFind::Result res = KFind::NoMatch;
3139 tdehtml::RenderObject* obj = d->m_findNode ? d->m_findNode->renderer() : 0;
3140 tdehtml::RenderObject* end = d->m_findNodeEnd ? d->m_findNodeEnd->renderer() : 0;
3141 tdehtml::RenderTextArea *tmpTextArea=0L;
3142 //kdDebug(6050) << k_funcinfo << "obj=" << obj << " end=" << end << endl;
3143 while( res == KFind::NoMatch )
3144 {
3145 if ( d->m_find->needData() )
3146 {
3147 if ( !obj ) {
3148 //kdDebug(6050) << k_funcinfo << "obj=0 -> done" << endl;
3149 break; // we're done
3150 }
3151 //kdDebug(6050) << k_funcinfo << " gathering data" << endl;
3152 // First make up the TQString for the current 'line' (i.e. up to \n)
3153 // We also want to remember the DOMNode for every portion of the string.
3154 // We store this in an index->node list.
3155
3156 d->m_stringPortions.clear();
3157 bool newLine = false;
3158 TQString str;
3159 DOM::NodeImpl* lastNode = d->m_findNode;
3160 while ( obj && !newLine )
3161 {
3162 // Grab text from render object
3163 TQString s;
3164 bool renderAreaText = obj->parent() && (TQCString(obj->parent()->renderName())== "RenderTextArea");
3165 bool renderLineText = (TQCString(obj->renderName())== "RenderLineEdit");
3166 if ( renderAreaText )
3167 {
3168 tdehtml::RenderTextArea *parent= static_cast<tdehtml::RenderTextArea *>(obj->parent());
3169 s = parent->text();
3170 s = s.replace(0xa0, ' ');
3171 tmpTextArea = parent;
3172 }
3173 else if ( renderLineText )
3174 {
3175 tdehtml::RenderLineEdit *parentLine= static_cast<tdehtml::RenderLineEdit *>(obj);
3176 if (parentLine->widget()->echoMode() == TQLineEdit::Normal)
3177 s = parentLine->widget()->text();
3178 s = s.replace(0xa0, ' ');
3179 }
3180 else if ( obj->isText() )
3181 {
3182 bool isLink = false;
3183
3184 // checks whether the node has a <A> parent
3185 if ( options & FindLinksOnly )
3186 {
3187 DOM::NodeImpl *parent = obj->element();
3188 while ( parent )
3189 {
3190 if ( parent->nodeType() == Node::ELEMENT_NODE && parent->id() == ID_A )
3191 {
3192 isLink = true;
3193 break;
3194 }
3195 parent = parent->parentNode();
3196 }
3197 }
3198 else
3199 {
3200 isLink = true;
3201 }
3202
3203 if ( isLink && obj->parent()!=tmpTextArea )
3204 {
3205 s = static_cast<tdehtml::RenderText *>(obj)->data().string();
3206 s = s.replace(0xa0, ' ');
3207 }
3208 }
3209 else if ( obj->isBR() )
3210 s = '\n';
3211 else if ( !obj->isInline() && !str.isEmpty() )
3212 s = '\n';
3213
3214 if ( lastNode == d->m_findNodeEnd )
3215 s.truncate( d->m_findPosEnd );
3216 if ( !s.isEmpty() )
3217 {
3218 newLine = s.find( '\n' ) != -1; // did we just get a newline?
3219 if( !( options & KFindDialog::FindBackwards ))
3220 {
3221 //kdDebug(6050) << "StringPortion: " << index << "-" << index+s.length()-1 << " -> " << lastNode << endl;
3222 d->m_stringPortions.append( TDEHTMLPartPrivate::StringPortion( str.length(), lastNode ) );
3223 str += s;
3224 }
3225 else // KFind itself can search backwards, so str must not be built backwards
3226 {
3227 for( TQValueList<TDEHTMLPartPrivate::StringPortion>::Iterator it = d->m_stringPortions.begin();
3228 it != d->m_stringPortions.end();
3229 ++it )
3230 (*it).index += s.length();
3231 d->m_stringPortions.prepend( TDEHTMLPartPrivate::StringPortion( 0, lastNode ) );
3232 str.prepend( s );
3233 }
3234 }
3235 // Compare obj and end _after_ we processed the 'end' node itself
3236 if ( obj == end )
3237 obj = 0L;
3238 else
3239 {
3240 // Move on to next object (note: if we found a \n already, then obj (and lastNode)
3241 // will point to the _next_ object, i.e. they are in advance.
3242 do {
3243 // We advance until the next RenderObject that has a NodeImpl as its element().
3244 // Otherwise (if we keep the 'last node', and it has a '\n') we might be stuck
3245 // on that object forever...
3246 obj = (options & KFindDialog::FindBackwards) ? obj->objectAbove() : obj->objectBelow();
3247 } while ( obj && ( !obj->element() || obj->isInlineContinuation() ) );
3248 }
3249 if ( obj )
3250 lastNode = obj->element();
3251 else
3252 lastNode = 0;
3253 } // end while
3254 //kdDebug()<<" str : "<<str<<endl;
3255 if ( !str.isEmpty() )
3256 {
3257 d->m_find->setData( str, d->m_findPos );
3258 }
3259
3260 d->m_findPos = -1; // not used during the findnext loops. Only during init.
3261 d->m_findNodePrevious = d->m_findNode;
3262 d->m_findNode = lastNode;
3263 }
3264 if ( !d->m_find->needData() ) // happens if str was empty
3265 {
3266 // Let KFind inspect the text fragment, and emit highlighted if a match is found
3267 res = d->m_find->find();
3268 }
3269 } // end while
3270
3271 if ( res == KFind::NoMatch ) // i.e. we're done
3272 {
3273 kdDebug() << "No more matches." << endl;
3274 if ( !(options & FindNoPopups) && d->m_find->shouldRestart() )
3275 {
3276 //kdDebug(6050) << "Restarting" << endl;
3277 initFindNode( false, options & KFindDialog::FindBackwards, false );
3278 d->m_find->resetCounts();
3279 findTextNext( reverse );
3280 }
3281 else // really done
3282 {
3283 //kdDebug(6050) << "Finishing" << endl;
3284 //delete d->m_find;
3285 //d->m_find = 0L;
3286 initFindNode( false, options & KFindDialog::FindBackwards, false );
3287 d->m_find->resetCounts();
3288 slotClearSelection();
3289 }
3290 kdDebug() << "Dialog closed." << endl;
3291 }
3292
3293 return res == KFind::Match;
3294}
3295
3296void TDEHTMLPart::slotHighlight( const TQString& /*text*/, int index, int length )
3297{
3298 //kdDebug(6050) << "slotHighlight index=" << index << " length=" << length << endl;
3299 TQValueList<TDEHTMLPartPrivate::StringPortion>::Iterator it = d->m_stringPortions.begin();
3300 const TQValueList<TDEHTMLPartPrivate::StringPortion>::Iterator itEnd = d->m_stringPortions.end();
3301 TQValueList<TDEHTMLPartPrivate::StringPortion>::Iterator prev = it;
3302 // We stop at the first portion whose index is 'greater than', and then use the previous one
3303 while ( it != itEnd && (*it).index <= index )
3304 {
3305 prev = it;
3306 ++it;
3307 }
3308 Q_ASSERT ( prev != itEnd );
3309 DOM::NodeImpl* node = (*prev).node;
3310 Q_ASSERT( node );
3311
3312 d->m_selectionStart = node;
3313 d->m_startOffset = index - (*prev).index;
3314
3315 tdehtml::RenderObject* obj = node->renderer();
3316 tdehtml::RenderTextArea *parent = 0L;
3317 tdehtml::RenderLineEdit *parentLine = 0L;
3318 bool renderLineText =false;
3319
3320 TQRect highlightedRect;
3321 bool renderAreaText =false;
3322 Q_ASSERT( obj );
3323 if ( obj )
3324 {
3325 int x = 0, y = 0;
3326 renderAreaText = (TQCString(obj->parent()->renderName())== "RenderTextArea");
3327 renderLineText = (TQCString(obj->renderName())== "RenderLineEdit");
3328
3329
3330 if( renderAreaText )
3331 parent= static_cast<tdehtml::RenderTextArea *>(obj->parent());
3332 if ( renderLineText )
3333 parentLine= static_cast<tdehtml::RenderLineEdit *>(obj);
3334 if ( !renderLineText )
3335 //if (static_cast<tdehtml::RenderText *>(node->renderer())
3336 // ->posOfChar(d->m_startOffset, x, y))
3337 {
3338 int dummy;
3339 static_cast<tdehtml::RenderText *>(node->renderer())
3340 ->caretPos( d->m_startOffset, false, x, y, dummy, dummy ); // more precise than posOfChar
3341 //kdDebug(6050) << "topleft: " << x << "," << y << endl;
3342 if ( x != -1 || y != -1 )
3343 {
3344 int gox = d->m_view->contentsX();
3345 if (x+50 > d->m_view->contentsX() + d->m_view->visibleWidth())
3346 gox = x - d->m_view->visibleWidth() + 50;
3347 if (x-10 < d->m_view->contentsX())
3348 gox = x - d->m_view->visibleWidth() - 10;
3349 if (gox < 0) gox = 0;
3350 d->m_view->setContentsPos(gox, y-50);
3351 highlightedRect.setTopLeft( d->m_view->mapToGlobal(TQPoint(x, y)) );
3352 }
3353 }
3354 }
3355 // Now look for end node
3356 it = prev; // no need to start from beginning again
3357 while ( it != itEnd && (*it).index < index + length )
3358 {
3359 prev = it;
3360 ++it;
3361 }
3362 Q_ASSERT ( prev != itEnd );
3363
3364 d->m_selectionEnd = (*prev).node;
3365 d->m_endOffset = index + length - (*prev).index;
3366 d->m_startBeforeEnd = true;
3367
3368 // if the selection is limited to a single link, that link gets focus
3369 if(d->m_selectionStart == d->m_selectionEnd)
3370 {
3371 bool isLink = false;
3372
3373 // checks whether the node has a <A> parent
3374 DOM::NodeImpl *parent = d->m_selectionStart.handle();
3375 while ( parent )
3376 {
3377 if ( parent->nodeType() == Node::ELEMENT_NODE && parent->id() == ID_A )
3378 {
3379 isLink = true;
3380 break;
3381 }
3382 parent = parent->parentNode();
3383 }
3384
3385 if(isLink == true)
3386 {
3387 d->m_doc->setFocusNode( parent );
3388 }
3389 }
3390
3391#if 0
3392 kdDebug(6050) << "slotHighlight: " << d->m_selectionStart.handle() << "," << d->m_startOffset << " - " <<
3393 d->m_selectionEnd.handle() << "," << d->m_endOffset << endl;
3394 it = d->m_stringPortions.begin();
3395 for ( ; it != d->m_stringPortions.end() ; ++it )
3396 kdDebug(6050) << " StringPortion: from index=" << (*it).index << " -> node=" << (*it).node << endl;
3397#endif
3398 if( renderAreaText )
3399 {
3400 if( parent )
3401 parent->highLightWord( length, d->m_endOffset-length );
3402 }
3403 else if ( renderLineText )
3404 {
3405 if( parentLine )
3406 parentLine->highLightWord( length, d->m_endOffset-length );
3407 }
3408 else
3409 {
3410 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
3411 d->m_selectionEnd.handle(), d->m_endOffset );
3412 if (d->m_selectionEnd.handle()->renderer() )
3413 {
3414 int x, y, height, dummy;
3415 static_cast<tdehtml::RenderText *>(d->m_selectionEnd.handle()->renderer())
3416 ->caretPos( d->m_endOffset, false, x, y, dummy, height ); // more precise than posOfChar
3417 //kdDebug(6050) << "bottomright: " << x << "," << y+height << endl;
3418 if ( x != -1 || y != -1 )
3419 {
3420 // if ( static_cast<tdehtml::RenderText *>(d->m_selectionEnd.handle()->renderer())
3421 // ->posOfChar(d->m_endOffset-1, x, y))
3422 highlightedRect.setBottomRight( d->m_view->mapToGlobal( TQPoint(x, y+height) ) );
3423 }
3424 }
3425 }
3426 emitSelectionChanged();
3427
3428 // make the finddialog move away from the selected area
3429 if ( d->m_findDialog && !highlightedRect.isNull() )
3430 {
3431 highlightedRect.moveBy( -d->m_view->contentsX(), -d->m_view->contentsY() );
3432 //kdDebug(6050) << "avoiding " << highlightedRect << endl;
3433 KDialog::avoidArea( d->m_findDialog, highlightedRect );
3434 }
3435}
3436
3437TQString TDEHTMLPart::selectedTextAsHTML() const
3438{
3439 if(!hasSelection()) {
3440 kdDebug() << "selectedTextAsHTML(): selection is not valid. Returning empty selection" << endl;
3441 return TQString();
3442 }
3443 if(d->m_startOffset < 0 || d->m_endOffset <0) {
3444 kdDebug() << "invalid values for end/startOffset " << d->m_startOffset << " " << d->m_endOffset << endl;
3445 return TQString();
3446 }
3447 DOM::Range r = selection();
3448 if(r.isNull() || r.isDetached())
3449 return TQString();
3450 int exceptioncode = 0; //ignore the result
3451 return r.handle()->toHTML(exceptioncode).string();
3452}
3453
3454TQString TDEHTMLPart::selectedText() const
3455{
3456 bool hasNewLine = true;
3457 bool seenTDTag = false;
3458 TQString text;
3459 DOM::Node n = d->m_selectionStart;
3460 while(!n.isNull()) {
3461 if(n.nodeType() == DOM::Node::TEXT_NODE && n.handle()->renderer()) {
3462 DOM::DOMStringImpl *dstr = static_cast<DOM::TextImpl*>(n.handle())->renderString();
3463 TQString str(dstr->s, dstr->l);
3464 if(!str.isEmpty()) {
3465 if(seenTDTag) {
3466 text += " ";
3467 seenTDTag = false;
3468 }
3469 hasNewLine = false;
3470 if(n == d->m_selectionStart && n == d->m_selectionEnd)
3471 text = str.mid(d->m_startOffset, d->m_endOffset - d->m_startOffset);
3472 else if(n == d->m_selectionStart)
3473 text = str.mid(d->m_startOffset);
3474 else if(n == d->m_selectionEnd)
3475 text += str.left(d->m_endOffset);
3476 else
3477 text += str;
3478 }
3479 }
3480 else {
3481 // This is our simple HTML -> ASCII transformation:
3482 unsigned short id = n.elementId();
3483 switch(id) {
3484 case ID_TEXTAREA:
3485 text += static_cast<HTMLTextAreaElementImpl*>(n.handle())->value().string();
3486 break;
3487 case ID_INPUT:
3488 if (static_cast<HTMLInputElementImpl*>(n.handle())->inputType() != HTMLInputElementImpl::PASSWORD)
3489 text += static_cast<HTMLInputElementImpl*>(n.handle())->value().string();
3490 break;
3491 case ID_SELECT:
3492 text += static_cast<HTMLSelectElementImpl*>(n.handle())->value().string();
3493 break;
3494 case ID_BR:
3495 text += "\n";
3496 hasNewLine = true;
3497 break;
3498 case ID_IMG:
3499 text += static_cast<HTMLImageElementImpl*>(n.handle())->altText().string();
3500 break;
3501 case ID_TD:
3502 break;
3503 case ID_TH:
3504 case ID_HR:
3505 case ID_OL:
3506 case ID_UL:
3507 case ID_LI:
3508 case ID_DD:
3509 case ID_DL:
3510 case ID_DT:
3511 case ID_PRE:
3512 case ID_BLOCKQUOTE:
3513 case ID_DIV:
3514 if (!hasNewLine)
3515 text += "\n";
3516 hasNewLine = true;
3517 break;
3518 case ID_P:
3519 case ID_TR:
3520 case ID_H1:
3521 case ID_H2:
3522 case ID_H3:
3523 case ID_H4:
3524 case ID_H5:
3525 case ID_H6:
3526 if (!hasNewLine)
3527 text += "\n";
3528// text += "\n";
3529 hasNewLine = true;
3530 break;
3531 }
3532 }
3533 if(n == d->m_selectionEnd) break;
3534 DOM::Node next = n.firstChild();
3535 if(next.isNull()) next = n.nextSibling();
3536 while( next.isNull() && !n.parentNode().isNull() ) {
3537 n = n.parentNode();
3538 next = n.nextSibling();
3539 unsigned short id = n.elementId();
3540 switch(id) {
3541 case ID_TD:
3542 seenTDTag = true; //Add two spaces after a td if then followed by text.
3543 break;
3544 case ID_TH:
3545 case ID_HR:
3546 case ID_OL:
3547 case ID_UL:
3548 case ID_LI:
3549 case ID_DD:
3550 case ID_DL:
3551 case ID_DT:
3552 case ID_PRE:
3553 case ID_BLOCKQUOTE:
3554 case ID_DIV:
3555 seenTDTag = false;
3556 if (!hasNewLine)
3557 text += "\n";
3558 hasNewLine = true;
3559 break;
3560 case ID_P:
3561 case ID_TR:
3562 case ID_H1:
3563 case ID_H2:
3564 case ID_H3:
3565 case ID_H4:
3566 case ID_H5:
3567 case ID_H6:
3568 if (!hasNewLine)
3569 text += "\n";
3570// text += "\n";
3571 hasNewLine = true;
3572 break;
3573 }
3574 }
3575
3576 n = next;
3577 }
3578
3579 if(text.isEmpty())
3580 return TQString();
3581
3582 int start = 0;
3583 int end = text.length();
3584
3585 // Strip leading LFs
3586 while ((start < end) && (text[start] == '\n'))
3587 ++start;
3588
3589 // Strip excessive trailing LFs
3590 while ((start < (end-1)) && (text[end-1] == '\n') && (text[end-2] == '\n'))
3591 --end;
3592
3593 return text.mid(start, end-start);
3594}
3595
3596bool TDEHTMLPart::hasSelection() const
3597{
3598 if ( d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() )
3599 return false;
3600 if ( d->m_selectionStart == d->m_selectionEnd &&
3601 d->m_startOffset == d->m_endOffset )
3602 return false; // empty
3603 return true;
3604}
3605
3606DOM::Range TDEHTMLPart::selection() const
3607{
3608 if( d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() )
3609 return DOM::Range();
3610 DOM::Range r = document().createRange();
3611 RangeImpl *rng = r.handle();
3612 int exception = 0;
3613 NodeImpl *n = d->m_selectionStart.handle();
3614 if(!n->parentNode() ||
3615 !n->renderer() ||
3616 (!n->renderer()->isReplaced() && !n->renderer()->isBR())) {
3617 rng->setStart( n, d->m_startOffset, exception );
3618 if(exception) {
3619 kdDebug(6000) << "1 -selection() threw the exception " << exception << ". Returning empty range." << endl;
3620 return DOM::Range();
3621 }
3622 } else {
3623 int o_start = 0;
3624 while ((n = n->previousSibling()))
3625 o_start++;
3626 rng->setStart( d->m_selectionStart.parentNode().handle(), o_start + d->m_startOffset, exception );
3627 if(exception) {
3628 kdDebug(6000) << "2 - selection() threw the exception " << exception << ". Returning empty range." << endl;
3629 return DOM::Range();
3630 }
3631
3632 }
3633
3634 n = d->m_selectionEnd.handle();
3635 if(!n->parentNode() ||
3636 !n->renderer() ||
3637 (!n->renderer()->isReplaced() && !n->renderer()->isBR())) {
3638
3639 rng->setEnd( n, d->m_endOffset, exception );
3640 if(exception) {
3641 kdDebug(6000) << "3 - selection() threw the exception " << exception << ". Returning empty range." << endl;
3642 return DOM::Range();
3643 }
3644
3645 } else {
3646 int o_end = 0;
3647 while ((n = n->previousSibling()))
3648 o_end++;
3649 rng->setEnd( d->m_selectionEnd.parentNode().handle(), o_end + d->m_endOffset, exception);
3650 if(exception) {
3651 kdDebug(6000) << "4 - selection() threw the exception " << exception << ". Returning empty range." << endl;
3652 return DOM::Range();
3653 }
3654
3655 }
3656
3657 return r;
3658}
3659
3660void TDEHTMLPart::selection(DOM::Node &s, long &so, DOM::Node &e, long &eo) const
3661{
3662 s = d->m_selectionStart;
3663 so = d->m_startOffset;
3664 e = d->m_selectionEnd;
3665 eo = d->m_endOffset;
3666}
3667
3668void TDEHTMLPart::setSelection( const DOM::Range &r )
3669{
3670 // Quick-fix: a collapsed range shouldn't select the whole node.
3671 // The real problem is in RenderCanvas::setSelection though (when index==0 the whole node is selected).
3672 if ( r.collapsed() )
3673 slotClearSelection();
3674 else {
3675 d->m_selectionStart = r.startContainer();
3676 d->m_startOffset = r.startOffset();
3677 d->m_selectionEnd = r.endContainer();
3678 d->m_endOffset = r.endOffset();
3679 d->m_doc->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
3680 d->m_selectionEnd.handle(),d->m_endOffset);
3681#ifndef TDEHTML_NO_CARET
3682 bool v = d->m_view->placeCaret();
3683 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
3684#endif
3685 }
3686}
3687
3688void TDEHTMLPart::slotClearSelection()
3689{
3690 bool hadSelection = hasSelection();
3691#ifndef TDEHTML_NO_CARET
3692 //kdDebug(6000) << "d->m_selectionStart " << d->m_selectionStart.handle()
3693 // << " d->m_selectionEnd " << d->m_selectionEnd.handle() << endl;
3694 // nothing, leave selection parameters as is
3695#else
3696 d->m_selectionStart = 0;
3697 d->m_startOffset = 0;
3698 d->m_selectionEnd = 0;
3699 d->m_endOffset = 0;
3700#endif
3701 if ( d->m_doc ) d->m_doc->clearSelection();
3702 if ( hadSelection )
3703 emitSelectionChanged();
3704#ifndef TDEHTML_NO_CARET
3705 bool v = d->m_view->placeCaret();
3706 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
3707#endif
3708}
3709
3710void TDEHTMLPart::resetHoverText()
3711{
3712 if( !d->m_overURL.isEmpty() ) // Only if we were showing a link
3713 {
3714 d->m_overURL = d->m_overURLTarget = TQString();
3715 emit onURL( TQString() );
3716 // revert to default statusbar text
3717 setStatusBarText(TQString(), BarHoverText);
3718 emit d->m_extension->mouseOverInfo(0);
3719 }
3720}
3721
3722void TDEHTMLPart::overURL( const TQString &url, const TQString &target, bool /*shiftPressed*/ )
3723{
3724 KURL u = completeURL(url);
3725
3726 // special case for <a href="">
3727 if ( url.isEmpty() )
3728 u.setFileName( url );
3729
3730 emit onURL( url );
3731
3732 if ( url.isEmpty() ) {
3733 setStatusBarText(u.htmlURL(), BarHoverText);
3734 return;
3735 }
3736
3737 if (url.find( TQString::fromLatin1( "javascript:" ),0, false ) == 0 ) {
3738 TQString jscode = KURL::decode_string( url.mid( url.find( "javascript:", 0, false ) ) );
3739 jscode = KStringHandler::rsqueeze( jscode, 80 ); // truncate if too long
3740 if (url.startsWith("javascript:window.open"))
3741 jscode += i18n(" (In new window)");
3742 setStatusBarText( TQStyleSheet::escape( jscode ), BarHoverText );
3743 return;
3744 }
3745
3746 KFileItem item(u, TQString(), KFileItem::Unknown);
3747 emit d->m_extension->mouseOverInfo(&item);
3748
3749 TQString com;
3750
3751 KMimeType::Ptr typ = KMimeType::findByURL( u );
3752
3753 if ( typ )
3754 com = typ->comment( u, false );
3755
3756 if ( !u.isValid() ) {
3757 setStatusBarText(u.htmlURL(), BarHoverText);
3758 return;
3759 }
3760
3761 if ( u.isLocalFile() )
3762 {
3763 // TODO : use TDEIO::stat() and create a KFileItem out of its result,
3764 // to use KFileItem::statusBarText()
3765 TQCString path = TQFile::encodeName( u.path() );
3766
3767 struct stat buff;
3768 bool ok = !stat( path.data(), &buff );
3769
3770 struct stat lbuff;
3771 if (ok) ok = !lstat( path.data(), &lbuff );
3772
3773 TQString text = u.htmlURL();
3774 TQString text2 = text;
3775
3776 if (ok && S_ISLNK( lbuff.st_mode ) )
3777 {
3778 TQString tmp;
3779 if ( com.isNull() )
3780 tmp = i18n( "Symbolic Link");
3781 else
3782 tmp = i18n("%1 (Link)").arg(com);
3783 char buff_two[1024];
3784 text += " -> ";
3785 int n = readlink ( path.data(), buff_two, 1022);
3786 if (n == -1)
3787 {
3788 text2 += " ";
3789 text2 += tmp;
3790 setStatusBarText(text2, BarHoverText);
3791 return;
3792 }
3793 buff_two[n] = 0;
3794
3795 text += buff_two;
3796 text += " ";
3797 text += tmp;
3798 }
3799 else if ( ok && S_ISREG( buff.st_mode ) )
3800 {
3801 if (buff.st_size < 1024)
3802 text = i18n("%2 (%1 bytes)").arg((long) buff.st_size).arg(text2); // always put the URL last, in case it contains '%'
3803 else
3804 {
3805 float d = (float) buff.st_size/1024.0;
3806 text = i18n("%2 (%1 K)").arg(TDEGlobal::locale()->formatNumber(d, 2)).arg(text2); // was %.2f
3807 }
3808 text += " ";
3809 text += com;
3810 }
3811 else if ( ok && S_ISDIR( buff.st_mode ) )
3812 {
3813 text += " ";
3814 text += com;
3815 }
3816 else
3817 {
3818 text += " ";
3819 text += com;
3820 }
3821 setStatusBarText(text, BarHoverText);
3822 }
3823 else
3824 {
3825 TQString extra;
3826 if (target.lower() == "_blank")
3827 {
3828 extra = i18n(" (In new window)");
3829 }
3830 else if (!target.isEmpty() &&
3831 (target.lower() != "_top") &&
3832 (target.lower() != "_self") &&
3833 (target.lower() != "_parent"))
3834 {
3835 TDEHTMLPart *p = this;
3836 while (p->parentPart())
3837 p = p->parentPart();
3838 if (!p->frameExists(target))
3839 extra = i18n(" (In new window)");
3840 else
3841 extra = i18n(" (In other frame)");
3842 }
3843
3844 if (u.protocol() == TQString::fromLatin1("mailto")) {
3845 TQString mailtoMsg /* = TQString::fromLatin1("<img src=%1>").arg(locate("icon", TQString::fromLatin1("locolor/16x16/actions/mail_send.png")))*/;
3846 mailtoMsg += i18n("Email to: ") + KURL::decode_string(u.path());
3847 TQStringList queries = TQStringList::split('&', u.query().mid(1));
3848 TQStringList::Iterator it = queries.begin();
3849 const TQStringList::Iterator itEnd = queries.end();
3850 for (; it != itEnd; ++it)
3851 if ((*it).startsWith(TQString::fromLatin1("subject=")))
3852 mailtoMsg += i18n(" - Subject: ") + KURL::decode_string((*it).mid(8));
3853 else if ((*it).startsWith(TQString::fromLatin1("cc=")))
3854 mailtoMsg += i18n(" - CC: ") + KURL::decode_string((*it).mid(3));
3855 else if ((*it).startsWith(TQString::fromLatin1("bcc=")))
3856 mailtoMsg += i18n(" - BCC: ") + KURL::decode_string((*it).mid(4));
3857 mailtoMsg = TQStyleSheet::escape(mailtoMsg);
3858 mailtoMsg.replace(TQRegExp("([\n\r\t]|[ ]{10})"), TQString());
3859 setStatusBarText("<qt>"+mailtoMsg, BarHoverText);
3860 return;
3861 }
3862 // Is this check necessary at all? (Frerich)
3863#if 0
3864 else if (u.protocol() == TQString::fromLatin1("http")) {
3865 DOM::Node hrefNode = nodeUnderMouse().parentNode();
3866 while (hrefNode.nodeName().string() != TQString::fromLatin1("A") && !hrefNode.isNull())
3867 hrefNode = hrefNode.parentNode();
3868
3869 if (!hrefNode.isNull()) {
3870 DOM::Node hreflangNode = hrefNode.attributes().getNamedItem("HREFLANG");
3871 if (!hreflangNode.isNull()) {
3872 TQString countryCode = hreflangNode.nodeValue().string().lower();
3873 // Map the language code to an appropriate country code.
3874 if (countryCode == TQString::fromLatin1("en"))
3875 countryCode = TQString::fromLatin1("gb");
3876 TQString flagImg = TQString::fromLatin1("<img src=%1>").arg(
3877 locate("locale", TQString::fromLatin1("l10n/")
3878 + countryCode
3879 + TQString::fromLatin1("/flag.png")));
3880 emit setStatusBarText(flagImg + u.prettyURL() + extra);
3881 }
3882 }
3883 }
3884#endif
3885 setStatusBarText(u.htmlURL() + extra, BarHoverText);
3886 }
3887}
3888
3889//
3890// This executes in the active part on a click or other url selection action in
3891// that active part.
3892//
3893void TDEHTMLPart::urlSelected( const TQString &url, int button, int state, const TQString &_target, KParts::URLArgs args )
3894{
3895 // The member var is so that slotRedirection still calls the virtual urlSelected
3896 // but is able to know if is opened a url. KDE4: just make urlSelected return a bool
3897 // and move the urlSelectedIntern code back here.
3898 d->m_urlSelectedOpenedURL = urlSelectedIntern( url, button, state, _target, args );
3899}
3900
3901// Return value: true if an url was opened, false if not (e.g. error, or jumping to anchor)
3902bool TDEHTMLPart::urlSelectedIntern( const TQString &url, int button, int state, const TQString &_target, KParts::URLArgs args )
3903{
3904 bool hasTarget = false;
3905
3906 TQString target = _target;
3907 if ( target.isEmpty() && d->m_doc )
3908 target = d->m_doc->baseTarget();
3909 if ( !target.isEmpty() )
3910 hasTarget = true;
3911
3912 if ( url.find( TQString::fromLatin1( "javascript:" ), 0, false ) == 0 )
3913 {
3914 crossFrameExecuteScript( target, KURL::decode_string( url.mid( 11 ) ) );
3915 return false;
3916 }
3917
3918 KURL cURL = completeURL(url);
3919 // special case for <a href=""> (IE removes filename, mozilla doesn't)
3920 if ( url.isEmpty() )
3921 cURL.setFileName( url ); // removes filename
3922
3923 if ( !cURL.isValid() )
3924 // ### ERROR HANDLING
3925 return false;
3926
3927 kdDebug(6050) << this << " urlSelected: complete URL:" << cURL.url() << " target=" << target << endl;
3928
3929 if ( state & ControlButton )
3930 {
3931 args.setNewTab(true);
3932 emit d->m_extension->createNewWindow( cURL, args );
3933 return true;
3934 }
3935
3936 if ( button == TQt::LeftButton && ( state & ShiftButton ) )
3937 {
3938 TDEIO::MetaData metaData;
3939 metaData["referrer"] = d->m_referrer;
3940 TDEHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), cURL, metaData );
3941 return false;
3942 }
3943
3944 if (!checkLinkSecurity(cURL,
3945 i18n( "<qt>This untrusted page links to<BR><B>%1</B>.<BR>Do you want to follow the link?" ),
3946 i18n( "Follow" )))
3947 return false;
3948
3949 args.frameName = target;
3950
3951 args.metaData().insert("main_frame_request",
3952 parentPart() == 0 ? "TRUE":"FALSE");
3953 args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
3954 args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
3955 args.metaData().insert("PropagateHttpHeader", "true");
3956 args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
3957 args.metaData().insert("ssl_activate_warnings", "TRUE");
3958
3959 if ( hasTarget && target != "_self" && target != "_top" && target != "_blank" && target != "_parent" )
3960 {
3961 // unknown frame names should open in a new window.
3962 tdehtml::ChildFrame *frame = recursiveFrameRequest( this, cURL, args, false );
3963 if ( frame )
3964 {
3965 args.metaData()["referrer"] = d->m_referrer;
3966 requestObject( frame, cURL, args );
3967 return true;
3968 }
3969 }
3970
3971 if (!d->m_referrer.isEmpty() && !args.metaData().contains("referrer"))
3972 args.metaData()["referrer"] = d->m_referrer;
3973
3974
3975 if ( button == TQt::NoButton && (state & ShiftButton) && (state & ControlButton) )
3976 {
3977 emit d->m_extension->createNewWindow( cURL, args );
3978 return true;
3979 }
3980
3981 if ( state & ShiftButton)
3982 {
3983 KParts::WindowArgs winArgs;
3984 winArgs.lowerWindow = true;
3985 KParts::ReadOnlyPart *newPart = 0;
3986 emit d->m_extension->createNewWindow( cURL, args, winArgs, newPart );
3987 return true;
3988 }
3989
3990 //If we're asked to open up an anchor in the current URL, in current window,
3991 //merely gotoanchor, and do not reload the new page. Note that this does
3992 //not apply if the URL is the same page, but without a ref
3993 if (cURL.hasRef() && (!hasTarget || target == "_self"))
3994 {
3995 KURL curUrl = this->url();
3996 if (urlcmp(cURL.url(), curUrl.url(),
3997 false, // ignore trailing / diff, IE does, even if FFox doesn't
3998 true)) // don't care if the ref changes!
3999 {
4000 m_url = cURL;
4001 emit d->m_extension->openURLNotify();
4002 if ( !gotoAnchor( m_url.encodedHtmlRef()) )
4003 gotoAnchor( m_url.htmlRef() );
4004 emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
4005 return false; // we jumped, but we didn't open a URL
4006 }
4007 }
4008
4009 if ( !d->m_bComplete && !hasTarget )
4010 closeURL();
4011
4012 view()->viewport()->unsetCursor();
4013 emit d->m_extension->openURLRequest( cURL, args );
4014 return true;
4015}
4016
4017void TDEHTMLPart::slotViewDocumentSource()
4018{
4019 KURL url(m_url);
4020 bool isTempFile = false;
4021 if (!(url.isLocalFile()) && TDEHTMLPageCache::self()->isComplete(d->m_cacheId))
4022 {
4023 KTempFile sourceFile(TQString(), defaultExtension());
4024 if (sourceFile.status() == 0)
4025 {
4026 TDEHTMLPageCache::self()->saveData(d->m_cacheId, sourceFile.dataStream());
4027 url = KURL();
4028 url.setPath(sourceFile.name());
4029 isTempFile = true;
4030 }
4031 }
4032
4033 (void) KRun::runURL( url, TQString::fromLatin1("text/plain"), isTempFile );
4034}
4035
4036void TDEHTMLPart::slotViewPageInfo()
4037{
4038 TDEHTMLInfoDlg *dlg = new TDEHTMLInfoDlg(NULL, "TDEHTML Page Info Dialog", false, (WFlags)WDestructiveClose);
4039 dlg->_close->setGuiItem(KStdGuiItem::close());
4040
4041 if (d->m_doc)
4042 dlg->_title->setText(d->m_doc->title().string());
4043
4044 // If it's a frame, set the caption to "Frame Information"
4045 if ( parentPart() && d->m_doc && d->m_doc->isHTMLDocument() ) {
4046 dlg->setCaption(i18n("Frame Information"));
4047 }
4048
4049 TQString editStr = TQString();
4050
4051 if (!d->m_pageServices.isEmpty())
4052 editStr = i18n(" <a href=\"%1\">[Properties]</a>").arg(d->m_pageServices);
4053
4054 TQString squeezedURL = KStringHandler::csqueeze( url().prettyURL(), 80 );
4055 dlg->_url->setText("<a href=\"" + url().url() + "\">" + squeezedURL + "</a>" + editStr);
4056 if (lastModified().isEmpty())
4057 {
4058 dlg->_lastModified->hide();
4059 dlg->_lmLabel->hide();
4060 }
4061 else
4062 dlg->_lastModified->setText(lastModified());
4063
4064 const TQString& enc = encoding();
4065 if (enc.isEmpty()) {
4066 dlg->_eLabel->hide();
4067 dlg->_encoding->hide();
4068 } else {
4069 dlg->_encoding->setText(enc);
4070 }
4071 /* populate the list view now */
4072 const TQStringList headers = TQStringList::split("\n", d->m_httpHeaders);
4073
4074 TQStringList::ConstIterator it = headers.begin();
4075 const TQStringList::ConstIterator itEnd = headers.end();
4076
4077 for (; it != itEnd; ++it) {
4078 const TQStringList header = TQStringList::split(TQRegExp(":[ ]+"), *it);
4079 if (header.count() != 2)
4080 continue;
4081 new TQListViewItem(dlg->_headers, header[0], header[1]);
4082 }
4083
4084 dlg->show();
4085 /* put no code here */
4086}
4087
4088
4089void TDEHTMLPart::slotViewFrameSource()
4090{
4091 KParts::ReadOnlyPart *frame = currentFrame();
4092 if ( !frame )
4093 return;
4094
4095 KURL url = frame->url();
4096 bool isTempFile = false;
4097 if (!(url.isLocalFile()) && frame->inherits("TDEHTMLPart"))
4098 {
4099 long cacheId = static_cast<TDEHTMLPart *>(frame)->d->m_cacheId;
4100
4101 if (TDEHTMLPageCache::self()->isComplete(cacheId))
4102 {
4103 KTempFile sourceFile(TQString(), defaultExtension());
4104 if (sourceFile.status() == 0)
4105 {
4106 TDEHTMLPageCache::self()->saveData(cacheId, sourceFile.dataStream());
4107 url = KURL();
4108 url.setPath(sourceFile.name());
4109 isTempFile = true;
4110 }
4111 }
4112 }
4113
4114 (void) KRun::runURL( url, TQString::fromLatin1("text/plain"), isTempFile );
4115}
4116
4117KURL TDEHTMLPart::backgroundURL() const
4118{
4119 // ### what about XML documents? get from CSS?
4120 if (!d->m_doc || !d->m_doc->isHTMLDocument())
4121 return KURL();
4122
4123 TQString relURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4124
4125 return KURL( m_url, relURL );
4126}
4127
4128void TDEHTMLPart::slotSaveBackground()
4129{
4130 TDEIO::MetaData metaData;
4131 metaData["referrer"] = d->m_referrer;
4132 TDEHTMLPopupGUIClient::saveURL( d->m_view, i18n("Save Background Image As"), backgroundURL(), metaData );
4133}
4134
4135void TDEHTMLPart::slotSaveDocument()
4136{
4137 KURL srcURL( m_url );
4138
4139 if ( srcURL.fileName(false).isEmpty() )
4140 srcURL.setFileName( "index" + defaultExtension() );
4141
4142 TDEIO::MetaData metaData;
4143 // Referre unknown?
4144 TDEHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, "text/html", d->m_cacheId );
4145}
4146
4147void TDEHTMLPart::slotSecurity()
4148{
4149// kdDebug( 6050 ) << "Meta Data:" << endl
4150// << d->m_ssl_peer_cert_subject
4151// << endl
4152// << d->m_ssl_peer_cert_issuer
4153// << endl
4154// << d->m_ssl_cipher
4155// << endl
4156// << d->m_ssl_cipher_desc
4157// << endl
4158// << d->m_ssl_cipher_version
4159// << endl
4160// << d->m_ssl_good_from
4161// << endl
4162// << d->m_ssl_good_until
4163// << endl
4164// << d->m_ssl_cert_state
4165// << endl;
4166
4167 KSSLInfoDlg *kid = new KSSLInfoDlg(d->m_ssl_in_use, widget(), "kssl_info_dlg", true );
4168
4169 if (d->m_bSecurityInQuestion)
4170 kid->setSecurityInQuestion(true);
4171
4172 if (d->m_ssl_in_use) {
4173 KSSLCertificate *x = KSSLCertificate::fromString(d->m_ssl_peer_certificate.local8Bit());
4174 if (x) {
4175 // Set the chain back onto the certificate
4176 const TQStringList cl = TQStringList::split(TQString("\n"), d->m_ssl_peer_chain);
4177 TQPtrList<KSSLCertificate> ncl;
4178
4179 ncl.setAutoDelete(true);
4180 TQStringList::ConstIterator it = cl.begin();
4181 const TQStringList::ConstIterator itEnd = cl.end();
4182 for (; it != itEnd; ++it) {
4183 KSSLCertificate* const y = KSSLCertificate::fromString((*it).local8Bit());
4184 if (y) ncl.append(y);
4185 }
4186
4187 if (ncl.count() > 0)
4188 x->chain().setChain(ncl);
4189
4190 kid->setup(x,
4191 d->m_ssl_peer_ip,
4192 m_url.url(),
4193 d->m_ssl_cipher,
4194 d->m_ssl_cipher_desc,
4195 d->m_ssl_cipher_version,
4196 d->m_ssl_cipher_used_bits.toInt(),
4197 d->m_ssl_cipher_bits.toInt(),
4198 (KSSLCertificate::KSSLValidation) d->m_ssl_cert_state.toInt()
4199 );
4200 kid->exec();
4201 delete x;
4202 } else kid->exec();
4203 } else kid->exec();
4204}
4205
4206void TDEHTMLPart::slotSaveFrame()
4207{
4208 KParts::ReadOnlyPart *frame = currentFrame();
4209 if ( !frame )
4210 return;
4211
4212 KURL srcURL( frame->url() );
4213
4214 if ( srcURL.fileName(false).isEmpty() )
4215 srcURL.setFileName( "index" + defaultExtension() );
4216
4217 TDEIO::MetaData metaData;
4218 // Referrer unknown?
4219 TDEHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save Frame As" ), srcURL, metaData, "text/html" );
4220}
4221
4222void TDEHTMLPart::slotSetEncoding()
4223{
4224 d->m_automaticDetection->setItemChecked( int( d->m_autoDetectLanguage ), false );
4225 d->m_paSetEncoding->popupMenu()->setItemChecked( 0, false );
4226 d->m_paSetEncoding->popupMenu()->setItemChecked( d->m_paSetEncoding->popupMenu()->idAt( 2 ), true );
4227
4228 TQString enc = TDEGlobal::charsets()->encodingForName( d->m_manualDetection->currentText() );
4229 setEncoding( enc, true );
4230}
4231
4232void TDEHTMLPart::slotUseStylesheet()
4233{
4234 if (d->m_doc)
4235 {
4236 bool autoselect = (d->m_paUseStylesheet->currentItem() == 0);
4237 d->m_sheetUsed = autoselect ? TQString() : d->m_paUseStylesheet->currentText();
4238 d->m_doc->updateStyleSelector();
4239 }
4240}
4241
4242void TDEHTMLPart::updateActions()
4243{
4244 bool frames = false;
4245
4246 TQValueList<tdehtml::ChildFrame*>::ConstIterator it = d->m_frames.begin();
4247 const TQValueList<tdehtml::ChildFrame*>::ConstIterator end = d->m_frames.end();
4248 for (; it != end; ++it )
4249 if ( (*it)->m_type == tdehtml::ChildFrame::Frame )
4250 {
4251 frames = true;
4252 break;
4253 }
4254
4255 d->m_paViewFrame->setEnabled( frames );
4256 d->m_paSaveFrame->setEnabled( frames );
4257
4258 if ( frames )
4259 d->m_paFind->setText( i18n( "&Find in Frame..." ) );
4260 else
4261 d->m_paFind->setText( i18n( "&Find..." ) );
4262
4263 KParts::Part *frame = 0;
4264
4265 if ( frames )
4266 frame = currentFrame();
4267
4268 bool enableFindAndSelectAll = true;
4269
4270 if ( frame )
4271 enableFindAndSelectAll = frame->inherits( "TDEHTMLPart" );
4272
4273 d->m_paFind->setEnabled( enableFindAndSelectAll );
4274 d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
4275
4276 bool enablePrintFrame = false;
4277
4278 if ( frame )
4279 {
4280 TQObject *ext = KParts::BrowserExtension::childObject( frame );
4281 if ( ext )
4282 enablePrintFrame = ext->metaObject()->slotNames().contains( "print()" );
4283 }
4284
4285 d->m_paPrintFrame->setEnabled( enablePrintFrame );
4286
4287 TQString bgURL;
4288
4289 // ### frames
4290 if ( d->m_doc && d->m_doc->isHTMLDocument() && static_cast<HTMLDocumentImpl*>(d->m_doc)->body() && !d->m_bClearing )
4291 bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
4292
4293 d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
4294
4295 if ( d->m_paDebugScript )
4296 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
4297}
4298
4299KParts::LiveConnectExtension *TDEHTMLPart::liveConnectExtension( const tdehtml::RenderPart *frame) const {
4300 const ConstFrameIt end = d->m_objects.end();
4301 for(ConstFrameIt it = d->m_objects.begin(); it != end; ++it )
4302 if ((*it)->m_frame == frame)
4303 return (*it)->m_liveconnect;
4304 return 0L;
4305}
4306
4307bool TDEHTMLPart::requestFrame( tdehtml::RenderPart *frame, const TQString &url, const TQString &frameName,
4308 const TQStringList &params, bool isIFrame )
4309{
4310 //kdDebug( 6050 ) << this << " requestFrame( ..., " << url << ", " << frameName << " )" << endl;
4311 FrameIt it = d->m_frames.find( frameName );
4312 if ( it == d->m_frames.end() )
4313 {
4314 tdehtml::ChildFrame * child = new tdehtml::ChildFrame;
4315 //kdDebug( 6050 ) << "inserting new frame into frame map " << frameName << endl;
4316 child->m_name = frameName;
4317 it = d->m_frames.append( child );
4318 }
4319
4320 (*it)->m_type = isIFrame ? tdehtml::ChildFrame::IFrame : tdehtml::ChildFrame::Frame;
4321 (*it)->m_frame = frame;
4322 (*it)->m_params = params;
4323
4324 // Support for <frame src="javascript:string">
4325 if ( url.find( TQString::fromLatin1( "javascript:" ), 0, false ) == 0 )
4326 {
4327 if ( processObjectRequest(*it, KURL("about:blank"), TQString("text/html") ) ) {
4328 TDEHTMLPart* p = static_cast<TDEHTMLPart*>(static_cast<KParts::ReadOnlyPart *>((*it)->m_part));
4329
4330 // See if we want to replace content with javascript: output..
4331 TQVariant res = p->executeScript( DOM::Node(), KURL::decode_string( url.right( url.length() - 11) ) );
4332 if ( res.type() == TQVariant::String ) {
4333 p->begin();
4334 p->write( res.asString() );
4335 p->end();
4336 }
4337 return true;
4338 }
4339 return false;
4340 }
4341 KURL u = url.isEmpty() ? KURL() : completeURL( url );
4342 return requestObject( *it, u );
4343}
4344
4345TQString TDEHTMLPart::requestFrameName()
4346{
4347 return TQString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
4348}
4349
4350bool TDEHTMLPart::requestObject( tdehtml::RenderPart *frame, const TQString &url, const TQString &serviceType,
4351 const TQStringList &params )
4352{
4353 //kdDebug( 6005 ) << "TDEHTMLPart::requestObject " << this << " frame=" << frame << endl;
4354 tdehtml::ChildFrame *child = new tdehtml::ChildFrame;
4355 FrameIt it = d->m_objects.append( child );
4356 (*it)->m_frame = frame;
4357 (*it)->m_type = tdehtml::ChildFrame::Object;
4358 (*it)->m_params = params;
4359
4360 KParts::URLArgs args;
4361 args.serviceType = serviceType;
4362 if (!requestObject( *it, completeURL( url ), args ) && !(*it)->m_run) {
4363 (*it)->m_bCompleted = true;
4364 return false;
4365 }
4366 return true;
4367}
4368
4369bool TDEHTMLPart::requestObject( tdehtml::ChildFrame *child, const KURL &url, const KParts::URLArgs &_args )
4370{
4371 if (!checkLinkSecurity(url))
4372 {
4373 kdDebug(6005) << this << " TDEHTMLPart::requestObject checkLinkSecurity refused" << endl;
4374 return false;
4375 }
4376 if ( child->m_bPreloaded )
4377 {
4378 kdDebug(6005) << "TDEHTMLPart::requestObject preload" << endl;
4379 if ( child->m_frame && child->m_part )
4380 child->m_frame->setWidget( child->m_part->widget() );
4381
4382 child->m_bPreloaded = false;
4383 return true;
4384 }
4385
4386 //kdDebug(6005) << "TDEHTMLPart::requestObject child=" << child << " child->m_part=" << child->m_part << endl;
4387
4388 KParts::URLArgs args( _args );
4389
4390 if ( child->m_run )
4391 child->m_run->abort();
4392
4393 if ( child->m_part && !args.reload && urlcmp( child->m_part->url().url(), url.url(), true, true ) )
4394 args.serviceType = child->m_serviceType;
4395
4396 child->m_args = args;
4397 child->m_args.reload = (d->m_cachePolicy == TDEIO::CC_Reload);
4398 child->m_serviceName = TQString();
4399 if (!d->m_referrer.isEmpty() && !child->m_args.metaData().contains( "referrer" ))
4400 child->m_args.metaData()["referrer"] = d->m_referrer;
4401
4402 child->m_args.metaData().insert("PropagateHttpHeader", "true");
4403 child->m_args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
4404 child->m_args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
4405 child->m_args.metaData().insert("main_frame_request",
4406 parentPart() == 0 ? "TRUE":"FALSE");
4407 child->m_args.metaData().insert("ssl_was_in_use",
4408 d->m_ssl_in_use ? "TRUE":"FALSE");
4409 child->m_args.metaData().insert("ssl_activate_warnings", "TRUE");
4410 child->m_args.metaData().insert("cross-domain", toplevelURL().url());
4411
4412 // We want a TDEHTMLPart if the HTML says <frame src=""> or <frame src="about:blank">
4413 if ((url.isEmpty() || url.url() == "about:blank") && args.serviceType.isEmpty())
4414 args.serviceType = TQString::fromLatin1( "text/html" );
4415
4416 if ( args.serviceType.isEmpty() ) {
4417 kdDebug(6050) << "Running new TDEHTMLRun for " << this << " and child=" << child << endl;
4418 child->m_run = new TDEHTMLRun( this, child, url, child->m_args, true );
4419 d->m_bComplete = false; // ensures we stop it in checkCompleted...
4420 return false;
4421 } else {
4422 return processObjectRequest( child, url, args.serviceType );
4423 }
4424}
4425
4426bool TDEHTMLPart::processObjectRequest( tdehtml::ChildFrame *child, const KURL &_url, const TQString &mimetype )
4427{
4428 //kdDebug( 6050 ) << "TDEHTMLPart::processObjectRequest trying to create part for " << mimetype << endl;
4429
4430 // IMPORTANT: create a copy of the url here, because it is just a reference, which was likely to be given
4431 // by an emitting frame part (emit openURLRequest( blahurl, ... ) . A few lines below we delete the part
4432 // though -> the reference becomes invalid -> crash is likely
4433 KURL url( _url );
4434
4435 // tdehtmlrun called us this way to indicate a loading error
4436 if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) )
4437 {
4438 child->m_bCompleted = true;
4439 checkCompleted();
4440 return true;
4441 }
4442
4443 if (child->m_bNotify)
4444 {
4445 child->m_bNotify = false;
4446 if ( !child->m_args.lockHistory() )
4447 emit d->m_extension->openURLNotify();
4448 }
4449
4450 if ( child->m_serviceType != mimetype || !child->m_part )
4451 {
4452 // Before attempting to load a part, check if the user wants that.
4453 // Many don't like getting ZIP files embedded.
4454 // However we don't want to ask for flash and other plugin things..
4455 if ( child->m_type != tdehtml::ChildFrame::Object )
4456 {
4457 TQString suggestedFilename;
4458 if ( child->m_run )
4459 suggestedFilename = child->m_run->suggestedFilename();
4460
4461 KParts::BrowserRun::AskSaveResult res = KParts::BrowserRun::askEmbedOrSave(
4462 url, mimetype, suggestedFilename );
4463 switch( res ) {
4464 case KParts::BrowserRun::Save:
4465 TDEHTMLPopupGUIClient::saveURL( widget(), i18n( "Save As" ), url, child->m_args.metaData(), TQString(), 0, suggestedFilename);
4466 // fall-through
4467 case KParts::BrowserRun::Cancel:
4468 child->m_bCompleted = true;
4469 checkCompleted();
4470 return true; // done
4471 default: // Open
4472 break;
4473 }
4474 }
4475
4476 TQStringList dummy; // the list of servicetypes handled by the part is now unused.
4477 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 );
4478
4479 if ( !part )
4480 {
4481 if ( child->m_frame )
4482 if (child->m_frame->partLoadingErrorNotify( child, url, mimetype ))
4483 return true; // we succeeded after all (a fallback was used)
4484
4485 checkEmitLoadEvent();
4486 return false;
4487 }
4488
4489 //CRITICAL STUFF
4490 if ( child->m_part )
4491 {
4492 if (!::tqt_cast<TDEHTMLPart*>(child->m_part) && child->m_jscript)
4493 child->m_jscript->clear();
4494 partManager()->removePart( (KParts::ReadOnlyPart *)child->m_part );
4495 delete (KParts::ReadOnlyPart *)child->m_part;
4496 if (child->m_liveconnect) {
4497 disconnect(child->m_liveconnect, TQ_SIGNAL(partEvent(const unsigned long, const TQString &, const KParts::LiveConnectExtension::ArgList &)), child, TQ_SLOT(liveConnectEvent(const unsigned long, const TQString&, const KParts::LiveConnectExtension::ArgList &)));
4498 child->m_liveconnect = 0L;
4499 }
4500 }
4501
4502 child->m_serviceType = mimetype;
4503 if ( child->m_frame && part->widget() )
4504 child->m_frame->setWidget( part->widget() );
4505
4506 if ( child->m_type != tdehtml::ChildFrame::Object )
4507 partManager()->addPart( part, false );
4508// else
4509// kdDebug(6005) << "AH! NO FRAME!!!!!" << endl;
4510
4511 child->m_part = part;
4512
4513 if (::tqt_cast<TDEHTMLPart*>(part)) {
4514 static_cast<TDEHTMLPart*>(part)->d->m_frame = child;
4515 } else if (child->m_frame) {
4516 child->m_liveconnect = KParts::LiveConnectExtension::childObject(part);
4517 if (child->m_liveconnect)
4518 connect(child->m_liveconnect, TQ_SIGNAL(partEvent(const unsigned long, const TQString &, const KParts::LiveConnectExtension::ArgList &)), child, TQ_SLOT(liveConnectEvent(const unsigned long, const TQString&, const KParts::LiveConnectExtension::ArgList &)));
4519 }
4520 KParts::StatusBarExtension *sb = KParts::StatusBarExtension::childObject(part);
4521 if (sb)
4522 sb->setStatusBar( d->m_statusBarExtension->statusBar() );
4523
4524 connect( part, TQ_SIGNAL( started( TDEIO::Job *) ),
4525 this, TQ_SLOT( slotChildStarted( TDEIO::Job *) ) );
4526 connect( part, TQ_SIGNAL( completed() ),
4527 this, TQ_SLOT( slotChildCompleted() ) );
4528 connect( part, TQ_SIGNAL( completed(bool) ),
4529 this, TQ_SLOT( slotChildCompleted(bool) ) );
4530 connect( part, TQ_SIGNAL( setStatusBarText( const TQString & ) ),
4531 this, TQ_SIGNAL( setStatusBarText( const TQString & ) ) );
4532 if ( part->inherits( "TDEHTMLPart" ) )
4533 {
4534 connect( this, TQ_SIGNAL( completed() ),
4535 part, TQ_SLOT( slotParentCompleted() ) );
4536 connect( this, TQ_SIGNAL( completed(bool) ),
4537 part, TQ_SLOT( slotParentCompleted() ) );
4538 // As soon as the child's document is created, we need to set its domain
4539 // (but we do so only once, so it can't be simply done in the child)
4540 connect( part, TQ_SIGNAL( docCreated() ),
4541 this, TQ_SLOT( slotChildDocCreated() ) );
4542 }
4543
4544 child->m_extension = KParts::BrowserExtension::childObject( part );
4545
4546 if ( child->m_extension )
4547 {
4548 connect( child->m_extension, TQ_SIGNAL( openURLNotify() ),
4549 d->m_extension, TQ_SIGNAL( openURLNotify() ) );
4550
4551 connect( child->m_extension, TQ_SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ),
4552 this, TQ_SLOT( slotChildURLRequest( const KURL &, const KParts::URLArgs & ) ) );
4553
4554 connect( child->m_extension, TQ_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ),
4555 d->m_extension, TQ_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ) );
4556 connect( child->m_extension, TQ_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs &, const KParts::WindowArgs &, KParts::ReadOnlyPart *& ) ),
4557 d->m_extension, TQ_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & , const KParts::WindowArgs &, KParts::ReadOnlyPart *&) ) );
4558
4559 connect( child->m_extension, TQ_SIGNAL( popupMenu( const TQPoint &, const KFileItemList & ) ),
4560 d->m_extension, TQ_SIGNAL( popupMenu( const TQPoint &, const KFileItemList & ) ) );
4561 connect( child->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList & ) ),
4562 d->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList & ) ) );
4563 connect( child->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags ) ),
4564 d->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags ) ) );
4565 connect( child->m_extension, TQ_SIGNAL( popupMenu( const TQPoint &, const KURL &, const TQString &, mode_t ) ),
4566 d->m_extension, TQ_SIGNAL( popupMenu( const TQPoint &, const KURL &, const TQString &, mode_t ) ) );
4567 connect( child->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const TQString &, mode_t ) ),
4568 d->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const TQString &, mode_t ) ) );
4569 connect( child->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t ) ),
4570 d->m_extension, TQ_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t ) ) );
4571
4572 connect( child->m_extension, TQ_SIGNAL( infoMessage( const TQString & ) ),
4573 d->m_extension, TQ_SIGNAL( infoMessage( const TQString & ) ) );
4574
4575 connect( child->m_extension, TQ_SIGNAL( requestFocus( KParts::ReadOnlyPart * ) ),
4576 this, TQ_SLOT( slotRequestFocus( KParts::ReadOnlyPart * ) ) );
4577
4578 child->m_extension->setBrowserInterface( d->m_extension->browserInterface() );
4579 }
4580 }
4581 else if ( child->m_frame && child->m_part &&
4582 child->m_frame->widget() != child->m_part->widget() )
4583 child->m_frame->setWidget( child->m_part->widget() );
4584
4585 checkEmitLoadEvent();
4586 // Some JS code in the load event may have destroyed the part
4587 // In that case, abort
4588 if ( !child->m_part )
4589 return false;
4590
4591 if ( child->m_bPreloaded )
4592 {
4593 if ( child->m_frame && child->m_part )
4594 child->m_frame->setWidget( child->m_part->widget() );
4595
4596 child->m_bPreloaded = false;
4597 return true;
4598 }
4599
4600 child->m_args.reload = (d->m_cachePolicy == TDEIO::CC_Reload);
4601
4602 // make sure the part has a way to find out about the mimetype.
4603 // we actually set it in child->m_args in requestObject already,
4604 // but it's useless if we had to use a TDEHTMLRun instance, as the
4605 // point the run object is to find out exactly the mimetype.
4606 child->m_args.serviceType = mimetype;
4607
4608 // if not a frame set child as completed
4609 child->m_bCompleted = child->m_type == tdehtml::ChildFrame::Object;
4610
4611 if ( child->m_extension )
4612 child->m_extension->setURLArgs( child->m_args );
4613
4614 if(url.protocol() == "javascript" || url.url() == "about:blank") {
4615 if (!child->m_part->inherits("TDEHTMLPart"))
4616 return false;
4617
4618 TDEHTMLPart* p = static_cast<TDEHTMLPart*>(static_cast<KParts::ReadOnlyPart *>(child->m_part));
4619
4620 p->begin();
4621 if (d->m_doc && p->d->m_doc)
4622 p->d->m_doc->setBaseURL(d->m_doc->baseURL());
4623 if (!url.url().startsWith("about:")) {
4624 p->write(url.path());
4625 } else {
4626 p->m_url = url;
4627 // we need a body element. testcase: <iframe id="a"></iframe><script>alert(a.document.body);</script>
4628 p->write("<HTML><TITLE></TITLE><BODY></BODY></HTML>");
4629 }
4630 p->end();
4631 return true;
4632 }
4633 else if ( !url.isEmpty() )
4634 {
4635 //kdDebug( 6050 ) << "opening " << url.url() << " in frame " << child->m_part << endl;
4636 bool b = child->m_part->openURL( url );
4637 if (child->m_bCompleted)
4638 checkCompleted();
4639 return b;
4640 }
4641 else
4642 {
4643 child->m_bCompleted = true;
4644 checkCompleted();
4645 return true;
4646 }
4647}
4648
4649KParts::ReadOnlyPart *TDEHTMLPart::createPart( TQWidget *parentWidget, const char *widgetName,
4650 TQObject *parent, const char *name, const TQString &mimetype,
4651 TQString &serviceName, TQStringList &serviceTypes,
4652 const TQStringList &params )
4653{
4654 TQString constr;
4655 if ( !serviceName.isEmpty() )
4656 constr.append( TQString::fromLatin1( "Name == '%1'" ).arg( serviceName ) );
4657
4658 TDETrader::OfferList offers = TDETrader::self()->query( mimetype, "KParts/ReadOnlyPart", constr, TQString() );
4659
4660 if ( offers.isEmpty() ) {
4661 int pos = mimetype.find( "-plugin" );
4662 if (pos < 0)
4663 return 0L;
4664 TQString stripped_mime = mimetype.left( pos );
4665 offers = TDETrader::self()->query( stripped_mime, "KParts/ReadOnlyPart", constr, TQString() );
4666 if ( offers.isEmpty() )
4667 return 0L;
4668 }
4669
4670 TDETrader::OfferList::ConstIterator it = offers.begin();
4671 const TDETrader::OfferList::ConstIterator itEnd = offers.end();
4672 for ( ; it != itEnd; ++it )
4673 {
4674 KService::Ptr service = (*it);
4675
4676 KLibFactory* const factory = KLibLoader::self()->factory( TQFile::encodeName(service->library()) );
4677 if ( factory ) {
4678 KParts::ReadOnlyPart *res = 0L;
4679
4680 const char *className = "KParts::ReadOnlyPart";
4681 if ( service->serviceTypes().contains( "Browser/View" ) )
4682 className = "Browser/View";
4683
4684 if ( factory->inherits( "KParts::Factory" ) )
4685 res = static_cast<KParts::ReadOnlyPart *>(static_cast<KParts::Factory *>( factory )->createPart( parentWidget, widgetName, parent, name, className, params ));
4686 else
4687 res = static_cast<KParts::ReadOnlyPart *>(factory->create( parentWidget, widgetName, className ));
4688
4689 if ( res ) {
4690 serviceTypes = service->serviceTypes();
4691 serviceName = service->name();
4692 return res;
4693 }
4694 } else {
4695 // TODO KMessageBox::error and i18n, like in KonqFactory::createView?
4696 kdWarning() << TQString(TQString("There was an error loading the module %1.\nThe diagnostics is:\n%2")
4697 .arg(service->name()).arg(KLibLoader::self()->lastErrorMessage())) << endl;
4698 }
4699 }
4700 return 0;
4701}
4702
4703KParts::PartManager *TDEHTMLPart::partManager()
4704{
4705 if ( !d->m_manager && d->m_view )
4706 {
4707 d->m_manager = new KParts::PartManager( d->m_view->topLevelWidget(), this, "tdehtml part manager" );
4708 d->m_manager->setAllowNestedParts( true );
4709 connect( d->m_manager, TQ_SIGNAL( activePartChanged( KParts::Part * ) ),
4710 this, TQ_SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
4711 connect( d->m_manager, TQ_SIGNAL( partRemoved( KParts::Part * ) ),
4712 this, TQ_SLOT( slotPartRemoved( KParts::Part * ) ) );
4713 }
4714
4715 return d->m_manager;
4716}
4717
4718void TDEHTMLPart::submitFormAgain()
4719{
4720 disconnect(this, TQ_SIGNAL(completed()), this, TQ_SLOT(submitFormAgain()));
4721 if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
4722 TDEHTMLPart::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 );
4723
4724 delete d->m_submitForm;
4725 d->m_submitForm = 0;
4726}
4727
4728void TDEHTMLPart::submitFormProxy( const char *action, const TQString &url, const TQByteArray &formData, const TQString &_target, const TQString& contentType, const TQString& boundary )
4729{
4730 submitForm(action, url, formData, _target, contentType, boundary);
4731}
4732
4733void TDEHTMLPart::submitForm( const char *action, const TQString &url, const TQByteArray &formData, const TQString &_target, const TQString& contentType, const TQString& boundary )
4734{
4735 kdDebug(6000) << this << ": TDEHTMLPart::submitForm target=" << _target << " url=" << url << endl;
4736 if (d->m_formNotification == TDEHTMLPart::Only) {
4737 emit formSubmitNotification(action, url, formData, _target, contentType, boundary);
4738 return;
4739 } else if (d->m_formNotification == TDEHTMLPart::Before) {
4740 emit formSubmitNotification(action, url, formData, _target, contentType, boundary);
4741 }
4742
4743 KURL u = completeURL( url );
4744
4745 if ( !u.isValid() )
4746 {
4747 // ### ERROR HANDLING!
4748 return;
4749 }
4750
4751 // Form security checks
4752 //
4753 /*
4754 * If these form security checks are still in this place in a month or two
4755 * I'm going to simply delete them.
4756 */
4757
4758 /* This is separate for a reason. It has to be _before_ all script, etc,
4759 * AND I don't want to break anything that uses checkLinkSecurity() in
4760 * other places.
4761 */
4762
4763 if (!d->m_submitForm) {
4764 if (u.protocol() != "https" && u.protocol() != "mailto") {
4765 if (d->m_ssl_in_use) { // Going from SSL -> nonSSL
4766 int rc = KMessageBox::warningContinueCancel(NULL, i18n("Warning: This is a secure form but it is attempting to send your data back unencrypted."
4767 "\nA third party may be able to intercept and view this information."
4768 "\nAre you sure you wish to continue?"),
4769 i18n("Network Transmission"),KGuiItem(i18n("&Send Unencrypted")));
4770 if (rc == KMessageBox::Cancel)
4771 return;
4772 } else { // Going from nonSSL -> nonSSL
4773 KSSLSettings kss(true);
4774 if (kss.warnOnUnencrypted()) {
4775 int rc = KMessageBox::warningContinueCancel(NULL,
4776 i18n("Warning: Your data is about to be transmitted across the network unencrypted."
4777 "\nAre you sure you wish to continue?"),
4778 i18n("Network Transmission"),
4779 KGuiItem(i18n("&Send Unencrypted")),
4780 "WarnOnUnencryptedForm");
4781 // Move this setting into KSSL instead
4782 TDEConfig *config = tdeApp->config();
4783 TQString grpNotifMsgs = TQString::fromLatin1("Notification Messages");
4784 TDEConfigGroupSaver saver( config, grpNotifMsgs );
4785
4786 if (!config->readBoolEntry("WarnOnUnencryptedForm", true)) {
4787 config->deleteEntry("WarnOnUnencryptedForm");
4788 config->sync();
4789 kss.setWarnOnUnencrypted(false);
4790 kss.save();
4791 }
4792 if (rc == KMessageBox::Cancel)
4793 return;
4794 }
4795 }
4796 }
4797
4798 if (u.protocol() == "mailto") {
4799 int rc = KMessageBox::warningContinueCancel(NULL,
4800 i18n("This site is attempting to submit form data via email.\n"
4801 "Do you want to continue?"),
4802 i18n("Network Transmission"),
4803 KGuiItem(i18n("&Send Email")),
4804 "WarnTriedEmailSubmit");
4805
4806 if (rc == KMessageBox::Cancel) {
4807 return;
4808 }
4809 }
4810 }
4811
4812 // End form security checks
4813 //
4814
4815 TQString urlstring = u.url();
4816
4817 if ( urlstring.find( TQString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
4818 urlstring = KURL::decode_string(urlstring);
4819 crossFrameExecuteScript( _target, urlstring.right( urlstring.length() - 11) );
4820 return;
4821 }
4822
4823 if (!checkLinkSecurity(u,
4824 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?" ),
4825 i18n( "Submit" )))
4826 return;
4827
4828 KParts::URLArgs args;
4829
4830 if (!d->m_referrer.isEmpty())
4831 args.metaData()["referrer"] = d->m_referrer;
4832
4833 args.metaData().insert("PropagateHttpHeader", "true");
4834 args.metaData().insert("ssl_parent_ip", d->m_ssl_parent_ip);
4835 args.metaData().insert("ssl_parent_cert", d->m_ssl_parent_cert);
4836 args.metaData().insert("main_frame_request",
4837 parentPart() == 0 ? "TRUE":"FALSE");
4838 args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
4839 args.metaData().insert("ssl_activate_warnings", "TRUE");
4840//WABA: When we post a form we should treat it as the main url
4841//the request should never be considered cross-domain
4842//args.metaData().insert("cross-domain", toplevelURL().url());
4843 args.frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
4844
4845 // Handle mailto: forms
4846 if (u.protocol() == "mailto") {
4847 // 1) Check for attach= and strip it
4848 TQString q = u.query().mid(1);
4849 TQStringList nvps = TQStringList::split("&", q);
4850 bool triedToAttach = false;
4851
4852 TQStringList::Iterator nvp = nvps.begin();
4853 const TQStringList::Iterator nvpEnd = nvps.end();
4854
4855// cannot be a for loop as if something is removed we don't want to do ++nvp, as
4856// remove returns an iterator pointing to the next item
4857
4858 while (nvp != nvpEnd) {
4859 const TQStringList pair = TQStringList::split("=", *nvp);
4860 if (pair.count() >= 2) {
4861 if (pair.first().lower() == "attach") {
4862 nvp = nvps.remove(nvp);
4863 triedToAttach = true;
4864 } else {
4865 ++nvp;
4866 }
4867 } else {
4868 ++nvp;
4869 }
4870 }
4871
4872 if (triedToAttach)
4873 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("TDE"), "WarnTriedAttach");
4874
4875 // 2) Append body=
4876 TQString bodyEnc;
4877 if (contentType.lower() == "multipart/form-data") {
4878 // FIXME: is this correct? I suspect not
4879 bodyEnc = KURL::encode_string(TQString::fromLatin1(formData.data(),
4880 formData.size()));
4881 } else if (contentType.lower() == "text/plain") {
4882 // Convention seems to be to decode, and s/&/\n/
4883 TQString tmpbody = TQString::fromLatin1(formData.data(),
4884 formData.size());
4885 tmpbody.replace(TQRegExp("[&]"), "\n");
4886 tmpbody.replace(TQRegExp("[+]"), " ");
4887 tmpbody = KURL::decode_string(tmpbody); // Decode the rest of it
4888 bodyEnc = KURL::encode_string(tmpbody); // Recode for the URL
4889 } else {
4890 bodyEnc = KURL::encode_string(TQString::fromLatin1(formData.data(),
4891 formData.size()));
4892 }
4893
4894 nvps.append(TQString("body=%1").arg(bodyEnc));
4895 q = nvps.join("&");
4896 u.setQuery(q);
4897 }
4898
4899 if ( strcmp( action, "get" ) == 0 ) {
4900 if (u.protocol() != "mailto")
4901 u.setQuery( TQString::fromLatin1( formData.data(), formData.size() ) );
4902 args.setDoPost( false );
4903 }
4904 else {
4905 args.postData = formData;
4906 args.setDoPost( true );
4907
4908 // construct some user headers if necessary
4909 if (contentType.isNull() || contentType == "application/x-www-form-urlencoded")
4910 args.setContentType( "Content-Type: application/x-www-form-urlencoded" );
4911 else // contentType must be "multipart/form-data"
4912 args.setContentType( "Content-Type: " + contentType + "; boundary=" + boundary );
4913 }
4914
4915 if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
4916 if( d->m_submitForm ) {
4917 kdDebug(6000) << "TDEHTMLPart::submitForm ABORTING!" << endl;
4918 return;
4919 }
4920 d->m_submitForm = new TDEHTMLPartPrivate::SubmitForm;
4921 d->m_submitForm->submitAction = action;
4922 d->m_submitForm->submitUrl = url;
4923 d->m_submitForm->submitFormData = formData;
4924 d->m_submitForm->target = _target;
4925 d->m_submitForm->submitContentType = contentType;
4926 d->m_submitForm->submitBoundary = boundary;
4927 connect(this, TQ_SIGNAL(completed()), this, TQ_SLOT(submitFormAgain()));
4928 }
4929 else
4930 {
4931 emit d->m_extension->openURLRequest( u, args );
4932 }
4933}
4934
4935void TDEHTMLPart::popupMenu( const TQString &linkUrl )
4936{
4937 KURL popupURL;
4938 KURL linkKURL;
4939 KParts::URLArgs args;
4940 TQString referrer;
4941 KParts::BrowserExtension::PopupFlags itemflags=KParts::BrowserExtension::ShowBookmark | KParts::BrowserExtension::ShowReload;
4942
4943 if ( linkUrl.isEmpty() ) { // click on background
4944 TDEHTMLPart* tdehtmlPart = this;
4945 while ( tdehtmlPart->parentPart() )
4946 {
4947 tdehtmlPart=tdehtmlPart->parentPart();
4948 }
4949 popupURL = tdehtmlPart->url();
4950 referrer = tdehtmlPart->pageReferrer();
4951 if (hasSelection())
4952 itemflags = KParts::BrowserExtension::ShowTextSelectionItems;
4953 else
4954 itemflags |= KParts::BrowserExtension::ShowNavigationItems;
4955 } else { // click on link
4956 popupURL = completeURL( linkUrl );
4957 linkKURL = popupURL;
4958 referrer = this->referrer();
4959
4960 if (!(d->m_strSelectedURLTarget).isEmpty() &&
4961 (d->m_strSelectedURLTarget.lower() != "_top") &&
4962 (d->m_strSelectedURLTarget.lower() != "_self") &&
4963 (d->m_strSelectedURLTarget.lower() != "_parent")) {
4964 if (d->m_strSelectedURLTarget.lower() == "_blank")
4965 args.setForcesNewWindow(true);
4966 else {
4967 TDEHTMLPart *p = this;
4968 while (p->parentPart())
4969 p = p->parentPart();
4970 if (!p->frameExists(d->m_strSelectedURLTarget))
4971 args.setForcesNewWindow(true);
4972 }
4973 }
4974 }
4975
4976 // Danger, Will Robinson. The Popup might stay around for a much
4977 // longer time than TDEHTMLPart. Deal with it.
4978 TDEHTMLPopupGUIClient* client = new TDEHTMLPopupGUIClient( this, d->m_popupMenuXML, linkKURL );
4979 TQGuardedPtr<TQObject> guard( client );
4980
4981 TQString mimetype = TQString::fromLatin1( "text/html" );
4982 args.metaData()["referrer"] = referrer;
4983
4984 if (!linkUrl.isEmpty()) // over a link
4985 {
4986 if (popupURL.isLocalFile()) // safe to do this
4987 {
4988 mimetype = KMimeType::findByURL(popupURL,0,true,false)->name();
4989 }
4990 else // look at "extension" of link
4991 {
4992 const TQString fname(popupURL.fileName(false));
4993 if (!fname.isEmpty() && !popupURL.hasRef() && popupURL.query().isEmpty())
4994 {
4995 KMimeType::Ptr pmt = KMimeType::findByPath(fname,0,true);
4996
4997 // Further check for mime types guessed from the extension which,
4998 // on a web page, are more likely to be a script delivering content
4999 // of undecidable type. If the mime type from the extension is one
5000 // of these, don't use it. Retain the original type 'text/html'.
5001 if (pmt->name() != KMimeType::defaultMimeType() &&
5002 !pmt->is("application/x-perl") &&
5003 !pmt->is("application/x-perl-module") &&
5004 !pmt->is("application/x-php") &&
5005 !pmt->is("application/x-python-bytecode") &&
5006 !pmt->is("application/x-python") &&
5007 !pmt->is("application/x-shellscript"))
5008 mimetype = pmt->name();
5009 }
5010 }
5011 }
5012
5013 args.serviceType = mimetype;
5014
5015 emit d->m_extension->popupMenu( client, TQCursor::pos(), popupURL, args, itemflags, S_IFREG /*always a file*/);
5016
5017 if ( !guard.isNull() ) {
5018 delete client;
5019 emit popupMenu(linkUrl, TQCursor::pos());
5020 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
5021 }
5022}
5023
5024void TDEHTMLPart::slotParentCompleted()
5025{
5026 //kdDebug(6050) << this << " slotParentCompleted()" << endl;
5027 if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
5028 {
5029 //kdDebug(6050) << this << ": starting timer for child redirection -> " << d->m_redirectURL << endl;
5030 d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
5031 }
5032}
5033
5034void TDEHTMLPart::slotChildStarted( TDEIO::Job *job )
5035{
5036 tdehtml::ChildFrame *child = frame( sender() );
5037
5038 assert( child );
5039
5040 child->m_bCompleted = false;
5041
5042 if ( d->m_bComplete )
5043 {
5044#if 0
5045 // WABA: Looks like this belongs somewhere else
5046 if ( !parentPart() ) // "toplevel" html document? if yes, then notify the hosting browser about the document (url) changes
5047 {
5048 emit d->m_extension->openURLNotify();
5049 }
5050#endif
5051 d->m_bComplete = false;
5052 emit started( job );
5053 }
5054}
5055
5056void TDEHTMLPart::slotChildCompleted()
5057{
5058 slotChildCompleted( false );
5059}
5060
5061void TDEHTMLPart::slotChildCompleted( bool pendingAction )
5062{
5063 tdehtml::ChildFrame *child = frame( sender() );
5064
5065 if ( child ) {
5066 kdDebug(6050) << this << " slotChildCompleted child=" << child << " m_frame=" << child->m_frame << endl;
5067 child->m_bCompleted = true;
5068 child->m_bPendingRedirection = pendingAction;
5069 child->m_args = KParts::URLArgs();
5070 }
5071 checkCompleted();
5072}
5073
5074void TDEHTMLPart::slotChildDocCreated()
5075{
5076 const TDEHTMLPart* htmlFrame = static_cast<const TDEHTMLPart *>(sender());
5077 // Set domain to the frameset's domain
5078 // This must only be done when loading the frameset initially (#22039),
5079 // not when following a link in a frame (#44162).
5080 if ( d->m_doc && d->m_doc->isHTMLDocument() )
5081 {
5082 if ( sender()->inherits("TDEHTMLPart") )
5083 {
5084 DOMString domain = static_cast<HTMLDocumentImpl*>(d->m_doc)->domain();
5085 if (htmlFrame->d->m_doc && htmlFrame->d->m_doc->isHTMLDocument() )
5086 //kdDebug(6050) << "TDEHTMLPart::slotChildDocCreated: url: " << htmlFrame->m_url.url() << endl;
5087 static_cast<HTMLDocumentImpl*>(htmlFrame->d->m_doc)->setDomain( domain );
5088 }
5089 }
5090 // So it only happens once
5091 disconnect( htmlFrame, TQ_SIGNAL( docCreated() ), this, TQ_SLOT( slotChildDocCreated() ) );
5092}
5093
5094void TDEHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
5095{
5096 tdehtml::ChildFrame *child = frame( sender()->parent() );
5097 TDEHTMLPart *callingHtmlPart = const_cast<TDEHTMLPart *>(dynamic_cast<const TDEHTMLPart *>(sender()->parent()));
5098
5099 // TODO: handle child target correctly! currently the script are always executed fur the parent
5100 TQString urlStr = url.url();
5101 if ( urlStr.find( TQString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
5102 TQString script = KURL::decode_string( urlStr.right( urlStr.length() - 11 ) );
5103 executeScript( DOM::Node(), script );
5104 return;
5105 }
5106
5107 TQString frameName = args.frameName.lower();
5108 if ( !frameName.isEmpty() ) {
5109 if ( frameName == TQString::fromLatin1( "_top" ) )
5110 {
5111 emit d->m_extension->openURLRequest( url, args );
5112 return;
5113 }
5114 else if ( frameName == TQString::fromLatin1( "_blank" ) )
5115 {
5116 emit d->m_extension->createNewWindow( url, args );
5117 return;
5118 }
5119 else if ( frameName == TQString::fromLatin1( "_parent" ) )
5120 {
5121 KParts::URLArgs newArgs( args );
5122 newArgs.frameName = TQString();
5123
5124 emit d->m_extension->openURLRequest( url, newArgs );
5125 return;
5126 }
5127 else if ( frameName != TQString::fromLatin1( "_self" ) )
5128 {
5129 tdehtml::ChildFrame *_frame = recursiveFrameRequest( callingHtmlPart, url, args );
5130
5131 if ( !_frame )
5132 {
5133 emit d->m_extension->openURLRequest( url, args );
5134 return;
5135 }
5136
5137 child = _frame;
5138 }
5139 }
5140
5141 if ( child && child->m_type != tdehtml::ChildFrame::Object ) {
5142 // Inform someone that we are about to show something else.
5143 child->m_bNotify = true;
5144 requestObject( child, url, args );
5145 } else if ( frameName== "_self" ) // this is for embedded objects (via <object>) which want to replace the current document
5146 {
5147 KParts::URLArgs newArgs( args );
5148 newArgs.frameName = TQString();
5149 emit d->m_extension->openURLRequest( url, newArgs );
5150 }
5151}
5152
5153void TDEHTMLPart::slotRequestFocus( KParts::ReadOnlyPart * )
5154{
5155 emit d->m_extension->requestFocus(this);
5156}
5157
5158tdehtml::ChildFrame *TDEHTMLPart::frame( const TQObject *obj )
5159{
5160 assert( obj->inherits( "KParts::ReadOnlyPart" ) );
5161 const KParts::ReadOnlyPart* const part = static_cast<const KParts::ReadOnlyPart *>( obj );
5162
5163 FrameIt it = d->m_frames.begin();
5164 const FrameIt end = d->m_frames.end();
5165 for (; it != end; ++it )
5166 if ( (KParts::ReadOnlyPart *)(*it)->m_part == part )
5167 return *it;
5168
5169 FrameIt oi = d->m_objects.begin();
5170 const FrameIt oiEnd = d->m_objects.end();
5171 for (; oi != oiEnd; ++oi )
5172 if ( (KParts::ReadOnlyPart *)(*oi)->m_part == part )
5173 return *oi;
5174
5175 return 0L;
5176}
5177
5178//#define DEBUG_FINDFRAME
5179
5180bool TDEHTMLPart::checkFrameAccess(TDEHTMLPart *callingHtmlPart)
5181{
5182 if (callingHtmlPart == this)
5183 return true; // trivial
5184
5185 if (htmlDocument().isNull()) {
5186#ifdef DEBUG_FINDFRAME
5187 kdDebug(6050) << "TDEHTMLPart::checkFrameAccess: Empty part " << this << " URL = " << m_url << endl;
5188#endif
5189 return false; // we are empty?
5190 }
5191
5192 // now compare the domains
5193 if (callingHtmlPart && !callingHtmlPart->htmlDocument().isNull() &&
5194 !htmlDocument().isNull()) {
5195 DOM::DOMString actDomain = callingHtmlPart->htmlDocument().domain();
5196 DOM::DOMString destDomain = htmlDocument().domain();
5197
5198#ifdef DEBUG_FINDFRAME
5199 kdDebug(6050) << "TDEHTMLPart::checkFrameAccess: actDomain = '" << actDomain.string() << "' destDomain = '" << destDomain.string() << "'" << endl;
5200#endif
5201
5202 if (actDomain == destDomain)
5203 return true;
5204 }
5205#ifdef DEBUG_FINDFRAME
5206 else
5207 {
5208 kdDebug(6050) << "TDEHTMLPart::checkFrameAccess: Unknown part/domain " << callingHtmlPart << " tries to access part " << this << endl;
5209 }
5210#endif
5211 return false;
5212}
5213
5214TDEHTMLPart *
5215TDEHTMLPart::findFrameParent( KParts::ReadOnlyPart *callingPart, const TQString &f, tdehtml::ChildFrame **childFrame )
5216{
5217#ifdef DEBUG_FINDFRAME
5218 kdDebug(6050) << "TDEHTMLPart::findFrameParent: this = " << this << " URL = " << m_url << " name = " << name() << " findFrameParent( " << f << " )" << endl;
5219#endif
5220 // Check access
5221 TDEHTMLPart* const callingHtmlPart = dynamic_cast<TDEHTMLPart *>(callingPart);
5222
5223 if (!checkFrameAccess(callingHtmlPart))
5224 return 0;
5225
5226 // match encoding used in KonqView::setViewName()
5227 if (!childFrame && !parentPart() && (TQString::fromLocal8Bit(name()) == f))
5228 return this;
5229
5230 FrameIt it = d->m_frames.find( f );
5231 const FrameIt end = d->m_frames.end();
5232 if ( it != end )
5233 {
5234#ifdef DEBUG_FINDFRAME
5235 kdDebug(6050) << "TDEHTMLPart::findFrameParent: FOUND!" << endl;
5236#endif
5237 if (childFrame)
5238 *childFrame = *it;
5239 return this;
5240 }
5241
5242 it = d->m_frames.begin();
5243 for (; it != end; ++it )
5244 {
5245 KParts::ReadOnlyPart* const p = (*it)->m_part;
5246 if ( p && p->inherits( "TDEHTMLPart" ))
5247 {
5248 TDEHTMLPart* const frameParent = static_cast<TDEHTMLPart*>(p)->findFrameParent(callingPart, f, childFrame);
5249 if (frameParent)
5250 return frameParent;
5251 }
5252 }
5253 return 0;
5254}
5255
5256
5257TDEHTMLPart *TDEHTMLPart::findFrame( const TQString &f )
5258{
5259 tdehtml::ChildFrame *childFrame;
5260 TDEHTMLPart *parentFrame = findFrameParent(this, f, &childFrame);
5261 if (parentFrame)
5262 {
5263 KParts::ReadOnlyPart *p = childFrame->m_part;
5264 if ( p && p->inherits( "TDEHTMLPart" ))
5265 return static_cast<TDEHTMLPart *>(p);
5266 }
5267 return 0;
5268}
5269
5270KParts::ReadOnlyPart *TDEHTMLPart::findFramePart(const TQString &f)
5271{
5272 tdehtml::ChildFrame *childFrame;
5273 return findFrameParent(this, f, &childFrame) ? static_cast<KParts::ReadOnlyPart *>(childFrame->m_part) : 0L;
5274}
5275
5276KParts::ReadOnlyPart *TDEHTMLPart::currentFrame() const
5277{
5278 KParts::ReadOnlyPart* part = (KParts::ReadOnlyPart*)(this);
5279 // Find active part in our frame manager, in case we are a frameset
5280 // and keep doing that (in case of nested framesets).
5281 // Just realized we could also do this recursively, calling part->currentFrame()...
5282 while ( part && part->inherits("TDEHTMLPart") &&
5283 static_cast<TDEHTMLPart *>(part)->d->m_frames.count() > 0 ) {
5284 TDEHTMLPart* frameset = static_cast<TDEHTMLPart *>(part);
5285 part = static_cast<KParts::ReadOnlyPart *>(frameset->partManager()->activePart());
5286 if ( !part ) return frameset;
5287 }
5288 return part;
5289}
5290
5291bool TDEHTMLPart::frameExists( const TQString &frameName )
5292{
5293 ConstFrameIt it = d->m_frames.find( frameName );
5294 if ( it == d->m_frames.end() )
5295 return false;
5296
5297 // WABA: We only return true if the child actually has a frame
5298 // set. Otherwise we might find our preloaded-selve.
5299 // This happens when we restore the frameset.
5300 return (!(*it)->m_frame.isNull());
5301}
5302
5303KJSProxy *TDEHTMLPart::framejScript(KParts::ReadOnlyPart *framePart)
5304{
5305 TDEHTMLPart* const kp = ::tqt_cast<TDEHTMLPart*>(framePart);
5306 if (kp)
5307 return kp->jScript();
5308
5309 FrameIt it = d->m_frames.begin();
5310 const FrameIt itEnd = d->m_frames.end();
5311
5312 for (; it != itEnd; ++it)
5313 if (framePart == (*it)->m_part) {
5314 if (!(*it)->m_jscript)
5315 createJScript(*it);
5316 return (*it)->m_jscript;
5317 }
5318 return 0L;
5319}
5320
5321TDEHTMLPart *TDEHTMLPart::parentPart()
5322{
5323 return ::tqt_cast<TDEHTMLPart *>( parent() );
5324}
5325
5326tdehtml::ChildFrame *TDEHTMLPart::recursiveFrameRequest( TDEHTMLPart *callingHtmlPart, const KURL &url,
5327 const KParts::URLArgs &args, bool callParent )
5328{
5329#ifdef DEBUG_FINDFRAME
5330 kdDebug( 6050 ) << "TDEHTMLPart::recursiveFrameRequest this = " << this << ", frame = " << args.frameName << ", url = " << url << endl;
5331#endif
5332 tdehtml::ChildFrame *childFrame;
5333 TDEHTMLPart *childPart = findFrameParent(callingHtmlPart, args.frameName, &childFrame);
5334 if (childPart)
5335 {
5336 if (childPart == this)
5337 return childFrame;
5338
5339 childPart->requestObject( childFrame, url, args );
5340 return 0;
5341 }
5342
5343 if ( parentPart() && callParent )
5344 {
5345 tdehtml::ChildFrame *res = parentPart()->recursiveFrameRequest( callingHtmlPart, url, args, callParent );
5346
5347 if ( res )
5348 parentPart()->requestObject( res, url, args );
5349 }
5350
5351 return 0L;
5352}
5353
5354#ifndef NDEBUG
5355static int s_saveStateIndentLevel = 0;
5356#endif
5357
5358void TDEHTMLPart::saveState( TQDataStream &stream )
5359{
5360#ifndef NDEBUG
5361 TQString indent = TQString().leftJustify( s_saveStateIndentLevel * 4, ' ' );
5362 const int indentLevel = s_saveStateIndentLevel++;
5363 kdDebug( 6050 ) << indent << "saveState this=" << this << " '" << name() << "' saving URL " << m_url.url() << endl;
5364#endif
5365
5366 stream << m_url << (TQ_INT32)d->m_view->contentsX() << (TQ_INT32)d->m_view->contentsY()
5367 << (TQ_INT32) d->m_view->contentsWidth() << (TQ_INT32) d->m_view->contentsHeight() << (TQ_INT32) d->m_view->marginWidth() << (TQ_INT32) d->m_view->marginHeight();
5368
5369 // save link cursor position
5370 int focusNodeNumber;
5371 if (!d->m_focusNodeRestored)
5372 focusNodeNumber = d->m_focusNodeNumber;
5373 else if (d->m_doc && d->m_doc->focusNode())
5374 focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
5375 else
5376 focusNodeNumber = -1;
5377 stream << focusNodeNumber;
5378
5379 // Save the doc's cache id.
5380 stream << d->m_cacheId;
5381
5382 // Save the state of the document (Most notably the state of any forms)
5383 TQStringList docState;
5384 if (d->m_doc)
5385 {
5386 docState = d->m_doc->docState();
5387 }
5388 stream << d->m_encoding << d->m_sheetUsed << docState;
5389
5390 stream << d->m_zoomFactor;
5391
5392 stream << d->m_httpHeaders;
5393 stream << d->m_pageServices;
5394 stream << d->m_pageReferrer;
5395
5396 // Save ssl data
5397 stream << d->m_ssl_in_use
5398 << d->m_ssl_peer_certificate
5399 << d->m_ssl_peer_chain
5400 << d->m_ssl_peer_ip
5401 << d->m_ssl_cipher
5402 << d->m_ssl_cipher_desc
5403 << d->m_ssl_cipher_version
5404 << d->m_ssl_cipher_used_bits
5405 << d->m_ssl_cipher_bits
5406 << d->m_ssl_cert_state
5407 << d->m_ssl_parent_ip
5408 << d->m_ssl_parent_cert;
5409
5410
5411 TQStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
5412 KURL::List frameURLLst;
5413 TQValueList<TQByteArray> frameStateBufferLst;
5414
5415 ConstFrameIt it = d->m_frames.begin();
5416 const ConstFrameIt end = d->m_frames.end();
5417 for (; it != end; ++it )
5418 {
5419 if ( !(*it)->m_part )
5420 continue;
5421
5422 frameNameLst << (*it)->m_name;
5423 frameServiceTypeLst << (*it)->m_serviceType;
5424 frameServiceNameLst << (*it)->m_serviceName;
5425 frameURLLst << (*it)->m_part->url();
5426
5427 TQByteArray state;
5428 TQDataStream frameStream( state, IO_WriteOnly );
5429
5430 if ( (*it)->m_extension )
5431 (*it)->m_extension->saveState( frameStream );
5432
5433 frameStateBufferLst << state;
5434 }
5435
5436 // Save frame data
5437 stream << (TQ_UINT32) frameNameLst.count();
5438 stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst;
5439#ifndef NDEBUG
5440 s_saveStateIndentLevel = indentLevel;
5441#endif
5442}
5443
5444void TDEHTMLPart::restoreState( TQDataStream &stream )
5445{
5446 KURL u;
5447 TQ_INT32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
5448 TQ_UINT32 frameCount;
5449 TQStringList frameNames, frameServiceTypes, docState, frameServiceNames;
5450 KURL::List frameURLs;
5451 TQValueList<TQByteArray> frameStateBuffers;
5452 TQValueList<int> fSizes;
5453 TQString encoding, sheetUsed;
5454 long old_cacheId = d->m_cacheId;
5455
5456 stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
5457
5458 d->m_view->setMarginWidth( mWidth );
5459 d->m_view->setMarginHeight( mHeight );
5460
5461 // restore link cursor position
5462 // nth node is active. value is set in checkCompleted()
5463 stream >> d->m_focusNodeNumber;
5464 d->m_focusNodeRestored = false;
5465
5466 stream >> d->m_cacheId;
5467
5468 stream >> encoding >> sheetUsed >> docState;
5469
5470 d->m_encoding = encoding;
5471 d->m_sheetUsed = sheetUsed;
5472
5473 int zoomFactor;
5474 stream >> zoomFactor;
5475 setZoomFactor(zoomFactor);
5476
5477 stream >> d->m_httpHeaders;
5478 stream >> d->m_pageServices;
5479 stream >> d->m_pageReferrer;
5480
5481 // Restore ssl data
5482 stream >> d->m_ssl_in_use
5483 >> d->m_ssl_peer_certificate
5484 >> d->m_ssl_peer_chain
5485 >> d->m_ssl_peer_ip
5486 >> d->m_ssl_cipher
5487 >> d->m_ssl_cipher_desc
5488 >> d->m_ssl_cipher_version
5489 >> d->m_ssl_cipher_used_bits
5490 >> d->m_ssl_cipher_bits
5491 >> d->m_ssl_cert_state
5492 >> d->m_ssl_parent_ip
5493 >> d->m_ssl_parent_cert;
5494
5495 setPageSecurity( d->m_ssl_in_use ? Encrypted : NotCrypted );
5496
5497 stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
5498 >> frameURLs >> frameStateBuffers;
5499
5500 d->m_bComplete = false;
5501 d->m_bLoadEventEmitted = false;
5502
5503// kdDebug( 6050 ) << "restoreState() docState.count() = " << docState.count() << endl;
5504// kdDebug( 6050 ) << "m_url " << m_url.url() << " <-> " << u.url() << endl;
5505// kdDebug( 6050 ) << "m_frames.count() " << d->m_frames.count() << " <-> " << frameCount << endl;
5506
5507 if (d->m_cacheId == old_cacheId)
5508 {
5509 // Partial restore
5510 d->m_redirectionTimer.stop();
5511
5512 FrameIt fIt = d->m_frames.begin();
5513 const FrameIt fEnd = d->m_frames.end();
5514
5515 for (; fIt != fEnd; ++fIt )
5516 (*fIt)->m_bCompleted = false;
5517
5518 fIt = d->m_frames.begin();
5519
5520 TQStringList::ConstIterator fNameIt = frameNames.begin();
5521 TQStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
5522 TQStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
5523 KURL::List::ConstIterator fURLIt = frameURLs.begin();
5524 TQValueList<TQByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
5525
5526 for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
5527 {
5528 tdehtml::ChildFrame* const child = *fIt;
5529
5530// kdDebug( 6050 ) << *fNameIt << " ---- " << *fServiceTypeIt << endl;
5531
5532 if ( child->m_name != *fNameIt || child->m_serviceType != *fServiceTypeIt )
5533 {
5534 child->m_bPreloaded = true;
5535 child->m_name = *fNameIt;
5536 child->m_serviceName = *fServiceNameIt;
5537 processObjectRequest( child, *fURLIt, *fServiceTypeIt );
5538 }
5539 if ( child->m_part )
5540 {
5541 child->m_bCompleted = false;
5542 if ( child->m_extension && !(*fBufferIt).isEmpty() )
5543 {
5544 TQDataStream frameStream( *fBufferIt, IO_ReadOnly );
5545 child->m_extension->restoreState( frameStream );
5546 }
5547 else
5548 child->m_part->openURL( *fURLIt );
5549 }
5550 }
5551
5552 KParts::URLArgs args( d->m_extension->urlArgs() );
5553 args.xOffset = xOffset;
5554 args.yOffset = yOffset;
5555 args.docState = docState;
5556 d->m_extension->setURLArgs( args );
5557
5558 d->m_view->resizeContents( wContents, hContents);
5559 d->m_view->setContentsPos( xOffset, yOffset );
5560
5561 m_url = u;
5562 }
5563 else
5564 {
5565 // Full restore.
5566 closeURL();
5567 // We must force a clear because we want to be sure to delete all
5568 // frames.
5569 d->m_bCleared = false;
5570 clear();
5571 d->m_encoding = encoding;
5572 d->m_sheetUsed = sheetUsed;
5573
5574 TQStringList::ConstIterator fNameIt = frameNames.begin();
5575 const TQStringList::ConstIterator fNameEnd = frameNames.end();
5576
5577 TQStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
5578 TQStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
5579 KURL::List::ConstIterator fURLIt = frameURLs.begin();
5580 TQValueList<TQByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
5581
5582 for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
5583 {
5584 tdehtml::ChildFrame* const newChild = new tdehtml::ChildFrame;
5585 newChild->m_bPreloaded = true;
5586 newChild->m_name = *fNameIt;
5587 newChild->m_serviceName = *fServiceNameIt;
5588
5589// kdDebug( 6050 ) << *fNameIt << " ---- " << *fServiceTypeIt << endl;
5590
5591 const FrameIt childFrame = d->m_frames.append( newChild );
5592
5593 processObjectRequest( *childFrame, *fURLIt, *fServiceTypeIt );
5594
5595 (*childFrame)->m_bPreloaded = true;
5596
5597 if ( (*childFrame)->m_part )
5598 {
5599 if ( (*childFrame)->m_extension ) {
5600 if ( (*childFrame)->m_extension && !(*fBufferIt).isEmpty() )
5601 {
5602 TQDataStream frameStream( *fBufferIt, IO_ReadOnly );
5603 (*childFrame)->m_extension->restoreState( frameStream );
5604 }
5605 else {
5606 (*childFrame)->m_part->openURL( *fURLIt );
5607 }
5608 }
5609 }
5610 }
5611
5612 KParts::URLArgs args( d->m_extension->urlArgs() );
5613 args.xOffset = xOffset;
5614 args.yOffset = yOffset;
5615 args.docState = docState;
5616
5617 d->m_extension->setURLArgs( args );
5618 if (!TDEHTMLPageCache::self()->isComplete(d->m_cacheId))
5619 {
5620 d->m_restored = true;
5621 openURL( u );
5622 d->m_restored = false;
5623 }
5624 else
5625 {
5626 restoreURL( u );
5627 }
5628 }
5629
5630}
5631
5632void TDEHTMLPart::show()
5633{
5634 if ( d->m_view )
5635 d->m_view->show();
5636}
5637
5638void TDEHTMLPart::hide()
5639{
5640 if ( d->m_view )
5641 d->m_view->hide();
5642}
5643
5644DOM::Node TDEHTMLPart::nodeUnderMouse() const
5645{
5646 return d->m_view->nodeUnderMouse();
5647}
5648
5649DOM::Node TDEHTMLPart::nonSharedNodeUnderMouse() const
5650{
5651 return d->m_view->nonSharedNodeUnderMouse();
5652}
5653
5654void TDEHTMLPart::emitSelectionChanged()
5655{
5656 emit d->m_extension->enableAction( "copy", hasSelection() );
5657 if ( d->m_findDialog )
5658 d->m_findDialog->setHasSelection( hasSelection() );
5659
5660 emit d->m_extension->selectionInfo( selectedText() );
5661 emit selectionChanged();
5662}
5663
5664int TDEHTMLPart::zoomFactor() const
5665{
5666 return d->m_zoomFactor;
5667}
5668
5669// ### make the list configurable ?
5670static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
5671static const int zoomSizeCount = (sizeof(zoomSizes) / sizeof(int));
5672static const int minZoom = 20;
5673static const int maxZoom = 300;
5674
5675// My idea of useful stepping ;-) (LS)
5676extern const int TDE_NO_EXPORT fastZoomSizes[] = { 20, 50, 75, 90, 100, 120, 150, 200, 300 };
5677extern const int TDE_NO_EXPORT fastZoomSizeCount = sizeof fastZoomSizes / sizeof fastZoomSizes[0];
5678
5679void TDEHTMLPart::slotIncZoom()
5680{
5681 zoomIn(zoomSizes, zoomSizeCount);
5682}
5683
5684void TDEHTMLPart::slotDecZoom()
5685{
5686 zoomOut(zoomSizes, zoomSizeCount);
5687}
5688
5689void TDEHTMLPart::slotIncZoomFast()
5690{
5691 zoomIn(fastZoomSizes, fastZoomSizeCount);
5692}
5693
5694void TDEHTMLPart::slotDecZoomFast()
5695{
5696 zoomOut(fastZoomSizes, fastZoomSizeCount);
5697}
5698
5699void TDEHTMLPart::zoomIn(const int stepping[], int count)
5700{
5701 int zoomFactor = d->m_zoomFactor;
5702
5703 if (zoomFactor < maxZoom) {
5704 // find the entry nearest to the given zoomsizes
5705 for (int i = 0; i < count; ++i)
5706 if (stepping[i] > zoomFactor) {
5707 zoomFactor = stepping[i];
5708 break;
5709 }
5710 setZoomFactor(zoomFactor);
5711 }
5712}
5713
5714void TDEHTMLPart::zoomOut(const int stepping[], int count)
5715{
5716 int zoomFactor = d->m_zoomFactor;
5717 if (zoomFactor > minZoom) {
5718 // find the entry nearest to the given zoomsizes
5719 for (int i = count-1; i >= 0; --i)
5720 if (stepping[i] < zoomFactor) {
5721 zoomFactor = stepping[i];
5722 break;
5723 }
5724 setZoomFactor(zoomFactor);
5725 }
5726}
5727
5728void TDEHTMLPart::setZoomFactor (int percent)
5729{
5730 if (percent < minZoom) percent = minZoom;
5731 if (percent > maxZoom) percent = maxZoom;
5732 if (d->m_zoomFactor == percent) return;
5733 d->m_zoomFactor = percent;
5734
5735 if(d->m_doc) {
5736 TQApplication::setOverrideCursor( TQt::waitCursor );
5737 if (d->m_doc->styleSelector())
5738 d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
5739 d->m_doc->recalcStyle( NodeImpl::Force );
5740 TQApplication::restoreOverrideCursor();
5741 }
5742
5743 ConstFrameIt it = d->m_frames.begin();
5744 const ConstFrameIt end = d->m_frames.end();
5745 for (; it != end; ++it )
5746 if ( !( *it )->m_part.isNull() && (*it)->m_part->inherits( "TDEHTMLPart" ) ) {
5747 KParts::ReadOnlyPart* const p = ( *it )->m_part;
5748 static_cast<TDEHTMLPart*>( p )->setZoomFactor(d->m_zoomFactor);
5749 }
5750
5751 if ( d->m_guiProfile == BrowserViewGUI ) {
5752 d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
5753 d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
5754 }
5755}
5756
5757void TDEHTMLPart::slotZoomView( int delta )
5758{
5759 if ( delta < 0 )
5760 slotIncZoom();
5761 else
5762 slotDecZoom();
5763}
5764
5765void TDEHTMLPart::setStatusBarText( const TQString& text, StatusBarPriority p)
5766{
5767 if (!d->m_statusMessagesEnabled)
5768 return;
5769
5770 d->m_statusBarText[p] = text;
5771
5772 // shift handling ?
5773 TQString tobe = d->m_statusBarText[BarHoverText];
5774 if (tobe.isEmpty())
5775 tobe = d->m_statusBarText[BarOverrideText];
5776 if (tobe.isEmpty()) {
5777 tobe = d->m_statusBarText[BarDefaultText];
5778 if (!tobe.isEmpty() && d->m_jobspeed)
5779 tobe += " ";
5780 if (d->m_jobspeed)
5781 tobe += i18n( "(%1/s)" ).arg( TDEIO::convertSize( d->m_jobspeed ) );
5782 }
5783 tobe = "<qt>"+tobe;
5784
5785 emit ReadOnlyPart::setStatusBarText(tobe);
5786}
5787
5788
5789void TDEHTMLPart::setJSStatusBarText( const TQString &text )
5790{
5791 setStatusBarText(text, BarOverrideText);
5792}
5793
5794void TDEHTMLPart::setJSDefaultStatusBarText( const TQString &text )
5795{
5796 setStatusBarText(text, BarDefaultText);
5797}
5798
5799TQString TDEHTMLPart::jsStatusBarText() const
5800{
5801 return d->m_statusBarText[BarOverrideText];
5802}
5803
5804TQString TDEHTMLPart::jsDefaultStatusBarText() const
5805{
5806 return d->m_statusBarText[BarDefaultText];
5807}
5808
5809TQString TDEHTMLPart::referrer() const
5810{
5811 return d->m_referrer;
5812}
5813
5814TQString TDEHTMLPart::pageReferrer() const
5815{
5816 KURL referrerURL = KURL( d->m_pageReferrer );
5817 if (referrerURL.isValid())
5818 {
5819 TQString protocol = referrerURL.protocol();
5820
5821 if ((protocol == "http") ||
5822 ((protocol == "https") && (m_url.protocol() == "https")))
5823 {
5824 referrerURL.setRef(TQString());
5825 referrerURL.setUser(TQString());
5826 referrerURL.setPass(TQString());
5827 return referrerURL.url();
5828 }
5829 }
5830
5831 return TQString();
5832}
5833
5834
5835TQString TDEHTMLPart::lastModified() const
5836{
5837 if ( d->m_lastModified.isEmpty() && m_url.isLocalFile() ) {
5838 // Local file: set last-modified from the file's mtime.
5839 // Done on demand to save time when this isn't needed - but can lead
5840 // to slightly wrong results if updating the file on disk w/o reloading.
5841 TQDateTime lastModif = TQFileInfo( m_url.path() ).lastModified();
5842 d->m_lastModified = lastModif.toString( TQt::LocalDate );
5843 }
5844 //kdDebug(6050) << "TDEHTMLPart::lastModified: " << d->m_lastModified << endl;
5845 return d->m_lastModified;
5846}
5847
5848void TDEHTMLPart::slotLoadImages()
5849{
5850 if (d->m_doc )
5851 d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
5852
5853 ConstFrameIt it = d->m_frames.begin();
5854 const ConstFrameIt end = d->m_frames.end();
5855 for (; it != end; ++it )
5856 if ( !( *it )->m_part.isNull() && (*it)->m_part->inherits( "TDEHTMLPart" ) ) {
5857 KParts::ReadOnlyPart* const p = ( *it )->m_part;
5858 static_cast<TDEHTMLPart*>( p )->slotLoadImages();
5859 }
5860}
5861
5862void TDEHTMLPart::reparseConfiguration()
5863{
5864 TDEHTMLSettings *settings = TDEHTMLFactory::defaultHTMLSettings();
5865 settings->init();
5866
5867 setAutoloadImages( settings->autoLoadImages() );
5868 if (d->m_doc)
5869 d->m_doc->docLoader()->setShowAnimations( settings->showAnimations() );
5870
5871 d->m_bOpenMiddleClick = settings->isOpenMiddleClickEnabled();
5872 d->m_bBackRightClick = settings->isBackRightClickEnabled();
5873 d->m_bJScriptEnabled = settings->isJavaScriptEnabled(m_url.host());
5874 setDebugScript( settings->isJavaScriptDebugEnabled() );
5875 d->m_bJavaEnabled = settings->isJavaEnabled(m_url.host());
5876 d->m_bPluginsEnabled = settings->isPluginsEnabled(m_url.host());
5877 d->m_metaRefreshEnabled = settings->isAutoDelayedActionsEnabled ();
5878
5879 delete d->m_settings;
5880 d->m_settings = new TDEHTMLSettings(*TDEHTMLFactory::defaultHTMLSettings());
5881
5882 TQApplication::setOverrideCursor( TQt::waitCursor );
5883 tdehtml::CSSStyleSelector::reparseConfiguration();
5884 if(d->m_doc) d->m_doc->updateStyleSelector();
5885 TQApplication::restoreOverrideCursor();
5886
5887 if (TDEHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled())
5888 runAdFilter();
5889}
5890
5891TQStringList TDEHTMLPart::frameNames() const
5892{
5893 TQStringList res;
5894
5895 ConstFrameIt it = d->m_frames.begin();
5896 const ConstFrameIt end = d->m_frames.end();
5897 for (; it != end; ++it )
5898 if (!(*it)->m_bPreloaded)
5899 res += (*it)->m_name;
5900
5901 return res;
5902}
5903
5904TQPtrList<KParts::ReadOnlyPart> TDEHTMLPart::frames() const
5905{
5906 TQPtrList<KParts::ReadOnlyPart> res;
5907
5908 ConstFrameIt it = d->m_frames.begin();
5909 const ConstFrameIt end = d->m_frames.end();
5910 for (; it != end; ++it )
5911 if (!(*it)->m_bPreloaded)
5912 res.append( (*it)->m_part );
5913
5914 return res;
5915}
5916
5917bool TDEHTMLPart::openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs )
5918{
5919 kdDebug( 6050 ) << this << "TDEHTMLPart::openURLInFrame " << url << endl;
5920 FrameIt it = d->m_frames.find( urlArgs.frameName );
5921
5922 if ( it == d->m_frames.end() )
5923 return false;
5924
5925 // Inform someone that we are about to show something else.
5926 if ( !urlArgs.lockHistory() )
5927 emit d->m_extension->openURLNotify();
5928
5929 requestObject( *it, url, urlArgs );
5930
5931 return true;
5932}
5933
5934void TDEHTMLPart::setDNDEnabled( bool b )
5935{
5936 d->m_bDnd = b;
5937}
5938
5939bool TDEHTMLPart::dndEnabled() const
5940{
5941 return d->m_bDnd;
5942}
5943
5944void TDEHTMLPart::customEvent( TQCustomEvent *event )
5945{
5946 if ( tdehtml::MousePressEvent::test( event ) )
5947 {
5948 tdehtmlMousePressEvent( static_cast<tdehtml::MousePressEvent *>( event ) );
5949 return;
5950 }
5951
5952 if ( tdehtml::MouseDoubleClickEvent::test( event ) )
5953 {
5954 tdehtmlMouseDoubleClickEvent( static_cast<tdehtml::MouseDoubleClickEvent *>( event ) );
5955 return;
5956 }
5957
5958 if ( tdehtml::MouseMoveEvent::test( event ) )
5959 {
5960 tdehtmlMouseMoveEvent( static_cast<tdehtml::MouseMoveEvent *>( event ) );
5961 return;
5962 }
5963
5964 if ( tdehtml::MouseReleaseEvent::test( event ) )
5965 {
5966 tdehtmlMouseReleaseEvent( static_cast<tdehtml::MouseReleaseEvent *>( event ) );
5967 return;
5968 }
5969
5970 if ( tdehtml::DrawContentsEvent::test( event ) )
5971 {
5972 tdehtmlDrawContentsEvent( static_cast<tdehtml::DrawContentsEvent *>( event ) );
5973 return;
5974 }
5975
5976 KParts::ReadOnlyPart::customEvent( event );
5977}
5978
5984static bool firstRunAt(tdehtml::RenderObject *renderNode, int y, NodeImpl *&startNode, long &startOffset)
5985{
5986 for (tdehtml::RenderObject *n = renderNode; n; n = n->nextSibling()) {
5987 if (n->isText()) {
5988 tdehtml::RenderText* const textRenderer = static_cast<tdehtml::RenderText *>(n);
5989 const tdehtml::InlineTextBoxArray &runs = textRenderer->inlineTextBoxes();
5990 const unsigned lim = runs.count();
5991 for (unsigned i = 0; i != lim; ++i) {
5992 if (runs[i]->m_y == y && textRenderer->element()) {
5993 startNode = textRenderer->element();
5994 startOffset = runs[i]->m_start;
5995 return true;
5996 }
5997 }
5998 }
5999
6000 if (firstRunAt(n->firstChild(), y, startNode, startOffset)) {
6001 return true;
6002 }
6003 }
6004
6005 return false;
6006}
6007
6013static bool lastRunAt(tdehtml::RenderObject *renderNode, int y, NodeImpl *&endNode, long &endOffset)
6014{
6015 tdehtml::RenderObject *n = renderNode;
6016 if (!n) {
6017 return false;
6018 }
6019 tdehtml::RenderObject *next;
6020 while ((next = n->nextSibling())) {
6021 n = next;
6022 }
6023
6024 while (1) {
6025 if (lastRunAt(n->firstChild(), y, endNode, endOffset)) {
6026 return true;
6027 }
6028
6029 if (n->isText()) {
6030 tdehtml::RenderText* const textRenderer = static_cast<tdehtml::RenderText *>(n);
6031 const tdehtml::InlineTextBoxArray &runs = textRenderer->inlineTextBoxes();
6032 for (int i = (int)runs.count()-1; i >= 0; --i) {
6033 if (runs[i]->m_y == y && textRenderer->element()) {
6034 endNode = textRenderer->element();
6035 endOffset = runs[i]->m_start + runs[i]->m_len;
6036 return true;
6037 }
6038 }
6039 }
6040
6041 if (n == renderNode) {
6042 return false;
6043 }
6044
6045 n = n->previousSibling();
6046 }
6047}
6048
6049void TDEHTMLPart::tdehtmlMousePressEvent( tdehtml::MousePressEvent *event )
6050{
6051 DOM::DOMString url = event->url();
6052 TQMouseEvent *_mouse = event->qmouseEvent();
6053 DOM::Node innerNode = event->innerNode();
6054 d->m_mousePressNode = innerNode;
6055
6056 d->m_dragStartPos = _mouse->pos();
6057
6058 if ( !event->url().isNull() ) {
6059 d->m_strSelectedURL = event->url().string();
6060 d->m_strSelectedURLTarget = event->target().string();
6061 }
6062 else
6063 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
6064
6065 if ( _mouse->button() == TQt::LeftButton ||
6066 _mouse->button() == TQt::MidButton )
6067 {
6068 d->m_bMousePressed = true;
6069
6070#ifndef TDEHTML_NO_SELECTION
6071 if ( _mouse->button() == TQt::LeftButton )
6072 {
6073 if ( (!d->m_strSelectedURL.isNull() && !isEditable())
6074 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) )
6075 return;
6076 if ( !innerNode.isNull() && innerNode.handle()->renderer()) {
6077 int offset = 0;
6078 DOM::NodeImpl* node = 0;
6079 tdehtml::RenderObject::SelPointState state;
6080 innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
6081 event->absX()-innerNode.handle()->renderer()->xPos(),
6082 event->absY()-innerNode.handle()->renderer()->yPos(), node, offset, state );
6083 d->m_extendMode = d->ExtendByChar;
6084#ifdef TDEHTML_NO_CARET
6085 d->m_selectionStart = node;
6086 d->m_startOffset = offset;
6087 //if ( node )
6088 // kdDebug(6005) << "TDEHTMLPart::tdehtmlMousePressEvent selectionStart=" << d->m_selectionStart.handle()->renderer()
6089 // << " offset=" << d->m_startOffset << endl;
6090 //else
6091 // kdDebug(6005) << "TDEHTML::tdehtmlMousePressEvent selectionStart=(nil)" << endl;
6092 d->m_selectionEnd = d->m_selectionStart;
6093 d->m_endOffset = d->m_startOffset;
6094 d->m_doc->clearSelection();
6095#else // TDEHTML_NO_CARET
6096 d->m_view->moveCaretTo(node, offset, (_mouse->state() & ShiftButton) == 0);
6097#endif // TDEHTML_NO_CARET
6098 d->m_initialNode = d->m_selectionStart;
6099 d->m_initialOffset = d->m_startOffset;
6100// kdDebug(6000) << "press: initOfs " << d->m_initialOffset << endl;
6101 }
6102 else
6103 {
6104#ifndef TDEHTML_NO_CARET
6105 // simply leave it. Is this a good idea?
6106#else
6107 d->m_selectionStart = DOM::Node();
6108 d->m_selectionEnd = DOM::Node();
6109#endif
6110 }
6111 emitSelectionChanged();
6112 startAutoScroll();
6113 }
6114#else
6115 d->m_dragLastPos = _mouse->globalPos();
6116#endif
6117 }
6118
6119 if ( _mouse->button() == TQt::RightButton && parentPart() != 0 && d->m_bBackRightClick )
6120 {
6121 d->m_bRightMousePressed = true;
6122 } else if ( _mouse->button() == TQt::RightButton )
6123 {
6124 popupMenu( d->m_strSelectedURL );
6125 // might be deleted, don't touch "this"
6126 }
6127}
6128
6129void TDEHTMLPart::tdehtmlMouseDoubleClickEvent( tdehtml::MouseDoubleClickEvent *event )
6130{
6131 TQMouseEvent *_mouse = event->qmouseEvent();
6132 if ( _mouse->button() == TQt::LeftButton )
6133 {
6134 d->m_bMousePressed = true;
6135 DOM::Node innerNode = event->innerNode();
6136 // Find selectionStart again, tdehtmlMouseReleaseEvent lost it
6137 if ( !innerNode.isNull() && innerNode.handle()->renderer()) {
6138 int offset = 0;
6139 DOM::NodeImpl* node = 0;
6140 tdehtml::RenderObject::SelPointState state;
6141 innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
6142 event->absX()-innerNode.handle()->renderer()->xPos(),
6143 event->absY()-innerNode.handle()->renderer()->yPos(), node, offset, state);
6144
6145 //kdDebug() << k_funcinfo << "checkSelectionPoint returned node=" << node << " offset=" << offset << endl;
6146
6147 if ( node && node->renderer() )
6148 {
6149 // Extend selection to a complete word (double-click) or line (triple-click)
6150 bool selectLine = (event->clickCount() == 3);
6151 d->m_extendMode = selectLine ? d->ExtendByLine : d->ExtendByWord;
6152
6153 // Extend existing selection if Shift was pressed
6154 if (_mouse->state() & ShiftButton) {
6155 d->caretNode() = node;
6156 d->caretOffset() = offset;
6157 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
6158 d->m_selectionStart.handle(), d->m_startOffset,
6159 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
6160 d->m_initialNode = d->m_extendAtEnd ? d->m_selectionStart : d->m_selectionEnd;
6161 d->m_initialOffset = d->m_extendAtEnd ? d->m_startOffset : d->m_endOffset;
6162 } else {
6163 d->m_selectionStart = d->m_selectionEnd = node;
6164 d->m_startOffset = d->m_endOffset = offset;
6165 d->m_startBeforeEnd = true;
6166 d->m_initialNode = node;
6167 d->m_initialOffset = offset;
6168 }
6169// kdDebug(6000) << "dblclk: initOfs " << d->m_initialOffset << endl;
6170
6171 // Extend the start
6172 extendSelection( d->m_selectionStart.handle(), d->m_startOffset, d->m_selectionStart, d->m_startOffset, !d->m_startBeforeEnd, selectLine );
6173 // Extend the end
6174 extendSelection( d->m_selectionEnd.handle(), d->m_endOffset, d->m_selectionEnd, d->m_endOffset, d->m_startBeforeEnd, selectLine );
6175
6176 //kdDebug() << d->m_selectionStart.handle() << " " << d->m_startOffset << " - " <<
6177 // d->m_selectionEnd.handle() << " " << d->m_endOffset << endl;
6178
6179 emitSelectionChanged();
6180 d->m_doc
6181 ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
6182 d->m_selectionEnd.handle(),d->m_endOffset);
6183#ifndef TDEHTML_NO_CARET
6184 bool v = d->m_view->placeCaret();
6185 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
6186#endif
6187 startAutoScroll();
6188 }
6189 }
6190 }
6191}
6192
6193void TDEHTMLPart::extendSelection( DOM::NodeImpl* node, long offset, DOM::Node& selectionNode, long& selectionOffset, bool right, bool selectLines )
6194{
6195 tdehtml::RenderObject* obj = node->renderer();
6196
6197 if (obj->isText() && selectLines) {
6198 int pos;
6199 tdehtml::RenderText *renderer = static_cast<tdehtml::RenderText *>(obj);
6200 tdehtml::InlineTextBox *run = renderer->findInlineTextBox( offset, pos );
6201 DOMString t = node->nodeValue();
6202 DOM::NodeImpl* selNode = 0;
6203 long selOfs = 0;
6204
6205 if (!run)
6206 return;
6207
6208 int selectionPointY = run->m_y;
6209
6210 // Go up to first non-inline element.
6211 tdehtml::RenderObject *renderNode = renderer;
6212 while (renderNode && renderNode->isInline())
6213 renderNode = renderNode->parent();
6214
6215 renderNode = renderNode->firstChild();
6216
6217 if (right) {
6218 // Look for all the last child in the block that is on the same line
6219 // as the selection point.
6220 if (!lastRunAt (renderNode, selectionPointY, selNode, selOfs))
6221 return;
6222 } else {
6223 // Look for all the first child in the block that is on the same line
6224 // as the selection point.
6225 if (!firstRunAt (renderNode, selectionPointY, selNode, selOfs))
6226 return;
6227 }
6228
6229 selectionNode = selNode;
6230 selectionOffset = selOfs;
6231 return;
6232 }
6233
6234 TQString str;
6235 int len = 0;
6236 if ( obj->isText() ) { // can be false e.g. when double-clicking on a disabled submit button
6237 str = static_cast<tdehtml::RenderText *>(obj)->data().string();
6238 len = str.length();
6239 }
6240 //kdDebug() << "extendSelection right=" << right << " offset=" << offset << " len=" << len << " Starting at obj=" << obj << endl;
6241 TQChar ch;
6242 do {
6243 // Last char was ok, point to it
6244 if ( node ) {
6245 selectionNode = node;
6246 selectionOffset = offset;
6247 }
6248
6249 // Get another char
6250 while ( obj && ( (right && offset >= len-1) || (!right && offset <= 0) ) )
6251 {
6252 obj = right ? obj->objectBelow() : obj->objectAbove();
6253 //kdDebug() << "obj=" << obj << endl;
6254 if ( obj ) {
6255 //kdDebug() << "isText=" << obj->isText() << endl;
6256 str = TQString();
6257 if ( obj->isText() )
6258 str = static_cast<tdehtml::RenderText *>(obj)->data().string();
6259 else if ( obj->isBR() )
6260 str = '\n';
6261 else if ( !obj->isInline() ) {
6262 obj = 0L; // parag limit -> done
6263 break;
6264 }
6265 len = str.length();
6266 //kdDebug() << "str=" << str << " length=" << len << endl;
6267 // set offset - note that the first thing will be a ++ or -- on it.
6268 if ( right )
6269 offset = -1;
6270 else
6271 offset = len;
6272 }
6273 }
6274 if ( !obj ) // end of parag or document
6275 break;
6276 node = obj->element();
6277 if ( right )
6278 {
6279 Q_ASSERT( offset < len-1 );
6280 ++offset;
6281 }
6282 else
6283 {
6284 Q_ASSERT( offset > 0 );
6285 --offset;
6286 }
6287
6288 // Test that char
6289 ch = str[ (int)offset ];
6290 //kdDebug() << " offset=" << offset << " ch=" << TQString(ch) << endl;
6291 } while ( !ch.isSpace() && !ch.isPunct() );
6292
6293 // make offset point after last char
6294 if (right) ++selectionOffset;
6295}
6296
6297#ifndef TDEHTML_NO_SELECTION
6298void TDEHTMLPart::extendSelectionTo(int x, int y, int absX, int absY, const DOM::Node &innerNode)
6299{
6300 int offset;
6301 //kdDebug(6000) << "TDEHTMLPart::tdehtmlMouseMoveEvent x=" << event->x() << " y=" << event->y() << endl;
6302 DOM::NodeImpl* node=0;
6303 tdehtml::RenderObject::SelPointState state;
6304 innerNode.handle()->renderer()->checkSelectionPoint( x, y,
6305 absX-innerNode.handle()->renderer()->xPos(),
6306 absY-innerNode.handle()->renderer()->yPos(), node, offset, state);
6307 if (!node || !node->renderer()) return;
6308
6309 // Words at the beginning/end of line cannot be deselected in
6310 // ExtendByWord mode. Therefore, do not enforce it if the selection
6311 // point does not match the node under the mouse cursor.
6312 bool withinNode = innerNode == node;
6313
6314 // we have to get to know if end is before start or not...
6315 // shouldn't be null but it can happen with dynamic updating of nodes
6316 if (d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() ||
6317 d->m_initialNode.isNull() ||
6318 !d->m_selectionStart.handle()->renderer() ||
6319 !d->m_selectionEnd.handle()->renderer()) return;
6320
6321 if (d->m_extendMode != d->ExtendByChar) {
6322 // check whether we should extend at the front, or at the back
6323 bool caretBeforeInit = RangeImpl::compareBoundaryPoints(
6324 d->caretNode().handle(), d->caretOffset(),
6325 d->m_initialNode.handle(), d->m_initialOffset) <= 0;
6326 bool nodeBeforeInit = RangeImpl::compareBoundaryPoints(node, offset,
6327 d->m_initialNode.handle(), d->m_initialOffset) <= 0;
6328 // have to fix up start to point to the original end
6329 if (caretBeforeInit != nodeBeforeInit) {
6330// kdDebug(6000) << "extto cbi: " << caretBeforeInit << " startBefEnd " << d->m_startBeforeEnd << " extAtEnd " << d->m_extendAtEnd << " (" << d->m_startOffset << ") - (" << d->m_endOffset << ")" << " initOfs " << d->m_initialOffset << endl;
6331 extendSelection(d->m_initialNode.handle(), d->m_initialOffset,
6332 d->m_extendAtEnd ? d->m_selectionStart : d->m_selectionEnd,
6333 d->m_extendAtEnd ? d->m_startOffset : d->m_endOffset,
6334 nodeBeforeInit, d->m_extendMode == d->ExtendByLine);
6335 }
6336 }
6337
6338 d->caretNode() = node;
6339 d->caretOffset() = offset;
6340 //kdDebug( 6000 ) << "setting end of selection to " << d->m_selectionEnd.handle() << "/" << d->m_endOffset << endl;
6341
6342 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
6343 d->m_selectionStart.handle(), d->m_startOffset,
6344 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
6345
6346 if ( !d->m_selectionStart.isNull() && !d->m_selectionEnd.isNull() )
6347 {
6348// kdDebug(6000) << "extto: startBefEnd " << d->m_startBeforeEnd << " extAtEnd " << d->m_extendAtEnd << " (" << d->m_startOffset << ") - (" << d->m_endOffset << ")" << " initOfs " << d->m_initialOffset << endl;
6349 if (d->m_extendMode != d->ExtendByChar && withinNode)
6350 extendSelection( node, offset, d->caretNode(), d->caretOffset(), d->m_startBeforeEnd ^ !d->m_extendAtEnd, d->m_extendMode == d->ExtendByLine );
6351
6352 if (d->m_selectionEnd == d->m_selectionStart && d->m_endOffset < d->m_startOffset)
6353 d->m_doc
6354 ->setSelection(d->m_selectionStart.handle(),d->m_endOffset,
6355 d->m_selectionEnd.handle(),d->m_startOffset);
6356 else if (d->m_startBeforeEnd)
6357 d->m_doc
6358 ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
6359 d->m_selectionEnd.handle(),d->m_endOffset);
6360 else
6361 d->m_doc
6362 ->setSelection(d->m_selectionEnd.handle(),d->m_endOffset,
6363 d->m_selectionStart.handle(),d->m_startOffset);
6364 }
6365#ifndef TDEHTML_NO_CARET
6366 d->m_view->placeCaret();
6367#endif
6368}
6369
6370bool TDEHTMLPart::isExtendingSelection() const
6371{
6372 // This is it, the whole detection. tdehtmlMousePressEvent only sets this
6373 // on LMB or MMB, but never on RMB. As text selection doesn't work for MMB,
6374 // it's sufficient to only rely on this flag to detect selection extension.
6375 return d->m_bMousePressed;
6376}
6377#endif // TDEHTML_NO_SELECTION
6378
6379void TDEHTMLPart::tdehtmlMouseMoveEvent( tdehtml::MouseMoveEvent *event )
6380{
6381 TQMouseEvent *_mouse = event->qmouseEvent();
6382
6383 if( d->m_bRightMousePressed && parentPart() != 0 && d->m_bBackRightClick )
6384 {
6385 popupMenu( d->m_strSelectedURL );
6386 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
6387 d->m_bRightMousePressed = false;
6388 }
6389
6390 DOM::DOMString url = event->url();
6391 DOM::DOMString target = event->target();
6392 DOM::Node innerNode = event->innerNode();
6393
6394#ifndef TQT_NO_DRAGANDDROP
6395 if( d->m_bDnd && d->m_bMousePressed &&
6396 ( (!d->m_strSelectedURL.isEmpty() && !isEditable())
6397 || (!d->m_mousePressNode.isNull() && d->m_mousePressNode.elementId() == ID_IMG) ) ) {
6398 if ( ( d->m_dragStartPos - _mouse->pos() ).manhattanLength() <= TDEGlobalSettings::dndEventDelay() )
6399 return;
6400
6401 TQPixmap pix;
6402 HTMLImageElementImpl *img = 0L;
6403 TQDragObject *drag = 0;
6404 KURL u;
6405
6406 // tqDebug("****************** Event URL: %s", url.string().latin1());
6407 // tqDebug("****************** Event Target: %s", target.string().latin1());
6408
6409 // Normal image...
6410 if ( url.length() == 0 && innerNode.handle() && innerNode.handle()->id() == ID_IMG )
6411 {
6412 img = static_cast<HTMLImageElementImpl *>(innerNode.handle());
6413 u = KURL( completeURL( tdehtml::parseURL(img->getAttribute(ATTR_SRC)).string() ) );
6414 pix = KMimeType::mimeType("image/png")->pixmap(TDEIcon::Desktop);
6415 }
6416 else
6417 {
6418 // Text or image link...
6419 u = completeURL( d->m_strSelectedURL );
6420 pix = KMimeType::pixmapForURL(u, 0, TDEIcon::Desktop, TDEIcon::SizeMedium);
6421 }
6422
6423 u.setPass(TQString());
6424
6425 KURLDrag* urlDrag = new KURLDrag( u, img ? 0 : d->m_view->viewport() );
6426 if ( !d->m_referrer.isEmpty() )
6427 urlDrag->metaData()["referrer"] = d->m_referrer;
6428
6429 if( img && img->complete()) {
6430 KMultipleDrag *mdrag = new KMultipleDrag( d->m_view->viewport() );
6431 mdrag->addDragObject( new TQImageDrag( img->currentImage(), 0L ) );
6432 mdrag->addDragObject( urlDrag );
6433 drag = mdrag;
6434 }
6435 else
6436 drag = urlDrag;
6437
6438 if ( !pix.isNull() )
6439 drag->setPixmap( pix );
6440
6441 stopAutoScroll();
6442 if(drag)
6443 drag->drag();
6444
6445 // when we finish our drag, we need to undo our mouse press
6446 d->m_bMousePressed = false;
6447 d->m_strSelectedURL = d->m_strSelectedURLTarget = TQString();
6448 return;
6449 }
6450#endif
6451
6452 // Not clicked -> mouse over stuff
6453 if ( !d->m_bMousePressed )
6454 {
6455 // The mouse is over something
6456 if ( url.length() )
6457 {
6458 bool shiftPressed = ( _mouse->state() & ShiftButton );
6459
6460 // Image map
6461 if ( !innerNode.isNull() && innerNode.elementId() == ID_IMG )
6462 {
6463 HTMLImageElementImpl *i = static_cast<HTMLImageElementImpl *>(innerNode.handle());
6464 if ( i && i->isServerMap() )
6465 {
6466 tdehtml::RenderObject *r = i->renderer();
6467 if(r)
6468 {
6469 int absx, absy, vx, vy;
6470 r->absolutePosition(absx, absy);
6471 view()->contentsToViewport( absx, absy, vx, vy );
6472
6473 int x(_mouse->x() - vx), y(_mouse->y() - vy);
6474
6475 d->m_overURL = url.string() + TQString("?%1,%2").arg(x).arg(y);
6476 d->m_overURLTarget = target.string();
6477 overURL( d->m_overURL, target.string(), shiftPressed );
6478 return;
6479 }
6480 }
6481 }
6482
6483 // normal link
6484 if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
6485 {
6486 d->m_overURL = url.string();
6487 d->m_overURLTarget = target.string();
6488 overURL( d->m_overURL, target.string(), shiftPressed );
6489 }
6490 }
6491 else // Not over a link...
6492 {
6493 // reset to "default statusbar text"
6494 resetHoverText();
6495 }
6496 }
6497 else {
6498#ifndef TDEHTML_NO_SELECTION
6499 // selection stuff
6500 if( d->m_bMousePressed && innerNode.handle() && innerNode.handle()->renderer() &&
6501 ( (_mouse->state() & TQt::LeftButton) != 0 )) {
6502 extendSelectionTo(event->x(), event->y(),
6503 event->absX(), event->absY(), innerNode);
6504#else
6505 if ( d->m_doc && d->m_view ) {
6506 TQPoint diff( _mouse->globalPos() - d->m_dragLastPos );
6507
6508 if ( abs( diff.x() ) > 64 || abs( diff.y() ) > 64 ) {
6509 d->m_view->scrollBy( -diff.x(), -diff.y() );
6510 d->m_dragLastPos = _mouse->globalPos();
6511 }
6512#endif
6513 }
6514 }
6515
6516}
6517
6518void TDEHTMLPart::tdehtmlMouseReleaseEvent( tdehtml::MouseReleaseEvent *event )
6519{
6520 DOM::Node innerNode = event->innerNode();
6521 d->m_mousePressNode = DOM::Node();
6522
6523 if ( d->m_bMousePressed ) {
6524 setStatusBarText(TQString(), BarHoverText);
6525 stopAutoScroll();
6526 }
6527
6528 // Used to prevent mouseMoveEvent from initiating a drag before
6529 // the mouse is pressed again.
6530 d->m_bMousePressed = false;
6531
6532 TQMouseEvent *_mouse = event->qmouseEvent();
6533 if ( _mouse->button() == TQt::RightButton && parentPart() != 0 && d->m_bBackRightClick )
6534 {
6535 d->m_bRightMousePressed = false;
6536 KParts::BrowserInterface *tmp_iface = d->m_extension->browserInterface();
6537 if( tmp_iface ) {
6538 tmp_iface->callMethod( "goHistory(int)", -1 );
6539 }
6540 }
6541#ifndef TQT_NO_CLIPBOARD
6542 if ((d->m_guiProfile == BrowserViewGUI) && (_mouse->button() == TQt::MidButton) && (event->url().isNull())) {
6543 kdDebug( 6050 ) << "TDEHTMLPart::tdehtmlMouseReleaseEvent() MMB shouldOpen="
6544 << d->m_bOpenMiddleClick << endl;
6545
6546 if (d->m_bOpenMiddleClick) {
6547 TDEHTMLPart *p = this;
6548 while (p->parentPart()) p = p->parentPart();
6549 p->d->m_extension->pasteRequest();
6550 }
6551 }
6552#endif
6553
6554#ifndef TDEHTML_NO_SELECTION
6555 // delete selection in case start and end position are at the same point
6556 if(d->m_selectionStart == d->m_selectionEnd && d->m_startOffset == d->m_endOffset) {
6557#ifndef TDEHTML_NO_CARET
6558 d->m_extendAtEnd = true;
6559#else
6560 d->m_selectionStart = 0;
6561 d->m_selectionEnd = 0;
6562 d->m_startOffset = 0;
6563 d->m_endOffset = 0;
6564#endif
6565 emitSelectionChanged();
6566 } else {
6567 // we have to get to know if end is before start or not...
6568// kdDebug(6000) << "rel: startBefEnd " << d->m_startBeforeEnd << " extAtEnd " << d->m_extendAtEnd << " (" << d->m_startOffset << ") - (" << d->m_endOffset << ")" << endl;
6569 DOM::Node n = d->m_selectionStart;
6570 d->m_startBeforeEnd = false;
6571 if( d->m_selectionStart == d->m_selectionEnd ) {
6572 if( d->m_startOffset < d->m_endOffset )
6573 d->m_startBeforeEnd = true;
6574 } else {
6575#if 0
6576 while(!n.isNull()) {
6577 if(n == d->m_selectionEnd) {
6578 d->m_startBeforeEnd = true;
6579 break;
6580 }
6581 DOM::Node next = n.firstChild();
6582 if(next.isNull()) next = n.nextSibling();
6583 while( next.isNull() && !n.parentNode().isNull() ) {
6584 n = n.parentNode();
6585 next = n.nextSibling();
6586 }
6587 n = next;
6588 }
6589#else
6590 // shouldn't be null but it can happen with dynamic updating of nodes
6591 if (d->m_selectionStart.isNull() || d->m_selectionEnd.isNull() ||
6592 !d->m_selectionStart.handle()->renderer() ||
6593 !d->m_selectionEnd.handle()->renderer()) return;
6594 d->m_startBeforeEnd = RangeImpl::compareBoundaryPoints(
6595 d->m_selectionStart.handle(), d->m_startOffset,
6596 d->m_selectionEnd.handle(), d->m_endOffset) <= 0;
6597#endif
6598 }
6599 if(!d->m_startBeforeEnd)
6600 {
6601 DOM::Node tmpNode = d->m_selectionStart;
6602 int tmpOffset = d->m_startOffset;
6603 d->m_selectionStart = d->m_selectionEnd;
6604 d->m_startOffset = d->m_endOffset;
6605 d->m_selectionEnd = tmpNode;
6606 d->m_endOffset = tmpOffset;
6607 d->m_startBeforeEnd = true;
6608 d->m_extendAtEnd = !d->m_extendAtEnd;
6609 }
6610#ifndef TDEHTML_NO_CARET
6611 bool v = d->m_view->placeCaret();
6612 emitCaretPositionChanged(v ? d->caretNode() : 0, d->caretOffset());
6613#endif
6614 // get selected text and paste to the clipboard
6615#ifndef TQT_NO_CLIPBOARD
6616 TQString text = selectedText();
6617 text.replace(TQChar(0xa0), ' ');
6618 disconnect( tdeApp->clipboard(), TQ_SIGNAL( selectionChanged()), this, TQ_SLOT( slotClearSelection()));
6619 tdeApp->clipboard()->setText(text,TQClipboard::Selection);
6620 connect( tdeApp->clipboard(), TQ_SIGNAL( selectionChanged()), TQ_SLOT( slotClearSelection()));
6621#endif
6622 //kdDebug( 6000 ) << "selectedText = " << text << endl;
6623 emitSelectionChanged();
6624//kdDebug(6000) << "rel2: startBefEnd " << d->m_startBeforeEnd << " extAtEnd " << d->m_extendAtEnd << " (" << d->m_startOffset << ") - (" << d->m_endOffset << "), caretOfs " << d->caretOffset() << endl;
6625 }
6626#endif
6627 d->m_initialNode = 0; // don't hold nodes longer than necessary
6628 d->m_initialOffset = 0;
6629
6630}
6631
6632void TDEHTMLPart::tdehtmlDrawContentsEvent( tdehtml::DrawContentsEvent * )
6633{
6634}
6635
6636void TDEHTMLPart::guiActivateEvent( KParts::GUIActivateEvent *event )
6637{
6638 if ( event->activated() )
6639 {
6640 emitSelectionChanged();
6641 emit d->m_extension->enableAction( "print", d->m_doc != 0 );
6642
6643 if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
6644 {
6645 TQPtrList<TDEAction> lst;
6646 lst.append( d->m_paLoadImages );
6647 plugActionList( "loadImages", lst );
6648 }
6649 }
6650}
6651
6652void TDEHTMLPart::slotPrintFrame()
6653{
6654 if ( d->m_frames.count() == 0 )
6655 return;
6656
6657 KParts::ReadOnlyPart *frame = currentFrame();
6658 if (!frame)
6659 return;
6660
6661 KParts::BrowserExtension *ext = KParts::BrowserExtension::childObject( frame );
6662
6663 if ( !ext )
6664 return;
6665
6666 TQMetaObject *mo = ext->metaObject();
6667
6668 int idx = mo->findSlot( "print()", true );
6669 if ( idx >= 0 ) {
6670 TQUObject o[ 1 ];
6671 ext->tqt_invoke( idx, o );
6672 }
6673}
6674
6675void TDEHTMLPart::slotSelectAll()
6676{
6677 KParts::ReadOnlyPart *part = currentFrame();
6678 if (part && part->inherits("TDEHTMLPart"))
6679 static_cast<TDEHTMLPart *>(part)->selectAll();
6680}
6681
6682void TDEHTMLPart::startAutoScroll()
6683{
6684 connect(&d->m_scrollTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotAutoScroll() ));
6685 d->m_scrollTimer.start(100, false);
6686}
6687
6688void TDEHTMLPart::stopAutoScroll()
6689{
6690 disconnect(&d->m_scrollTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotAutoScroll() ));
6691 if (d->m_scrollTimer.isActive())
6692 d->m_scrollTimer.stop();
6693}
6694
6695
6696void TDEHTMLPart::slotAutoScroll()
6697{
6698 if (d->m_view)
6699 d->m_view->doAutoScroll();
6700 else
6701 stopAutoScroll(); // Safety
6702}
6703
6704void TDEHTMLPart::runAdFilter()
6705{
6706 if ( parentPart() )
6707 parentPart()->runAdFilter();
6708
6709 if ( !d->m_doc )
6710 return;
6711
6712 TQPtrDictIterator<tdehtml::CachedObject> it( d->m_doc->docLoader()->m_docObjects );
6713 for ( ; it.current(); ++it )
6714 if ( it.current()->type() == tdehtml::CachedObject::Image ) {
6715 tdehtml::CachedImage *image = static_cast<tdehtml::CachedImage *>(it.current());
6716 bool wasBlocked = image->m_wasBlocked;
6717 image->m_wasBlocked = TDEHTMLFactory::defaultHTMLSettings()->isAdFiltered( d->m_doc->completeURL( (*it).url().string() ) );
6718 if ( image->m_wasBlocked != wasBlocked )
6719 image->do_notify(image->pixmap(), image->valid_rect());
6720 }
6721
6722 if ( TDEHTMLFactory::defaultHTMLSettings()->isHideAdsEnabled() ) {
6723 for ( NodeImpl *nextNode, *node = d->m_doc; node; node = nextNode ) {
6724
6725 // We might be deleting 'node' shortly.
6726 nextNode = node->traverseNextNode();
6727
6728 if ( node->id() == ID_IMG ||
6729 node->id() == ID_IFRAME ||
6730 (node->id() == ID_INPUT && static_cast<HTMLInputElementImpl *>(node)->inputType() == HTMLInputElementImpl::IMAGE ))
6731 {
6732 if ( TDEHTMLFactory::defaultHTMLSettings()->isAdFiltered( d->m_doc->completeURL( static_cast<ElementImpl *>(node)->getAttribute(ATTR_SRC).string() ) ) )
6733 {
6734 // We found an IMG, IFRAME or INPUT (of type IMAGE) matching a filter.
6735 node->ref();
6736 NodeImpl *parent = node->parent();
6737 if( parent )
6738 {
6739 int exception = 0;
6740 parent->removeChild(node, exception);
6741 }
6742 node->deref();
6743 }
6744 }
6745 }
6746 }
6747}
6748
6749void TDEHTMLPart::selectAll()
6750{
6751 if (!d->m_doc) return;
6752
6753 NodeImpl *first;
6754 if (d->m_doc->isHTMLDocument())
6755 first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6756 else
6757 first = d->m_doc;
6758 NodeImpl *next;
6759
6760 // Look for first text/cdata node that has a renderer,
6761 // or first childless replaced element
6762 while ( first && !(first->renderer()
6763 && ((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE)
6764 || (first->renderer()->isReplaced() && !first->renderer()->firstChild()))))
6765 {
6766 next = first->firstChild();
6767 if ( !next ) next = first->nextSibling();
6768 while( first && !next )
6769 {
6770 first = first->parentNode();
6771 if ( first )
6772 next = first->nextSibling();
6773 }
6774 first = next;
6775 }
6776
6777 NodeImpl *last;
6778 if (d->m_doc->isHTMLDocument())
6779 last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
6780 else
6781 last = d->m_doc;
6782 // Look for last text/cdata node that has a renderer,
6783 // or last childless replaced element
6784 // ### Instead of changing this loop, use findLastSelectableNode
6785 // in render_table.cpp (LS)
6786 while ( last && !(last->renderer()
6787 && ((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE)
6788 || (last->renderer()->isReplaced() && !last->renderer()->lastChild()))))
6789 {
6790 next = last->lastChild();
6791 if ( !next ) next = last->previousSibling();
6792 while ( last && !next )
6793 {
6794 last = last->parentNode();
6795 if ( last )
6796 next = last->previousSibling();
6797 }
6798 last = next;
6799 }
6800
6801 if ( !first || !last )
6802 return;
6803 Q_ASSERT(first->renderer());
6804 Q_ASSERT(last->renderer());
6805 d->m_selectionStart = first;
6806 d->m_startOffset = 0;
6807 d->m_selectionEnd = last;
6808 d->m_endOffset = last->nodeValue().length();
6809 d->m_startBeforeEnd = true;
6810
6811 d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
6812 d->m_selectionEnd.handle(), d->m_endOffset );
6813
6814 emitSelectionChanged();
6815}
6816
6817bool TDEHTMLPart::checkLinkSecurity(const KURL &linkURL,const TQString &message, const TQString &button)
6818{
6819 bool linkAllowed = true;
6820
6821 if ( d->m_doc )
6822 linkAllowed = tdeApp && tdeApp->authorizeURLAction("redirect", url(), linkURL);
6823
6824 if ( !linkAllowed ) {
6825 tdehtml::Tokenizer *tokenizer = d->m_doc->tokenizer();
6826 if (tokenizer)
6827 tokenizer->setOnHold(true);
6828
6829 int response = KMessageBox::Cancel;
6830 if (!message.isEmpty())
6831 {
6832 response = KMessageBox::warningContinueCancel( 0,
6833 message.arg(linkURL.htmlURL()),
6834 i18n( "Security Warning" ),
6835 button);
6836 }
6837 else
6838 {
6839 KMessageBox::error( 0,
6840 i18n( "<qt>Access by untrusted page to<BR><B>%1</B><BR> denied.").arg(linkURL.htmlURL()),
6841 i18n( "Security Alert" ));
6842 }
6843
6844 if (tokenizer)
6845 tokenizer->setOnHold(false);
6846 return (response==KMessageBox::Continue);
6847 }
6848 return true;
6849}
6850
6851void TDEHTMLPart::slotPartRemoved( KParts::Part *part )
6852{
6853// kdDebug(6050) << "TDEHTMLPart::slotPartRemoved " << part << endl;
6854 if ( part == d->m_activeFrame )
6855 {
6856 d->m_activeFrame = 0L;
6857 if ( !part->inherits( "TDEHTMLPart" ) )
6858 {
6859 if (factory()) {
6860 factory()->removeClient( part );
6861 }
6862 if (childClients()->containsRef(part)) {
6863 removeChildClient( part );
6864 }
6865 }
6866 }
6867}
6868
6869void TDEHTMLPart::slotActiveFrameChanged( KParts::Part *part )
6870{
6871// kdDebug(6050) << "TDEHTMLPart::slotActiveFrameChanged this=" << this << "part=" << part << endl;
6872 if ( part == this )
6873 {
6874 kdError(6050) << "strange error! we activated ourselves" << endl;
6875 assert( false );
6876 return;
6877 }
6878// kdDebug(6050) << "TDEHTMLPart::slotActiveFrameChanged d->m_activeFrame=" << d->m_activeFrame << endl;
6879 if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits( "TQFrame" ) )
6880 {
6881 TQFrame *frame = static_cast<TQFrame *>( d->m_activeFrame->widget() );
6882 if (frame->frameStyle() != TQFrame::NoFrame)
6883 {
6884 frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken);
6885 frame->repaint();
6886 }
6887 }
6888
6889 if( d->m_activeFrame && !d->m_activeFrame->inherits( "TDEHTMLPart" ) )
6890 {
6891 if (factory()) {
6892 factory()->removeClient( d->m_activeFrame );
6893 }
6894 removeChildClient( d->m_activeFrame );
6895 }
6896 if( part && !part->inherits( "TDEHTMLPart" ) )
6897 {
6898 if (factory()) {
6899 factory()->addClient( part );
6900 }
6901 insertChildClient( part );
6902 }
6903
6904
6905 d->m_activeFrame = part;
6906
6907 if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits( "TQFrame" ) )
6908 {
6909 TQFrame *frame = static_cast<TQFrame *>( d->m_activeFrame->widget() );
6910 if (frame->frameStyle() != TQFrame::NoFrame)
6911 {
6912 frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Plain);
6913 frame->repaint();
6914 }
6915 kdDebug(6050) << "new active frame " << d->m_activeFrame << endl;
6916 }
6917
6918 updateActions();
6919
6920 // (note: childObject returns 0 if the argument is 0)
6921 d->m_extension->setExtensionProxy( KParts::BrowserExtension::childObject( d->m_activeFrame ) );
6922}
6923
6924void TDEHTMLPart::setActiveNode(const DOM::Node &node)
6925{
6926 if (!d->m_doc || !d->m_view)
6927 return;
6928
6929 // Set the document's active node
6930 d->m_doc->setFocusNode(node.handle());
6931
6932 // Scroll the view if necessary to ensure that the new focus node is visible
6933 TQRect rect = node.handle()->getRect();
6934 d->m_view->ensureVisible(rect.right(), rect.bottom());
6935 d->m_view->ensureVisible(rect.left(), rect.top());
6936}
6937
6938DOM::Node TDEHTMLPart::activeNode() const
6939{
6940 return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
6941}
6942
6943DOM::EventListener *TDEHTMLPart::createHTMLEventListener( TQString code, TQString name, NodeImpl* node )
6944{
6945 KJSProxy *proxy = jScript();
6946
6947 if (!proxy)
6948 return 0;
6949
6950 return proxy->createHTMLEventHandler( m_url.url(), name, code, node );
6951}
6952
6953TDEHTMLPart *TDEHTMLPart::opener()
6954{
6955 return d->m_opener;
6956}
6957
6958void TDEHTMLPart::setOpener(TDEHTMLPart *_opener)
6959{
6960 d->m_opener = _opener;
6961}
6962
6963bool TDEHTMLPart::openedByJS()
6964{
6965 return d->m_openedByJS;
6966}
6967
6968void TDEHTMLPart::setOpenedByJS(bool _openedByJS)
6969{
6970 d->m_openedByJS = _openedByJS;
6971}
6972
6973void TDEHTMLPart::preloadStyleSheet(const TQString &url, const TQString &stylesheet)
6974{
6975 tdehtml::Cache::preloadStyleSheet(url, stylesheet);
6976}
6977
6978void TDEHTMLPart::preloadScript(const TQString &url, const TQString &script)
6979{
6980 tdehtml::Cache::preloadScript(url, script);
6981}
6982
6983TQCString TDEHTMLPart::dcopObjectId() const
6984{
6985 TQCString id;
6986 id.sprintf("html-widget%d", d->m_dcop_counter);
6987 return id;
6988}
6989
6990long TDEHTMLPart::cacheId() const
6991{
6992 return d->m_cacheId;
6993}
6994
6995bool TDEHTMLPart::restored() const
6996{
6997 return d->m_restored;
6998}
6999
7000bool TDEHTMLPart::pluginPageQuestionAsked(const TQString& mimetype) const
7001{
7002 // parentPart() should be const!
7003 TDEHTMLPart* parent = const_cast<TDEHTMLPart *>(this)->parentPart();
7004 if ( parent )
7005 return parent->pluginPageQuestionAsked(mimetype);
7006
7007 return d->m_pluginPageQuestionAsked.contains(mimetype);
7008}
7009
7010void TDEHTMLPart::setPluginPageQuestionAsked(const TQString& mimetype)
7011{
7012 if ( parentPart() )
7013 parentPart()->setPluginPageQuestionAsked(mimetype);
7014
7015 d->m_pluginPageQuestionAsked.append(mimetype);
7016}
7017
7018void TDEHTMLPart::slotAutomaticDetectionLanguage( int _id )
7019{
7020 d->m_automaticDetection->setItemChecked( _id, true );
7021
7022 switch ( _id ) {
7023 case 0 :
7024 d->m_autoDetectLanguage = tdehtml::Decoder::SemiautomaticDetection;
7025 break;
7026 case 1 :
7027 d->m_autoDetectLanguage = tdehtml::Decoder::Arabic;
7028 break;
7029 case 2 :
7030 d->m_autoDetectLanguage = tdehtml::Decoder::Baltic;
7031 break;
7032 case 3 :
7033 d->m_autoDetectLanguage = tdehtml::Decoder::CentralEuropean;
7034 break;
7035 case 4 :
7036 d->m_autoDetectLanguage = tdehtml::Decoder::Chinese;
7037 break;
7038 case 5 :
7039 d->m_autoDetectLanguage = tdehtml::Decoder::Greek;
7040 break;
7041 case 6 :
7042 d->m_autoDetectLanguage = tdehtml::Decoder::Hebrew;
7043 break;
7044 case 7 :
7045 d->m_autoDetectLanguage = tdehtml::Decoder::Japanese;
7046 break;
7047 case 8 :
7048 d->m_autoDetectLanguage = tdehtml::Decoder::Korean;
7049 break;
7050 case 9 :
7051 d->m_autoDetectLanguage = tdehtml::Decoder::Russian;
7052 break;
7053 case 10 :
7054 d->m_autoDetectLanguage = tdehtml::Decoder::Thai;
7055 break;
7056 case 11 :
7057 d->m_autoDetectLanguage = tdehtml::Decoder::Turkish;
7058 break;
7059 case 12 :
7060 d->m_autoDetectLanguage = tdehtml::Decoder::Ukrainian;
7061 break;
7062 case 13 :
7063 d->m_autoDetectLanguage = tdehtml::Decoder::Unicode;
7064 break;
7065 case 14 :
7066 d->m_autoDetectLanguage = tdehtml::Decoder::WesternEuropean;
7067 break;
7068 default :
7069 d->m_autoDetectLanguage = tdehtml::Decoder::SemiautomaticDetection;
7070 break;
7071 }
7072
7073 for ( int i = 0; i <= 14; ++i ) {
7074 if ( i != _id )
7075 d->m_automaticDetection->setItemChecked( i, false );
7076 }
7077
7078 d->m_paSetEncoding->popupMenu()->setItemChecked( 0, true );
7079
7080 setEncoding( TQString(), false );
7081
7082 if( d->m_manualDetection )
7083 d->m_manualDetection->setCurrentItem( -1 );
7084 d->m_paSetEncoding->popupMenu()->setItemChecked( d->m_paSetEncoding->popupMenu()->idAt( 2 ), false );
7085}
7086
7087tdehtml::Decoder *TDEHTMLPart::createDecoder()
7088{
7089 tdehtml::Decoder *dec = new tdehtml::Decoder();
7090 if( !d->m_encoding.isNull() )
7091 dec->setEncoding( d->m_encoding.latin1(),
7092 d->m_haveEncoding ? tdehtml::Decoder::UserChosenEncoding : tdehtml::Decoder::EncodingFromHTTPHeader);
7093 else {
7094 // Inherit the default encoding from the parent frame if there is one.
7095 const char *defaultEncoding = (parentPart() && parentPart()->d->m_decoder)
7096 ? parentPart()->d->m_decoder->encoding() : settings()->encoding().latin1();
7097 dec->setEncoding(defaultEncoding, tdehtml::Decoder::DefaultEncoding);
7098 }
7099#ifdef APPLE_CHANGES
7100 if (d->m_doc)
7101 d->m_doc->setDecoder(d->m_decoder);
7102#endif
7103 dec->setAutoDetectLanguage( d->m_autoDetectLanguage );
7104 return dec;
7105}
7106
7107void TDEHTMLPart::emitCaretPositionChanged(const DOM::Node &node, long offset) {
7108 emit caretPositionChanged(node, offset);
7109}
7110
7111void TDEHTMLPart::restoreScrollPosition()
7112{
7113 KParts::URLArgs args = d->m_extension->urlArgs();
7114
7115 if ( m_url.hasRef() && !d->m_restoreScrollPosition && !args.reload) {
7116 if ( !d->m_doc || !d->m_doc->parsing() )
7117 disconnect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
7118 if ( !gotoAnchor(m_url.encodedHtmlRef()) )
7119 gotoAnchor(m_url.htmlRef());
7120 return;
7121 }
7122
7123 // Check whether the viewport has become large enough to encompass the stored
7124 // offsets. If the document has been fully loaded, force the new coordinates,
7125 // even if the canvas is too short (can happen when user resizes the window
7126 // during loading).
7127 if (d->m_view->contentsHeight() - d->m_view->visibleHeight() >= args.yOffset
7128 || d->m_bComplete) {
7129 d->m_view->setContentsPos(args.xOffset, args.yOffset);
7130 disconnect(d->m_view, TQ_SIGNAL(finishedLayout()), this, TQ_SLOT(restoreScrollPosition()));
7131 }
7132}
7133
7134
7135void TDEHTMLPart::openWallet(DOM::HTMLFormElementImpl *form)
7136{
7137#ifndef TDEHTML_NO_WALLET
7138 TDEHTMLPart *p;
7139
7140 for (p = parentPart(); p && p->parentPart(); p = p->parentPart()) {
7141 }
7142
7143 if (p) {
7144 p->openWallet(form);
7145 return;
7146 }
7147
7148 if (onlyLocalReferences()) { // avoid triggering on local apps, thumbnails
7149 return;
7150 }
7151
7152 if (d->m_wallet) {
7153 if (d->m_bWalletOpened) {
7154 if (d->m_wallet->isOpen()) {
7155 form->walletOpened(d->m_wallet);
7156 return;
7157 }
7158 d->m_wallet->deleteLater();
7159 d->m_wallet = 0L;
7160 d->m_bWalletOpened = false;
7161 }
7162 }
7163
7164 if (!d->m_wq) {
7165 TDEWallet::Wallet *wallet = TDEWallet::Wallet::openWallet(TDEWallet::Wallet::NetworkWallet(), widget() ? widget()->topLevelWidget()->winId() : 0, TDEWallet::Wallet::Asynchronous);
7166 d->m_wq = new TDEHTMLWalletQueue(this);
7167 d->m_wq->wallet = wallet;
7168 connect(wallet, TQ_SIGNAL(walletOpened(bool)), d->m_wq, TQ_SLOT(walletOpened(bool)));
7169 connect(d->m_wq, TQ_SIGNAL(walletOpened(TDEWallet::Wallet*)), this, TQ_SLOT(walletOpened(TDEWallet::Wallet*)));
7170 }
7171 assert(form);
7172 d->m_wq->callers.append(TDEHTMLWalletQueue::Caller(form, form->getDocument()));
7173#endif // TDEHTML_NO_WALLET
7174}
7175
7176
7177void TDEHTMLPart::saveToWallet(const TQString& key, const TQMap<TQString,TQString>& data)
7178{
7179#ifndef TDEHTML_NO_WALLET
7180 TDEHTMLPart *p;
7181
7182 for (p = parentPart(); p && p->parentPart(); p = p->parentPart()) {
7183 }
7184
7185 if (p) {
7186 p->saveToWallet(key, data);
7187 return;
7188 }
7189
7190 if (d->m_wallet) {
7191 if (d->m_bWalletOpened) {
7192 if (d->m_wallet->isOpen()) {
7193 if (!d->m_wallet->hasFolder(TDEWallet::Wallet::FormDataFolder())) {
7194 d->m_wallet->createFolder(TDEWallet::Wallet::FormDataFolder());
7195 }
7196 d->m_wallet->setFolder(TDEWallet::Wallet::FormDataFolder());
7197 d->m_wallet->writeMap(key, data);
7198 return;
7199 }
7200 d->m_wallet->deleteLater();
7201 d->m_wallet = 0L;
7202 d->m_bWalletOpened = false;
7203 }
7204 }
7205
7206 if (!d->m_wq) {
7207 TDEWallet::Wallet *wallet = TDEWallet::Wallet::openWallet(TDEWallet::Wallet::NetworkWallet(), widget() ? widget()->topLevelWidget()->winId() : 0, TDEWallet::Wallet::Asynchronous);
7208 d->m_wq = new TDEHTMLWalletQueue(this);
7209 d->m_wq->wallet = wallet;
7210 connect(wallet, TQ_SIGNAL(walletOpened(bool)), d->m_wq, TQ_SLOT(walletOpened(bool)));
7211 connect(d->m_wq, TQ_SIGNAL(walletOpened(TDEWallet::Wallet*)), this, TQ_SLOT(walletOpened(TDEWallet::Wallet*)));
7212 }
7213 d->m_wq->savers.append(qMakePair(key, data));
7214#endif // TDEHTML_NO_WALLET
7215}
7216
7217
7218void TDEHTMLPart::dequeueWallet(DOM::HTMLFormElementImpl *form) {
7219#ifndef TDEHTML_NO_WALLET
7220 TDEHTMLPart *p;
7221
7222 for (p = parentPart(); p && p->parentPart(); p = p->parentPart()) {
7223 }
7224
7225 if (p) {
7226 p->dequeueWallet(form);
7227 return;
7228 }
7229
7230 if (d->m_wq) {
7231 d->m_wq->callers.remove(TDEHTMLWalletQueue::Caller(form, form->getDocument()));
7232 }
7233#endif // TDEHTML_NO_WALLET
7234}
7235
7236
7237void TDEHTMLPart::walletOpened(TDEWallet::Wallet *wallet) {
7238#ifndef TDEHTML_NO_WALLET
7239 assert(!d->m_wallet);
7240 assert(d->m_wq);
7241
7242 d->m_wq->deleteLater(); // safe?
7243 d->m_wq = 0L;
7244
7245 if (!wallet) {
7246 d->m_bWalletOpened = false;
7247 return;
7248 }
7249
7250 d->m_wallet = wallet;
7251 d->m_bWalletOpened = true;
7252 connect(d->m_wallet, TQ_SIGNAL(walletClosed()), TQ_SLOT(slotWalletClosed()));
7253
7254 if (!d->m_statusBarWalletLabel) {
7255 d->m_statusBarWalletLabel = new KURLLabel(d->m_statusBarExtension->statusBar());
7256 d->m_statusBarWalletLabel->setFixedHeight(instance()->iconLoader()->currentSize(TDEIcon::Small));
7257 d->m_statusBarWalletLabel->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed));
7258 d->m_statusBarWalletLabel->setUseCursor(false);
7259 d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0, false);
7260 d->m_statusBarWalletLabel->setPixmap(SmallIcon("wallet_open", instance()));
7261 connect(d->m_statusBarWalletLabel, TQ_SIGNAL(leftClickedURL()), TQ_SLOT(launchWalletManager()));
7262 connect(d->m_statusBarWalletLabel, TQ_SIGNAL(rightClickedURL()), TQ_SLOT(walletMenu()));
7263 } else {
7264 TQToolTip::remove(d->m_statusBarWalletLabel);
7265 }
7266 TQToolTip::add(d->m_statusBarWalletLabel, i18n("The wallet '%1' is open and being used for form data and passwords.").arg(TDEWallet::Wallet::NetworkWallet()));
7267#endif // TDEHTML_NO_WALLET
7268}
7269
7270
7271TDEWallet::Wallet *TDEHTMLPart::wallet()
7272{
7273#ifndef TDEHTML_NO_WALLET
7274 TDEHTMLPart *p;
7275
7276 for (p = parentPart(); p && p->parentPart(); p = p->parentPart())
7277 ;
7278
7279 if (p)
7280 return p->wallet();
7281
7282#endif // TDEHTML_NO_WALLET
7283 return d->m_wallet;
7284}
7285
7286
7287void TDEHTMLPart::slotWalletClosed()
7288{
7289#ifndef TDEHTML_NO_WALLET
7290 if (d->m_wallet) {
7291 d->m_wallet->deleteLater();
7292 d->m_wallet = 0L;
7293 }
7294 d->m_bWalletOpened = false;
7295 if (d->m_statusBarWalletLabel) {
7296 d->m_statusBarExtension->removeStatusBarItem(d->m_statusBarWalletLabel);
7297 delete d->m_statusBarWalletLabel;
7298 d->m_statusBarWalletLabel = 0L;
7299 }
7300#endif // TDEHTML_NO_WALLET
7301}
7302
7303void TDEHTMLPart::launchWalletManager()
7304{
7305#ifndef TDEHTML_NO_WALLET
7306 if (!DCOPClient::mainClient()->isApplicationRegistered("tdewalletmanager")) {
7307 TDEApplication::startServiceByDesktopName("tdewalletmanager_show");
7308 } else {
7309 DCOPRef r("tdewalletmanager", "tdewalletmanager-mainwindow#1");
7310 r.send("show");
7311 r.send("raise");
7312 }
7313#endif // TDEHTML_NO_WALLET
7314}
7315
7316void TDEHTMLPart::walletMenu()
7317{
7318#ifndef TDEHTML_NO_WALLET
7319 TDEPopupMenu *m = new TDEPopupMenu(0L);
7320 m->insertItem(i18n("&Close Wallet"), this, TQ_SLOT(slotWalletClosed()));
7321 m->popup(TQCursor::pos());
7322#endif // TDEHTML_NO_WALLET
7323}
7324
7325void TDEHTMLPart::slotToggleCaretMode()
7326{
7327 setCaretMode(d->m_paToggleCaretMode->isChecked());
7328}
7329
7330void TDEHTMLPart::setFormNotification(TDEHTMLPart::FormNotification fn) {
7331 d->m_formNotification = fn;
7332}
7333
7334TDEHTMLPart::FormNotification TDEHTMLPart::formNotification() const {
7335 return d->m_formNotification;
7336}
7337
7338KURL TDEHTMLPart::toplevelURL()
7339{
7340 TDEHTMLPart* part = this;
7341 while (part->parentPart())
7342 part = part->parentPart();
7343
7344 if (!part)
7345 return KURL();
7346
7347 return part->url();
7348}
7349
7350bool TDEHTMLPart::isModified() const
7351{
7352 if ( !d->m_doc )
7353 return false;
7354
7355 return d->m_doc->unsubmittedFormChanges();
7356}
7357
7358void TDEHTMLPart::setDebugScript( bool enable )
7359{
7360 unplugActionList( "debugScriptList" );
7361 if ( enable ) {
7362 if (!d->m_paDebugScript) {
7363 d->m_paDebugScript = new TDEAction( i18n( "JavaScript &Debugger" ), 0, this, TQ_SLOT( slotDebugScript() ), actionCollection(), "debugScript" );
7364 }
7365 d->m_paDebugScript->setEnabled( d->m_frame ? d->m_frame->m_jscript : 0L );
7366 TQPtrList<TDEAction> lst;
7367 lst.append( d->m_paDebugScript );
7368 plugActionList( "debugScriptList", lst );
7369 }
7370 d->m_bJScriptDebugEnabled = enable;
7371}
7372
7373void TDEHTMLPart::setSuppressedPopupIndicator( bool enable )
7374{
7375 setSuppressedPopupIndicator( enable, 0 );
7376}
7377
7378void TDEHTMLPart::setSuppressedPopupIndicator( bool enable, TDEHTMLPart *originPart )
7379{
7380 if ( parentPart() ) {
7381 parentPart()->setSuppressedPopupIndicator( enable, originPart );
7382 return;
7383 }
7384
7385 if ( enable && originPart ) {
7386 d->m_openableSuppressedPopups++;
7387 if ( d->m_suppressedPopupOriginParts.findIndex( originPart ) == -1 )
7388 d->m_suppressedPopupOriginParts.append( originPart );
7389 }
7390
7391 if ( enable && !d->m_statusBarPopupLabel ) {
7392 d->m_statusBarPopupLabel = new KURLLabel( d->m_statusBarExtension->statusBar() );
7393 d->m_statusBarPopupLabel->setFixedHeight( instance()->iconLoader()->currentSize( TDEIcon::Small) );
7394 d->m_statusBarPopupLabel->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ));
7395 d->m_statusBarPopupLabel->setUseCursor( false );
7396 d->m_statusBarExtension->addStatusBarItem( d->m_statusBarPopupLabel, 0, false );
7397 d->m_statusBarPopupLabel->setPixmap( SmallIcon( "window_suppressed", instance() ) );
7398 TQToolTip::add( d->m_statusBarPopupLabel, i18n("This page was prevented from opening a new window via JavaScript." ) );
7399
7400 connect(d->m_statusBarPopupLabel, TQ_SIGNAL(leftClickedURL()), TQ_SLOT(suppressedPopupMenu()));
7401 if (d->m_settings->jsPopupBlockerPassivePopup()) {
7402 TQPixmap px;
7403 px = MainBarIcon( "window_suppressed" );
7404 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);
7405 }
7406 } else if ( !enable && d->m_statusBarPopupLabel ) {
7407 TQToolTip::remove( d->m_statusBarPopupLabel );
7408 d->m_statusBarExtension->removeStatusBarItem( d->m_statusBarPopupLabel );
7409 delete d->m_statusBarPopupLabel;
7410 d->m_statusBarPopupLabel = 0L;
7411 }
7412}
7413
7414void TDEHTMLPart::suppressedPopupMenu() {
7415 TDEPopupMenu *m = new TDEPopupMenu(0L);
7416 m->setCheckable(true);
7417 if ( d->m_openableSuppressedPopups )
7418 m->insertItem(i18n("&Show Blocked Popup Window","Show %n Blocked Popup Windows", d->m_openableSuppressedPopups), this, TQ_SLOT(showSuppressedPopups()));
7419 m->insertItem(i18n("Show Blocked Window Passive Popup &Notification"), this, TQ_SLOT(togglePopupPassivePopup()),0,57);
7420 m->setItemChecked(57,d->m_settings->jsPopupBlockerPassivePopup());
7421 m->insertItem(i18n("&Configure JavaScript New Window Policies..."), this, TQ_SLOT(launchJSConfigDialog()));
7422 m->popup(TQCursor::pos());
7423}
7424
7425void TDEHTMLPart::togglePopupPassivePopup() {
7426 // Same hack as in disableJSErrorExtension()
7427 d->m_settings->setJSPopupBlockerPassivePopup( !d->m_settings->jsPopupBlockerPassivePopup() );
7428 DCOPClient::mainClient()->send("konqueror*", "KonquerorIface", "reparseConfiguration()", TQByteArray());
7429}
7430
7431void TDEHTMLPart::showSuppressedPopups() {
7432 for ( TQValueListIterator<TQGuardedPtr<TDEHTMLPart> > i = d->m_suppressedPopupOriginParts.begin();
7433 i != d->m_suppressedPopupOriginParts.end(); ++i ) {
7434 if (TDEHTMLPart* part = *i) {
7435 KJS::Window *w = KJS::Window::retrieveWindow( part );
7436 if (w) {
7437 w->showSuppressedWindows();
7438 w->forgetSuppressedWindows();
7439 }
7440 }
7441 }
7442 setSuppressedPopupIndicator( false );
7443 d->m_openableSuppressedPopups = 0;
7444 d->m_suppressedPopupOriginParts.clear();
7445}
7446
7447// Extension to use for "view document source", "save as" etc.
7448// Using the right extension can help the viewer get into the right mode (#40496)
7449TQString TDEHTMLPart::defaultExtension() const
7450{
7451 if ( !d->m_doc )
7452 return ".html";
7453 if ( !d->m_doc->isHTMLDocument() )
7454 return ".xml";
7455 return d->m_doc->htmlMode() == DOM::DocumentImpl::XHtml ? ".xhtml" : ".html";
7456}
7457
7458bool TDEHTMLPart::inProgress() const
7459{
7460 if (d->m_runningScripts || (d->m_doc && d->m_doc->parsing()))
7461 return true;
7462
7463 // Any frame that hasn't completed yet ?
7464 ConstFrameIt it = d->m_frames.begin();
7465 const ConstFrameIt end = d->m_frames.end();
7466 for (; it != end; ++it ) {
7467 if ((*it)->m_run || !(*it)->m_bCompleted)
7468 return true;
7469 }
7470
7471 return d->m_submitForm || !d->m_redirectURL.isEmpty() || d->m_redirectionTimer.isActive() || d->m_job;
7472}
7473
7474using namespace KParts;
7475#include "tdehtml_part.moc"
7476#include "tdehtmlpart_p.moc"
DOM::DOMString
This class implements the basic string we use in the DOM.
Definition: dom_string.h:44
DOM::Document
The Document interface represents the entire HTML or XML document.
Definition: dom_doc.h:246
DOM::Document::createRange
Range createRange()
Introduced in DOM Level 2 This method is from the DocumentRange interface.
Definition: dom_doc.cpp:352
DOM::EventListener
Introduced in DOM Level 2.
Definition: dom2_events.h:64
DOM::HTMLDocument
An HTMLDocument is the root of the HTML hierarchy and holds the entire content.
Definition: html_document.h:74
DOM::HTMLDocument::domain
DOMString domain() const
The domain name of the server that served the document, or a null string if the server cannot be iden...
Definition: html_document.cpp:109
DOM::NamedNodeMap::getNamedItem
Node getNamedItem(const DOMString &name) const
Retrieves a node specified by name.
Definition: dom_node.cpp:66
DOM::Node
The Node interface is the primary datatype for the entire Document Object Model.
Definition: dom_node.h:275
DOM::Node::nextSibling
Node nextSibling() const
The node immediately following this node.
Definition: dom_node.cpp:235
DOM::Node::isNull
bool isNull() const
tests if this Node is 0.
Definition: dom_node.h:892
DOM::Node::nodeValue
DOMString nodeValue() const
The value of this node, depending on its type; see the table above.
Definition: dom_node.cpp:182
DOM::Node::parentNode
Node parentNode() const
The parent of this node.
Definition: dom_node.cpp:205
DOM::Node::firstChild
Node firstChild() const
The first child of this node.
Definition: dom_node.cpp:217
DOM::Node::attributes
NamedNodeMap attributes() const
A NamedNodeMap containing the attributes of this node (if it is an Element ) or null otherwise.
Definition: dom_node.cpp:241
DOM::Node::nodeType
unsigned short nodeType() const
A code representing the type of the underlying object, as defined above.
Definition: dom_node.cpp:199
DOM::Node::nodeName
DOMString nodeName() const
The name of this node, depending on its type; see the table above.
Definition: dom_node.cpp:176
KCharsets::encodingForName
TQString encodingForName(const TQString &descriptiveName)
KCharsets::descriptiveEncodingNames
TQStringList descriptiveEncodingNames()
KDialog::avoidArea
static bool avoidArea(TQWidget *widget, const TQRect &area, int screen=-1)
KGuiItem
KLibFactory
KLibLoader::self
static KLibLoader * self()
KLibLoader::lastErrorMessage
TQString lastErrorMessage() const
KLibLoader::library
virtual KLibrary * library(const char *libname)
KLibLoader::factory
KLibFactory * factory(const char *libname)
KLibrary
KLibrary::unload
void unload() const
KLibrary::symbol
void * symbol(const char *name) const
KMessageBox::information
static void information(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, const TQString &dontShowAgainName=TQString::null, int options=Notify)
KMessageBox::error
static void error(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, int options=Notify)
KMessageBox::warningContinueCancel
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)
KMultipleDrag
KMultipleDrag::addDragObject
void addDragObject(TQDragObject *dragObject)
KParts::BrowserExtension
KParts::BrowserExtension::childObject
static BrowserExtension * childObject(TQObject *obj)
KParts::BrowserHostExtension
KParts::BrowserInterface
KParts::BrowserInterface::callMethod
void callMethod(const char *name, const TQVariant &argument)
KParts::BrowserRun::askEmbedOrSave
static AskSaveResult askEmbedOrSave(const KURL &url, const TQString &mimeType, const TQString &suggestedFilename=TQString::null, int flags=0)
KParts::Factory
KParts::GUIActivateEvent
KParts::LiveConnectExtension
KParts::PartBase::setInstance
virtual void setInstance(TDEInstance *instance)
KParts::PartManager
KParts::PartManager::removePart
virtual void removePart(Part *part)
KParts::PartManager::activePart
virtual Part * activePart() const
KParts::PartManager::addPart
virtual void addPart(Part *part, bool setActive=true)
KParts::Part
KParts::Part::setWidget
virtual void setWidget(TQWidget *widget)
KParts::Part::widget
virtual TQWidget * widget()
KParts::ReadOnlyPart
KParts::ReadOnlyPart::canceled
void canceled(const TQString &errMsg)
KParts::ReadOnlyPart::completed
void completed()
KParts::ReadOnlyPart::m_url
KURL m_url
KParts::ReadOnlyPart::started
void started(TDEIO::Job *)
KParts::ReadOnlyPart::url
KURL url() const
KParts::StatusBarExtension
KParts::StatusBarExtension::setStatusBar
void setStatusBar(KStatusBar *status)
KParts::StatusBarExtension::childObject
static StatusBarExtension * childObject(TQObject *obj)
KPassivePopup::message
static KPassivePopup * message(const TQString &text, TQWidget *parent, const char *name=0)
KStringHandler::rsqueeze
static TQString rsqueeze(const TQString &str, uint maxlen=40)
KStringHandler::csqueeze
static TQString csqueeze(const TQString &str, uint maxlen=40)
KTempFile
KURLDrag
KURLDrag::metaData
TQMap< TQString, TQString > & metaData()
KURLLabel
KURL::List
KURL
KURL::path
TQString path() const
KURL::setUser
void setUser(const TQString &_txt)
KURL::query
TQString query() const
KURL::encodedHtmlRef
TQString encodedHtmlRef() const
KURL::setRef
void setRef(const TQString &_txt)
KURL::encode_string
static TQString encode_string(const TQString &str, int encoding_hint=0)
KURL::setPath
void setPath(const TQString &path)
KURL::hasSubURL
bool hasSubURL() const
KURL::setPass
void setPass(const TQString &_txt)
KURL::split
static List split(const TQString &_url)
KURL::protocol
TQString protocol() const
KURL::isEmpty
bool isEmpty() const
KURL::queryItem
TQString queryItem(const TQString &item) const
KURL::join
static KURL join(const List &_list)
KURL::setQuery
void setQuery(const TQString &_txt, int encoding_hint=0)
KURL::fileName
TQString fileName(bool _ignore_trailing_slash_in_path=true) const
KURL::url
TQString url(int _trailing=0, int encoding_hint=0) const
KURL::host
TQString host() const
KURL::decode_string
static TQString decode_string(const TQString &str, int encoding_hint=0)
KURL::setFileName
void setFileName(const TQString &_txt)
KURL::isLocalFile
bool isLocalFile() const
KURL::prettyURL
TQString prettyURL(int _trailing=0) const
KURL::isValid
bool isValid() const
KURL::htmlRef
TQString htmlRef() const
KURL::htmlURL
TQString htmlURL() const
KURL::hasRef
bool hasRef() const
KWin::activateWindow
static void activateWindow(WId win, long time=0)
KXMLGUIClient
KXMLGUIClient::plugActionList
void plugActionList(const TQString &name, const TQPtrList< TDEAction > &actionList)
KXMLGUIClient::unplugActionList
void unplugActionList(const TQString &name)
KXMLGUIClient::removeChildClient
void removeChildClient(KXMLGUIClient *child)
KXMLGUIClient::instance
virtual TDEInstance * instance() const
KXMLGUIClient::setXMLFile
virtual void setXMLFile(const TQString &file, bool merge=false, bool setXMLDoc=true)
KXMLGUIClient::factory
KXMLGUIFactory * factory() const
KXMLGUIClient::action
TDEAction * action(const char *name) const
KXMLGUIClient::childClients
const TQPtrList< KXMLGUIClient > * childClients()
KXMLGUIClient::actionCollection
virtual TDEActionCollection * actionCollection() const
KXMLGUIClient::insertChildClient
void insertChildClient(KXMLGUIClient *child)
KXMLGUIFactory::removeClient
void removeClient(KXMLGUIClient *client)
KXMLGUIFactory::addClient
void addClient(KXMLGUIClient *client)
TDEActionMenu
TDEAction
TDEApplication::tdeinitExec
static int tdeinitExec(const TQString &name, const TQStringList &args, TQString *error, int *pid, const TQCString &startup_id)
TDEApplication::startServiceByDesktopName
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)
TDEConfigBase::readNumEntry
int readNumEntry(const TQString &pKey, int nDefault=0) const
TDEConfigBase::readBoolEntry
bool readBoolEntry(const TQString &pKey, bool bDefault=false) const
TDEConfigBase::deleteEntry
void deleteEntry(const TQString &pKey, bool bNLS=false, bool bGlobal=false)
TDEConfigBase::hasGroup
bool hasGroup(const TQString &group) const
TDEConfigBase::sync
virtual void sync()
TDEConfigBase::writeEntry
void writeEntry(const TQString &pKey, const TQString &pValue, bool bPersistent=true, bool bGlobal=false, bool bNLS=false)
TDEConfigBase::setGroup
void setGroup(const TQString &group)
TDEConfigGroupSaver
TDEConfig
TDEGlobalSettings::showIconsOnPushButtons
static bool showIconsOnPushButtons()
TDEGlobalSettings::dndEventDelay
static int dndEventDelay()
TDEGlobal::config
static TDEConfig * config()
TDEGlobal::charsets
static KCharsets * charsets()
TDEGlobal::locale
static TDELocale * locale()
TDEHTMLPageCache::createCacheEntry
long createCacheEntry()
Create a new cache entry.
Definition: tdehtml_pagecache.cpp:143
TDEHTMLPageCache::addData
void addData(long id, const TQByteArray &data)
Add data to the cache entry with id id.
Definition: tdehtml_pagecache.cpp:158
TDEHTMLPageCache::endData
void endData(long id)
Signal end of data for the cache entry with id id.
Definition: tdehtml_pagecache.cpp:166
TDEHTMLPageCache::saveData
void saveData(long id, TQDataStream *str)
Save the data of cache entry id to the datastream str.
Definition: tdehtml_pagecache.cpp:272
TDEHTMLPageCache::isComplete
bool isComplete(long id)
Definition: tdehtml_pagecache.cpp:191
TDEHTMLPageCache::self
static TDEHTMLPageCache * self()
static "constructor".
Definition: tdehtml_pagecache.cpp:121
TDEHTMLPageCache::fetchData
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.
Definition: tdehtml_pagecache.cpp:200
TDEHTMLPageCache::cancelEntry
void cancelEntry(long id)
Cancel the entry.
Definition: tdehtml_pagecache.cpp:174
TDEHTMLPageCache::cancelFetch
void cancelFetch(TQObject *recvObj)
Cancel sending data to recvObj.
Definition: tdehtml_pagecache.cpp:218
TDEHTMLPartBrowserExtension
This is the BrowserExtension for a TDEHTMLPart document.
Definition: tdehtml_ext.h:42
TDEHTMLPartIface
DCOP interface for TDEHTML.
Definition: tdehtml_iface.h:33
TDEHTMLPart
This class is tdehtml's main class.
Definition: tdehtml_part.h:184
TDEHTMLPart::toplevelURL
KURL toplevelURL()
Returns the toplevel (origin) URL of this document, even if this part is a frame or an iframe.
Definition: tdehtml_part.cpp:7338
TDEHTMLPart::selection
DOM::Range selection() const
Returns the selected part of the HTML.
Definition: tdehtml_part.cpp:3606
TDEHTMLPart::isModified
bool isModified() const
Checks whether the page contains unsubmitted form changes.
Definition: tdehtml_part.cpp:7350
TDEHTMLPart::frameNames
TQStringList frameNames() const
Returns a list of names of all frame (including iframe) objects of the current document.
Definition: tdehtml_part.cpp:5891
TDEHTMLPart::setEditable
void setEditable(bool enable)
Makes the document editable.
Definition: tdehtml_part.cpp:2667
TDEHTMLPart::findFrameParent
TDEHTMLPart * findFrameParent(KParts::ReadOnlyPart *callingPart, const TQString &f, tdehtml::ChildFrame **childFrame=0)
Recursively finds the part containing the frame with name f and checks if it is accessible by calling...
Definition: tdehtml_part.cpp:5215
TDEHTMLPart::jsStatusBarText
TQString jsStatusBarText() const
Called by KJS.
Definition: tdehtml_part.cpp:5799
TDEHTMLPart::executeScript
TQVariant executeScript(const DOM::Node &n, const TQString &script)
Same as executeScript( const TQString & ) except with the Node parameter specifying the 'this' value.
Definition: tdehtml_part.cpp:1186
TDEHTMLPart::document
DOM::Document document() const
Returns a reference to the DOM document.
Definition: tdehtml_part.cpp:859
TDEHTMLPart::createJavaContext
KJavaAppletContext * createJavaContext()
Returns the java context of the applets.
Definition: tdehtml_part.cpp:1268
TDEHTMLPart::setSelection
void setSelection(const DOM::Range &)
Sets the current selection.
Definition: tdehtml_part.cpp:3668
TDEHTMLPart::doCloseStream
virtual bool doCloseStream()
Implements the streaming API of KParts::ReadOnlyPart.
Definition: tdehtml_part.cpp:2042
TDEHTMLPart::popupMenu
void popupMenu(const TQString &url, const TQPoint &point)
Emitted when the user clicks the right mouse button on the document.
TDEHTMLPart::tdehtmlMouseDoubleClickEvent
virtual void tdehtmlMouseDoubleClickEvent(tdehtml::MouseDoubleClickEvent *)
Eventhandler for the tdehtml::MouseDoubleClickEvent.
Definition: tdehtml_part.cpp:6129
TDEHTMLPart::pluginsEnabled
bool pluginsEnabled() const
Returns true if plugins are enabled/disabled.
Definition: tdehtml_part.cpp:1279
TDEHTMLPart::selectAll
void selectAll()
Marks all text in the document as selected.
Definition: tdehtml_part.cpp:6749
TDEHTMLPart::caretDisplayPolicyNonFocused
CaretDisplayPolicy caretDisplayPolicyNonFocused() const
Returns the current caret policy when the view is not focused.
Definition: tdehtml_part.cpp:2702
TDEHTMLPart::CaretDisplayPolicy
CaretDisplayPolicy
Enumeration for displaying the caret.
Definition: tdehtml_part.h:495
TDEHTMLPart::nonSharedNodeUnderMouse
DOM::Node nonSharedNodeUnderMouse() const
Returns the Node currently under the mouse that is not shared.
Definition: tdehtml_part.cpp:5649
TDEHTMLPart::prevAnchor
bool prevAnchor()
Go to previous anchor.
Definition: tdehtml_part.cpp:2578
TDEHTMLPart::pageReferrer
TQString pageReferrer() const
Referrer used to obtain this page.
Definition: tdehtml_part.cpp:5814
TDEHTMLPart::setJSDefaultStatusBarText
void setJSDefaultStatusBarText(const TQString &text)
Called by KJS.
Definition: tdehtml_part.cpp:5794
TDEHTMLPart::setCaretMode
void setCaretMode(bool enable)
Enables/disables caret mode.
Definition: tdehtml_part.cpp:2645
TDEHTMLPart::openFile
virtual bool openFile()
Internal empty reimplementation of KParts::ReadOnlyPart::openFile .
Definition: tdehtml_part.cpp:1498
TDEHTMLPart::framejScript
KJSProxy * framejScript(KParts::ReadOnlyPart *framePart)
Returns child frame framePart its script interpreter.
Definition: tdehtml_part.cpp:5303
TDEHTMLPart::setSuppressedPopupIndicator
void setSuppressedPopupIndicator(bool enable)
Shows or hides the suppressed popup indicator.
Definition: tdehtml_part.cpp:7373
TDEHTMLPart::setURLCursor
void setURLCursor(const TQCursor &c)
Sets the cursor to use when the cursor is on a link.
Definition: tdehtml_part.cpp:2597
TDEHTMLPart::zoomFactor
int zoomFactor() const
Returns the current zoom factor.
Definition: tdehtml_part.cpp:5664
TDEHTMLPart::encoding
TQString encoding() const
Returns the encoding the page currently uses.
Definition: tdehtml_part.cpp:2485
TDEHTMLPart::browserExtension
KParts::BrowserExtension * browserExtension() const
Returns a pointer to the KParts::BrowserExtension.
Definition: tdehtml_part.cpp:896
TDEHTMLPart::setStandardFont
void setStandardFont(const TQString &name)
Sets the standard font style.
Definition: tdehtml_part.cpp:2587
TDEHTMLPart::urlCursor
TQCursor urlCursor() const
Returns the cursor which is used when the cursor is on a link.
Definition: tdehtml_part.cpp:2602
TDEHTMLPart::setMetaRefreshEnabled
void setMetaRefreshEnabled(bool enable)
Enable/disable automatic forwarding by <meta http-equiv="refresh" ....
Definition: tdehtml_part.cpp:948
TDEHTMLPart::htmlDocument
DOM::HTMLDocument htmlDocument() const
Returns a reference to the DOM HTML document (for non-HTML documents, returns null)
Definition: tdehtml_part.cpp:851
TDEHTMLPart::setJSStatusBarText
void setJSStatusBarText(const TQString &text)
Called by KJS.
Definition: tdehtml_part.cpp:5789
TDEHTMLPart::isCaretMode
bool isCaretMode() const
Returns whether caret mode is on/off.
Definition: tdehtml_part.cpp:2662
TDEHTMLPart::onlyLocalReferences
bool onlyLocalReferences() const
Returns whether only file:/ or data:/ references are allowed to be loaded ( default false ).
Definition: tdehtml_part.cpp:2607
TDEHTMLPart::doWriteStream
virtual bool doWriteStream(const TQByteArray &data)
Implements the streaming API of KParts::ReadOnlyPart.
Definition: tdehtml_part.cpp:2036
TDEHTMLPart::view
TDEHTMLView * view() const
Returns a pointer to the HTML document's view.
Definition: tdehtml_part.cpp:906
TDEHTMLPart::dndEnabled
bool dndEnabled() const
Returns whether Dragn'n'Drop support is enabled or not.
Definition: tdehtml_part.cpp:5939
TDEHTMLPart::saveState
virtual void saveState(TQDataStream &stream)
Saves the TDEHTMLPart's complete state (including child frame objects) to the provided TQDataStream.
Definition: tdehtml_part.cpp:5358
TDEHTMLPart::hasSelection
bool hasSelection() const
Has the user selected anything?
Definition: tdehtml_part.cpp:3596
TDEHTMLPart::preloadStyleSheet
void preloadStyleSheet(const TQString &url, const TQString &stylesheet)
Loads a style sheet into the stylesheet cache.
Definition: tdehtml_part.cpp:6973
TDEHTMLPart::jScriptInterpreter
KJS::Interpreter * jScriptInterpreter()
Returns the JavaScript interpreter the part is using.
Definition: tdehtml_part.cpp:916
TDEHTMLPart::guiActivateEvent
virtual void guiActivateEvent(KParts::GUIActivateEvent *event)
Internal reimplementation of KParts::Part::guiActivateEvent .
Definition: tdehtml_part.cpp:6636
TDEHTMLPart::selectedTextAsHTML
TQString selectedTextAsHTML() const
Return the text the user has marked.
Definition: tdehtml_part.cpp:3437
TDEHTMLPart::caretPositionChanged
void caretPositionChanged(const DOM::Node &node, long offset)
This signal is emitted whenever the caret position has been changed.
TDEHTMLPart::setJavaEnabled
void setJavaEnabled(bool enable)
Enables/disables Java applet support.
Definition: tdehtml_part.cpp:1244
TDEHTMLPart::referrer
TQString referrer() const
Referrer used for links in this page.
Definition: tdehtml_part.cpp:5809
TDEHTMLPart::setEncoding
bool setEncoding(const TQString &name, bool override=false)
Sets the encoding the page uses.
Definition: tdehtml_part.cpp:2467
TDEHTMLPart::nextAnchor
bool nextAnchor()
Go to the next anchor.
Definition: tdehtml_part.cpp:2569
TDEHTMLPart::gotoAnchor
bool gotoAnchor(const TQString &name)
Finds the anchor named name.
Definition: tdehtml_part.cpp:2521
TDEHTMLPart::documentSource
TQString documentSource() const
Returns the content of the source document.
Definition: tdehtml_part.cpp:864
TDEHTMLPart::openURL
virtual bool openURL(const KURL &url)
Opens the specified URL url.
Definition: tdehtml_part.cpp:565
TDEHTMLPart::selectedText
virtual TQString selectedText() const
Returns the text the user has marked.
Definition: tdehtml_part.cpp:3454
TDEHTMLPart::backgroundURL
KURL backgroundURL() const
Returns the URL for the background Image (used by save background)
Definition: tdehtml_part.cpp:4117
TDEHTMLPart::showError
virtual void showError(TDEIO::Job *job)
Called when a certain error situation (i.e.
Definition: tdehtml_part.cpp:1702
TDEHTMLPart::tdehtmlMousePressEvent
virtual void tdehtmlMousePressEvent(tdehtml::MousePressEvent *event)
Eventhandler of the tdehtml::MousePressEvent.
Definition: tdehtml_part.cpp:6049
TDEHTMLPart::partManager
KParts::PartManager * partManager()
Returns a reference to the partmanager instance which manages html frame objects.
Definition: tdehtml_part.cpp:4703
TDEHTMLPart::statusMessagesEnabled
bool statusMessagesEnabled() const
Returns true if status messages are enabled.
Definition: tdehtml_part.cpp:925
TDEHTMLPart::begin
virtual void begin(const KURL &url=KURL(), int xOffset=0, int yOffset=0)
Clears the widget and prepares it for new content.
Definition: tdehtml_part.cpp:1875
TDEHTMLPart::findTextBegin
void findTextBegin()
Initiates a text search.
Definition: tdehtml_part.cpp:2737
TDEHTMLPart::setFormNotification
void setFormNotification(FormNotification fn)
Determine if signal should be emitted before, instead or never when a submitForm() happens.
Definition: tdehtml_part.cpp:7330
TDEHTMLPart::activeNode
DOM::Node activeNode() const
Returns the node that has the keyboard focus.
Definition: tdehtml_part.cpp:6938
TDEHTMLPart::~TDEHTMLPart
virtual ~TDEHTMLPart()
Destructor.
Definition: tdehtml_part.cpp:467
TDEHTMLPart::setOnlyLocalReferences
void setOnlyLocalReferences(bool enable)
Security option.
Definition: tdehtml_part.cpp:2612
TDEHTMLPart::setZoomFactor
void setZoomFactor(int percent)
Sets the Zoom factor.
Definition: tdehtml_part.cpp:5728
TDEHTMLPart::autoloadImages
bool autoloadImages() const
Returns whether images contained in the document are loaded automatically or not.
Definition: tdehtml_part.cpp:1359
TDEHTMLPart::stopAnimations
void stopAnimations()
Stops all animated images on the current and child pages.
Definition: tdehtml_part.cpp:2055
TDEHTMLPart::htmlError
void htmlError(int errorCode, const TQString &text, const KURL &reqUrl)
presents a detailed error message to the user.
Definition: tdehtml_part.cpp:1719
TDEHTMLPart::setDNDEnabled
void setDNDEnabled(bool b)
Enables or disables Drag'n'Drop support.
Definition: tdehtml_part.cpp:5934
TDEHTMLPart::show
void show()
Convenience method to show the document's view.
Definition: tdehtml_part.cpp:5632
TDEHTMLPart::setJScriptEnabled
void setJScriptEnabled(bool enable)
Enable/disable Javascript support.
Definition: tdehtml_part.cpp:930
TDEHTMLPart::onURL
void onURL(const TQString &url)
Emitted if the cursor is moved over an URL.
TDEHTMLPart::formNotification
FormNotification formNotification() const
Determine if signal should be emitted before, instead or never when a submitForm() happens.
Definition: tdehtml_part.cpp:7334
TDEHTMLPart::isEditable
bool isEditable() const
Returns true if the document is editable, false otherwise.
Definition: tdehtml_part.cpp:2683
TDEHTMLPart::TDEHTMLPart
TDEHTMLPart(TQWidget *parentWidget=0, const char *widgetname=0, TQObject *parent=0, const char *name=0, GUIProfile prof=DefaultGUI)
Constructs a new TDEHTMLPart.
Definition: tdehtml_part.cpp:205
TDEHTMLPart::doOpenStream
virtual bool doOpenStream(const TQString &mimeType)
Implements the streaming API of KParts::ReadOnlyPart.
Definition: tdehtml_part.cpp:2025
TDEHTMLPart::write
virtual void write(const char *str, int len=-1)
Writes another part of the HTML code to the widget.
Definition: tdehtml_part.cpp:1963
TDEHTMLPart::currentFrame
KParts::ReadOnlyPart * currentFrame() const
Return the current frame (the one that has focus) Not necessarily a direct child of ours,...
Definition: tdehtml_part.cpp:5276
TDEHTMLPart::frameExists
bool frameExists(const TQString &frameName)
Returns whether a frame with the specified name is exists or not.
Definition: tdehtml_part.cpp:5291
TDEHTMLPart::end
virtual void end()
Call this after your last call to write().
Definition: tdehtml_part.cpp:2010
TDEHTMLPart::setCaretVisible
void setCaretVisible(bool show)
Sets the visibility of the caret.
Definition: tdehtml_part.cpp:2718
TDEHTMLPart::lastModified
TQString lastModified() const
Last-modified date (in raw string format), if received in the [HTTP] headers.
Definition: tdehtml_part.cpp:5835
TDEHTMLPart::findTextNext
bool findTextNext()
Finds the next occurence of a string set by findText()
Definition: tdehtml_part.cpp:3063
TDEHTMLPart::setPluginsEnabled
void setPluginsEnabled(bool enable)
Enables or disables plugins, default is enabled.
Definition: tdehtml_part.cpp:1273
TDEHTMLPart::jsDefaultStatusBarText
TQString jsDefaultStatusBarText() const
Called by KJS.
Definition: tdehtml_part.cpp:5804
TDEHTMLPart::createPart
virtual KParts::ReadOnlyPart * createPart(TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name, const TQString &mimetype, TQString &serviceName, TQStringList &serviceTypes, const TQStringList &params)
This method is called when a new embedded object (include html frames) is to be created.
Definition: tdehtml_part.cpp:4649
TDEHTMLPart::findFrame
TDEHTMLPart * findFrame(const TQString &f)
Finds a frame by name.
Definition: tdehtml_part.cpp:5257
TDEHTMLPart::nodeUnderMouse
DOM::Node nodeUnderMouse() const
Returns the Node currently under the mouse.
Definition: tdehtml_part.cpp:5644
TDEHTMLPart::metaRefreshEnabled
bool metaRefreshEnabled() const
Returns true if automatic forwarding is enabled.
Definition: tdehtml_part.cpp:953
TDEHTMLPart::setCaretDisplayPolicyNonFocused
void setCaretDisplayPolicyNonFocused(CaretDisplayPolicy policy)
Sets the caret display policy when the view is not focused.
Definition: tdehtml_part.cpp:2711
TDEHTMLPart::setUserStyleSheet
void setUserStyleSheet(const KURL &url)
Sets a user defined style sheet to be used on top of the HTML 4 default style sheet.
Definition: tdehtml_part.cpp:2509
TDEHTMLPart::setStatusMessagesEnabled
void setStatusMessagesEnabled(bool enable)
Enable/disable statusbar messages.
Definition: tdehtml_part.cpp:911
TDEHTMLPart::paint
void paint(TQPainter *, const TQRect &, int=0, bool *=0)
Paints the HTML page to a TQPainter.
Definition: tdehtml_part.cpp:2049
TDEHTMLPart::nodeActivated
void nodeActivated(const DOM::Node &)
This signal is emitted when an element retrieves the keyboard focus.
TDEHTMLPart::formSubmitNotification
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...
TDEHTMLPart::hide
void hide()
Convenience method to hide the document's view.
Definition: tdehtml_part.cpp:5638
TDEHTMLPart::findFramePart
KParts::ReadOnlyPart * findFramePart(const TQString &f)
Finds a frame by name.
Definition: tdehtml_part.cpp:5270
TDEHTMLPart::closeURL
virtual bool closeURL()
Stops loading the document and kills all data requests (for images, etc.)
Definition: tdehtml_part.cpp:769
TDEHTMLPart::setActiveNode
void setActiveNode(const DOM::Node &node)
Sets the focused node of the document to the specified node.
Definition: tdehtml_part.cpp:6924
TDEHTMLPart::tdehtmlDrawContentsEvent
virtual void tdehtmlDrawContentsEvent(tdehtml::DrawContentsEvent *)
Eventhandler for the tdehtml::DrawContentsEvent.
Definition: tdehtml_part.cpp:6632
TDEHTMLPart::tdehtmlMouseReleaseEvent
virtual void tdehtmlMouseReleaseEvent(tdehtml::MouseReleaseEvent *event)
Eventhandler for the tdehtml::MouseMouseReleaseEvent.
Definition: tdehtml_part.cpp:6518
TDEHTMLPart::javaEnabled
bool javaEnabled() const
Return true if Java applet support is enabled, false if disabled.
Definition: tdehtml_part.cpp:1250
TDEHTMLPart::tdehtmlMouseMoveEvent
virtual void tdehtmlMouseMoveEvent(tdehtml::MouseMoveEvent *event)
Eventhandler for the tdehtml::MouseMouseMoveEvent.
Definition: tdehtml_part.cpp:6379
TDEHTMLPart::jScriptEnabled
bool jScriptEnabled() const
Returns true if Javascript support is enabled or false otherwise.
Definition: tdehtml_part.cpp:939
TDEHTMLPart::findText
void findText()
Starts a new search by popping up a dialog asking the user what he wants to search for.
Definition: tdehtml_part.cpp:2996
TDEHTMLPart::selectionChanged
void selectionChanged()
This signal is emitted when the selection changes.
TDEHTMLPart::scheduleRedirection
void scheduleRedirection(int delay, const TQString &url, bool lockHistory=true)
Schedules a redirection after delay seconds.
Definition: tdehtml_part.cpp:2383
TDEHTMLPart::setCaretPosition
void setCaretPosition(DOM::Node node, long offset, bool extendSelection=false)
Sets the caret to the given position.
Definition: tdehtml_part.cpp:2688
TDEHTMLPart::completeURL
KURL completeURL(const TQString &url)
returns a KURL object for the given url.
Definition: tdehtml_part.cpp:2371
TDEHTMLPart::parentPart
TDEHTMLPart * parentPart()
Returns a pointer to the parent TDEHTMLPart if the part is a frame in an HTML frameset.
Definition: tdehtml_part.cpp:5321
TDEHTMLPart::setAutoloadImages
void setAutoloadImages(bool enable)
Specifies whether images contained in the document should be loaded automatically or not.
Definition: tdehtml_part.cpp:1335
TDEHTMLPart::restoreState
virtual void restoreState(TQDataStream &stream)
Restores the TDEHTMLPart's previously saved state (including child frame objects) from the provided T...
Definition: tdehtml_part.cpp:5444
TDEHTMLPart::setFixedFont
void setFixedFont(const TQString &name)
Sets the fixed font style.
Definition: tdehtml_part.cpp:2592
TDEHTMLPart::preloadScript
void preloadScript(const TQString &url, const TQString &script)
Loads a script into the script cache.
Definition: tdehtml_part.cpp:6978
TDEHTMLPart::javaContext
KJavaAppletContext * javaContext()
Returns the java context of the applets.
Definition: tdehtml_part.cpp:1263
TDEHTMLSettings
Settings for the HTML view.
Definition: tdehtml_settings.h:39
TDEHTMLSettings::init
void init()
Called by constructor and reparseConfiguration.
Definition: tdehtml_settings.cpp:290
TDEHTMLView
Renders and displays HTML in a TQScrollView.
Definition: tdehtmlview.h:79
TDEIcon::Small
Small
TDEIcon::Desktop
Desktop
TDEIcon::SizeMedium
SizeMedium
TDELocale::formatDateTime
TQString formatDateTime(const TQDateTime &pDateTime, bool shortFormat=true, bool includeSecs=false) const
TDELocale::removeCatalogue
void removeCatalogue(const TQString &catalog)
TDELocale::encoding
const char * encoding() const
TDELocale::formatNumber
TQString formatNumber(double num, int precision=-1) const
TDEPopupMenu
TDESelectAction
TDEShortcut
TDEShortcut::isNull
bool isNull() const
TDEToggleAction
kdWarning
kdbgstream kdWarning(int area=0)
kdError
kdbgstream kdError(int area=0)
endl
kndbgstream & endl(kndbgstream &s)
kdDebug
kdbgstream kdDebug(int area=0)
locate
TQString locate(const char *type, const TQString &filename, const TDEInstance *instance=TDEGlobal::instance())
DOM
The Document Object Model (DOM) is divided into two parts, the COREDOM core DOM, specifying some core...
Definition: design.h:57
KNotifyClient::event
int event(const TQString &message, const TQString &text=TQString::null) TDE_DEPRECATED
KStdAction::selectAll
TDEAction * selectAll(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
KStdAction::findPrev
TDEAction * findPrev(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
KStdAction::findNext
TDEAction * findNext(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
KStdAction::find
TDEAction * find(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
KStdAction::saveAs
TDEAction * saveAs(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
TDEStdAccel::next
const TDEShortcut & next()
TDEStdAccel::name
TQString name(StdAccel id)
TDEStdAccel::end
const TDEShortcut & end()
KParts::URLArgs
KParts::URLArgs::setContentType
void setContentType(const TQString &contentType)
KParts::URLArgs::docState
TQStringList docState
KParts::URLArgs::contentType
TQString contentType() const
KParts::URLArgs::setNewTab
void setNewTab(bool newTab)
KParts::URLArgs::xOffset
int xOffset
KParts::URLArgs::setDoPost
void setDoPost(bool enable)
KParts::URLArgs::redirectedRequest
bool redirectedRequest() const
KParts::URLArgs::metaData
TQMap< TQString, TQString > & metaData()
KParts::URLArgs::frameName
TQString frameName
KParts::URLArgs::setLockHistory
void setLockHistory(bool lock)
KParts::URLArgs::reload
bool reload
KParts::URLArgs::doPost
bool doPost() const
KParts::URLArgs::yOffset
int yOffset
KParts::URLArgs::serviceType
TQString serviceType
KParts::URLArgs::setForcesNewWindow
void setForcesNewWindow(bool forcesNewWindow)
KParts::URLArgs::postData
TQByteArray postData
KParts::WindowArgs
tdelocale.h

tdehtml

Skip menu "tdehtml"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdehtml

Skip menu "tdehtml"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdehtml by doxygen 1.9.4
This website is maintained by Timothy Pearson.