• 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"
53 using 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 <kstandarddirs.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(QT_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 <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 
123 namespace 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 
154 void 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 = ::tqqt_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 
193 TDEHTMLFrameList::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 
205 TDEHTMLPart::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 
216 TDEHTMLPart::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 
228 void 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, TQT_SLOT( slotViewDocumentSource() ), actionCollection(), "viewDocumentSource" );
255  d->m_paViewFrame = new TDEAction( i18n( "View Frame Source" ), 0, this, TQT_SLOT( slotViewFrameSource() ), actionCollection(), "viewFrameSource" );
256  d->m_paViewInfo = new TDEAction( i18n( "View Document Information" ), CTRL+Key_I, this, TQT_SLOT( slotViewPageInfo() ), actionCollection(), "viewPageInfo" );
257  d->m_paSaveBackground = new TDEAction( i18n( "Save &Background Image As..." ), 0, this, TQT_SLOT( slotSaveBackground() ), actionCollection(), "saveBackground" );
258  d->m_paSaveDocument = KStdAction::saveAs( this, TQT_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, TQT_SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" );
262  d->m_paSecurity = new TDEAction( i18n( "Security..." ), "decrypted", 0, this, TQT_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, TQT_SLOT( slotDebugRenderTree() ), actionCollection(), "debugRenderTree" );
270  d->m_paDebugDOMTree = new TDEAction( i18n( "Print DOM Tree to STDOUT" ), ALT + CTRL + SHIFT + Key_D, this, TQT_SLOT( slotDebugDOMTree() ), actionCollection(), "debugDOMTree" );
271  d->m_paStopAnimations = new TDEAction( i18n( "Stop Animated Images" ), 0, this, TQT_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, TQT_SIGNAL( activated( int ) ), this, TQT_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, TQT_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, TQT_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  TQT_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  TQT_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, TQT_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, TQT_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, TQT_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, TQT_SLOT( slotFindAheadText()),
388  actionCollection(), "findAheadText");
389  d->m_paFindAheadLinks = new TDEAction( i18n("Find Links as You Type"), TDEShortcut( '\'' ), this, TQT_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, TQT_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, TQT_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, TQT_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, TQT_SIGNAL( zoomView( int ) ), TQT_SLOT( slotZoomView( int ) ) );
431 
432  connect( this, TQT_SIGNAL( completed() ),
433  this, TQT_SLOT( updateActions() ) );
434  connect( this, TQT_SIGNAL( completed( bool ) ),
435  this, TQT_SLOT( updateActions() ) );
436  connect( this, TQT_SIGNAL( started( TDEIO::Job * ) ),
437  this, TQT_SLOT( updateActions() ) );
438 
439  d->m_popupMenuXML = KXMLGUIFactory::readConfigFile( locate( "data", "tdehtml/tdehtml_popupmenu.rc", TDEHTMLFactory::instance() ) );
440 
441  connect( tdehtml::Cache::loader(), TQT_SIGNAL( requestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ),
442  this, TQT_SLOT( slotLoaderRequestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ) );
443  connect( tdehtml::Cache::loader(), TQT_SIGNAL( requestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
444  this, TQT_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
445  connect( tdehtml::Cache::loader(), TQT_SIGNAL( requestFailed( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
446  this, TQT_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
447 
448  connect ( &d->m_progressUpdateTimer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( slotProgressUpdate() ) );
449 
450  findTextBegin(); //reset find variables
451 
452  connect( &d->m_redirectionTimer, TQT_SIGNAL( timeout() ),
453  this, TQT_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 
467 TDEHTMLPart::~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(), TQT_SIGNAL( requestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ),
499  this, TQT_SLOT( slotLoaderRequestStarted( tdehtml::DocLoader*, tdehtml::CachedObject* ) ) );
500  disconnect( tdehtml::Cache::loader(), TQT_SIGNAL( requestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
501  this, TQT_SLOT( slotLoaderRequestDone( tdehtml::DocLoader*, tdehtml::CachedObject *) ) );
502  disconnect( tdehtml::Cache::loader(), TQT_SIGNAL( requestFailed( tdehtml::DocLoader*, tdehtml::CachedObject *) ),
503  this, TQT_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 
525 bool 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, TQT_SIGNAL(finishedLayout()), this, TQT_SLOT(restoreScrollPosition()));
555  connect(d->m_view, TQT_SIGNAL(finishedLayout()), this, TQT_SLOT(restoreScrollPosition()));
556 
557  TDEHTMLPageCache::self()->fetchData( d->m_cacheId, this, TQT_SLOT(slotRestoreData(const TQByteArray &)));
558 
559  emit started( 0L );
560 
561  return true;
562 }
563 
564 
565 bool 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, TQT_SIGNAL(finishedLayout()), this, TQT_SLOT(restoreScrollPosition()));
676  connect(d->m_view, TQT_SIGNAL(finishedLayout()), this, TQT_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, TQT_SIGNAL( result( TDEIO::Job* ) ),
723  TQT_SLOT( slotFinished( TDEIO::Job* ) ) );
724  connect( d->m_job, TQT_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
725  TQT_SLOT( slotData( TDEIO::Job*, const TQByteArray& ) ) );
726  connect ( d->m_job, TQT_SIGNAL( infoMessage( TDEIO::Job*, const TQString& ) ),
727  TQT_SLOT( slotInfoMessage(TDEIO::Job*, const TQString& ) ) );
728  connect( d->m_job, TQT_SIGNAL(redirection(TDEIO::Job*, const KURL& ) ),
729  TQT_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, TQT_SIGNAL( speed( TDEIO::Job*, unsigned long ) ),
746  this, TQT_SLOT( slotJobSpeed( TDEIO::Job*, unsigned long ) ) );
747 
748  connect( d->m_job, TQT_SIGNAL( percent( TDEIO::Job*, unsigned long ) ),
749  this, TQT_SLOT( slotJobPercent( TDEIO::Job*, unsigned long ) ) );
750 
751  connect( d->m_job, TQT_SIGNAL( result( TDEIO::Job* ) ),
752  this, TQT_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, TQT_SIGNAL( result( TDEIO::Job * ) ),
762  this, TQT_SLOT( slotUserSheetStatDone( TDEIO::Job * ) ) );
763  }
764  emit started( 0L );
765 
766  return true;
767 }
768 
769 bool 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, TQT_SIGNAL(finishedLayout()), this, TQT_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 
851 DOM::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 
859 DOM::Document TDEHTMLPart::document() const
860 {
861  return d->m_doc;
862 }
863 
864 TQString 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 
896 KParts::BrowserExtension *TDEHTMLPart::browserExtension() const
897 {
898  return d->m_extension;
899 }
900 
901 KParts::BrowserHostExtension *TDEHTMLPart::browserHostExtension() const
902 {
903  return d->m_hostExtension;
904 }
905 
906 TDEHTMLView *TDEHTMLPart::view() const
907 {
908  return d->m_view;
909 }
910 
911 void TDEHTMLPart::setStatusMessagesEnabled( bool enable )
912 {
913  d->m_statusMessagesEnabled = enable;
914 }
915 
916 KJS::Interpreter *TDEHTMLPart::jScriptInterpreter()
917 {
918  KJSProxy *proxy = jScript();
919  if (!proxy || proxy->paused())
920  return 0;
921 
922  return proxy->interpreter();
923 }
924 
925 bool TDEHTMLPart::statusMessagesEnabled() const
926 {
927  return d->m_statusMessagesEnabled;
928 }
929 
930 void 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 
939 bool 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 
948 void TDEHTMLPart::setMetaRefreshEnabled( bool enable )
949 {
950  d->m_metaRefreshEnabled = enable;
951 }
952 
953 bool 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
968 extern "C" { KJSProxy *kjs_html_init(tdehtml::ChildFrame * childframe); }
969 #endif
970 
971 static 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 
997 KJSProxy *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 
1027 TQVariant 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 
1065 KJSErrorDlg *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, TQT_SIGNAL(leftClickedURL()), TQT_SLOT(launchJSErrorDialog()));
1083  connect(d->m_statusBarJSErrorLabel, TQT_SIGNAL(rightClickedURL()), TQT_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 
1096 void 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 
1110 void 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 
1120 void TDEHTMLPart::jsErrorDialogContextMenu() {
1121  TDEPopupMenu *m = new TDEPopupMenu(0L);
1122  m->insertItem(i18n("&Hide Errors"), this, TQT_SLOT(removeJSErrorExtension()));
1123  m->insertItem(i18n("&Disable Error Reporting"), this, TQT_SLOT(disableJSErrorExtension()));
1124  m->popup(TQCursor::pos());
1125 }
1126 
1127 void TDEHTMLPart::launchJSErrorDialog() {
1128  KJSErrorDlg *dlg = jsErrorExtension();
1129  if (dlg) {
1130  dlg->show();
1131  dlg->raise();
1132  }
1133 }
1134 
1135 void TDEHTMLPart::launchJSConfigDialog() {
1136  TQStringList args;
1137  args << "tdehtml_java_js";
1138  TDEApplication::tdeinitExec( "tdecmshell", args );
1139 }
1140 
1141 TQVariant 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 
1181 TQVariant TDEHTMLPart::executeScript( const TQString &script )
1182 {
1183  return executeScript( DOM::Node(), script );
1184 }
1185 
1186 TQVariant 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 
1220 bool 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 
1230 TQVariant 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 
1244 void TDEHTMLPart::setJavaEnabled( bool enable )
1245 {
1246  d->m_bJavaForce = enable;
1247  d->m_bJavaOverride = true;
1248 }
1249 
1250 bool TDEHTMLPart::javaEnabled() const
1251 {
1252  if (onlyLocalReferences()) return false;
1253 
1254 #ifndef Q_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 
1263 KJavaAppletContext *TDEHTMLPart::javaContext()
1264 {
1265  return 0;
1266 }
1267 
1268 KJavaAppletContext *TDEHTMLPart::createJavaContext()
1269 {
1270  return 0;
1271 }
1272 
1273 void TDEHTMLPart::setPluginsEnabled( bool enable )
1274 {
1275  d->m_bPluginsForce = enable;
1276  d->m_bPluginsOverride = true;
1277 }
1278 
1279 bool 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 
1288 static int s_DOMTreeIndentLevel = 0;
1289 
1290 void 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 
1310 void TDEHTMLPart::slotDebugScript()
1311 {
1312  if (jScript())
1313  jScript()->showDebugWindow();
1314 }
1315 
1316 void 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 
1330 void TDEHTMLPart::slotStopAnimations()
1331 {
1332  stopAnimations();
1333 }
1334 
1335 void 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, TQT_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 
1359 bool TDEHTMLPart::autoloadImages() const
1360 {
1361  if ( d->m_doc )
1362  return d->m_doc->docLoader()->autoloadImages();
1363 
1364  return true;
1365 }
1366 
1367 void 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(), TQT_SIGNAL( activePartChanged( KParts::Part * ) ),
1433  this, TQT_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(), TQT_SIGNAL( activePartChanged( KParts::Part * ) ),
1468  this, TQT_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 QT_NO_CLIPBOARD
1486  connect( kapp->clipboard(), TQT_SIGNAL( selectionChanged()), TQT_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 
1498 bool TDEHTMLPart::openFile()
1499 {
1500  return true;
1501 }
1502 
1503 DOM::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 
1510 DOM::DocumentImpl *TDEHTMLPart::xmlDocImpl() const
1511 {
1512  if ( d )
1513  return d->m_doc;
1514  return 0;
1515 }
1516 
1517 void 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 
1525 void 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, TQT_SIGNAL( leftClickedURL() ), TQT_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 
1568 void 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 
1675 void 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 
1702 void 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
1719 void 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 
1818 void 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 = ::tqqt_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 
1875 void 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,TQT_SIGNAL(finishedParsing()),this,TQT_SLOT(slotFinishedParsing()));
1957 
1958  emit d->m_extension->enableAction( "print", true );
1959 
1960  d->m_doc->setParsing(true);
1961 }
1962 
1963 void 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 
1995 void 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 
2010 void 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 
2025 bool 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 
2036 bool TDEHTMLPart::doWriteStream( const TQByteArray& data )
2037 {
2038  write( data.data(), data.size() );
2039  return true;
2040 }
2041 
2042 bool TDEHTMLPart::doCloseStream()
2043 {
2044  end();
2045  return true;
2046 }
2047 
2048 
2049 void 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 
2055 void 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 
2069 void TDEHTMLPart::resetFromScript()
2070 {
2071  closeURL();
2072  d->m_bComplete = false;
2073  d->m_bLoadEventEmitted = false;
2074  disconnect(d->m_doc,TQT_SIGNAL(finishedParsing()),this,TQT_SLOT(slotFinishedParsing()));
2075  connect(d->m_doc,TQT_SIGNAL(finishedParsing()),this,TQT_SLOT(slotFinishedParsing()));
2076  d->m_doc->setParsing(true);
2077 
2078  emit started( 0L );
2079 }
2080 
2081 void TDEHTMLPart::slotFinishedParsing()
2082 {
2083  d->m_doc->setParsing(false);
2084  checkEmitLoadEvent();
2085  disconnect(d->m_doc,TQT_SIGNAL(finishedParsing()),this,TQT_SLOT(slotFinishedParsing()));
2086 
2087  if (!d->m_view)
2088  return; // We are probably being destructed.
2089 
2090  checkCompleted();
2091 }
2092 
2093 void 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 
2108 void 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 
2125 void 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 
2146 void TDEHTMLPart::slotJobSpeed( TDEIO::Job* /*job*/, unsigned long speed )
2147 {
2148  d->m_jobspeed = speed;
2149  if (!parentPart())
2150  setStatusBarText(jsStatusBarText(), BarOverrideText);
2151 }
2152 
2153 void 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 
2161 void TDEHTMLPart::slotJobDone( TDEIO::Job* /*job*/ )
2162 {
2163  d->m_jobPercent = 100;
2164 
2165  if ( !parentPart() )
2166  d->m_progressUpdateTimer.start( 0, true );
2167 }
2168 
2169 void 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 
2200 void 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 
2318 void 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 
2350 const TDEHTMLSettings *TDEHTMLPart::settings() const
2351 {
2352  return d->m_settings;
2353 }
2354 
2355 #ifndef KDE_NO_COMPAT
2356 KURL TDEHTMLPart::baseURL() const
2357 {
2358  if ( !d->m_doc ) return KURL();
2359 
2360  return d->m_doc->baseURL();
2361 }
2362 
2363 TQString TDEHTMLPart::baseTarget() const
2364 {
2365  if ( !d->m_doc ) return TQString();
2366 
2367  return d->m_doc->baseTarget();
2368 }
2369 #endif
2370 
2371 KURL 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.
2383 void 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 
2400 void 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 (!kapp || !kapp->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 
2459 void 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 
2467 bool 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 
2485 TQString 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 
2496 TQString 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 
2509 void 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 
2515 void TDEHTMLPart::setUserStyleSheet(const TQString &styleSheet)
2516 {
2517  if ( d->m_doc )
2518  d->m_doc->setUserStyleSheet( styleSheet );
2519 }
2520 
2521 bool 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 
2569 bool TDEHTMLPart::nextAnchor()
2570 {
2571  if (!d->m_doc)
2572  return false;
2573  d->m_view->focusNextPrevNode ( true );
2574 
2575  return true;
2576 }
2577 
2578 bool TDEHTMLPart::prevAnchor()
2579 {
2580  if (!d->m_doc)
2581  return false;
2582  d->m_view->focusNextPrevNode ( false );
2583 
2584  return true;
2585 }
2586 
2587 void TDEHTMLPart::setStandardFont( const TQString &name )
2588 {
2589  d->m_settings->setStdFontName(name);
2590 }
2591 
2592 void TDEHTMLPart::setFixedFont( const TQString &name )
2593 {
2594  d->m_settings->setFixedFontName(name);
2595 }
2596 
2597 void TDEHTMLPart::setURLCursor( const TQCursor &c )
2598 {
2599  d->m_linkCursor = c;
2600 }
2601 
2602 TQCursor TDEHTMLPart::urlCursor() const
2603 {
2604  return d->m_linkCursor;
2605 }
2606 
2607 bool TDEHTMLPart::onlyLocalReferences() const
2608 {
2609  return d->m_onlyLocalReferences;
2610 }
2611 
2612 void TDEHTMLPart::setOnlyLocalReferences(bool enable)
2613 {
2614  d->m_onlyLocalReferences = enable;
2615 }
2616 
2617 void 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 
2645 void 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 
2662 bool TDEHTMLPart::isCaretMode() const
2663 {
2664  return d->m_caretMode;
2665 }
2666 
2667 void 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 
2683 bool TDEHTMLPart::isEditable() const
2684 {
2685  return d->m_designMode;
2686 }
2687 
2688 void 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 
2702 TDEHTMLPart::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 
2711 void TDEHTMLPart::setCaretDisplayPolicyNonFocused(CaretDisplayPolicy policy)
2712 {
2713 #ifndef TDEHTML_NO_CARET
2714  view()->setCaretDisplayPolicyNonFocused(policy);
2715 #endif // TDEHTML_NO_CARET
2716 }
2717 
2718 void 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 
2737 void 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 
2750 bool 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)
2823 bool 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 
2904 void 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 
2917 void 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 
2930 void 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 
2943 void TDEHTMLPart::slotFindDone()
2944 {
2945  // ### remove me
2946 }
2947 
2948 void 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 
2963 void 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 
2978 void 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 
2988 void 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 
2996 void 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 QT_NO_CLIPBOARD
3011  disconnect( kapp->clipboard(), TQT_SIGNAL(selectionChanged()), this, TQT_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, TQT_SIGNAL(okClicked()), this, TQT_SLOT(slotFindNext()) );
3030  connect( d->m_findDialog, TQT_SIGNAL(finished()), this, TQT_SLOT(slotFindDialogDestroyed()) );
3031 
3032  findText( d->m_findDialog->pattern(), 0 /*options*/, widget(), d->m_findDialog );
3033 }
3034 
3035 void 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 QT_NO_CLIPBOARD
3042  connect( kapp->clipboard(), TQT_SIGNAL(selectionChanged()), TQT_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, TQT_SIGNAL( highlight( const TQString &, int, int ) ),
3050  this, TQT_SLOT( slotHighlight( const TQString &, int, int ) ) );
3051  //connect(d->m_find, TQT_SIGNAL( findNext() ),
3052  // this, TQT_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 
3063 bool TDEHTMLPart::findTextNext()
3064 {
3065  return findTextNext( false );
3066 }
3067 
3068 // New method
3069 bool 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 
3296 void 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 
3437 TQString 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 
3454 TQString 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 
3596 bool 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 
3606 DOM::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 
3660 void 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 
3668 void 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 
3688 void 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 
3710 void 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 
3722 void 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 //
3893 void 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)
3902 bool 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 == Qt::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 == Qt::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 
4017 void 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 
4036 void 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 
4089 void 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 
4117 KURL 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 
4128 void 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 
4135 void 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 
4147 void 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 
4206 void 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 
4222 void 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 
4232 void 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 
4242 void 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 
4299 KParts::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 
4307 bool 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 
4345 TQString TDEHTMLPart::requestFrameName()
4346 {
4347  return TQString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
4348 }
4349 
4350 bool 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 
4369 bool 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 
4426 bool 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 (!::tqqt_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, TQT_SIGNAL(partEvent(const unsigned long, const TQString &, const KParts::LiveConnectExtension::ArgList &)), child, TQT_SLOT(liveConnectEvent(const unsigned long, const TQString&, const KParts::LiveConnectExtension::ArgList &)));
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 (::tqqt_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, TQT_SIGNAL(partEvent(const unsigned long, const TQString &, const KParts::LiveConnectExtension::ArgList &)), child, TQT_SLOT(liveConnectEvent(const unsigned long, const TQString&, const KParts::LiveConnectExtension::ArgList &)));
4519  }
4520  KParts::StatusBarExtension *sb = KParts::StatusBarExtension::childObject(part);
4521  if (sb)
4522  sb->setStatusBar( d->m_statusBarExtension->statusBar() );
4523 
4524  connect( part, TQT_SIGNAL( started( TDEIO::Job *) ),
4525  this, TQT_SLOT( slotChildStarted( TDEIO::Job *) ) );
4526  connect( part, TQT_SIGNAL( completed() ),
4527  this, TQT_SLOT( slotChildCompleted() ) );
4528  connect( part, TQT_SIGNAL( completed(bool) ),
4529  this, TQT_SLOT( slotChildCompleted(bool) ) );
4530  connect( part, TQT_SIGNAL( setStatusBarText( const TQString & ) ),
4531  this, TQT_SIGNAL( setStatusBarText( const TQString & ) ) );
4532  if ( part->inherits( "TDEHTMLPart" ) )
4533  {
4534  connect( this, TQT_SIGNAL( completed() ),
4535  part, TQT_SLOT( slotParentCompleted() ) );
4536  connect( this, TQT_SIGNAL( completed(bool) ),
4537  part, TQT_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, TQT_SIGNAL( docCreated() ),
4541  this, TQT_SLOT( slotChildDocCreated() ) );
4542  }
4543 
4544  child->m_extension = KParts::BrowserExtension::childObject( part );
4545 
4546  if ( child->m_extension )
4547  {
4548  connect( child->m_extension, TQT_SIGNAL( openURLNotify() ),
4549  d->m_extension, TQT_SIGNAL( openURLNotify() ) );
4550 
4551  connect( child->m_extension, TQT_SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ),
4552  this, TQT_SLOT( slotChildURLRequest( const KURL &, const KParts::URLArgs & ) ) );
4553 
4554  connect( child->m_extension, TQT_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ),
4555  d->m_extension, TQT_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ) );
4556  connect( child->m_extension, TQT_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs &, const KParts::WindowArgs &, KParts::ReadOnlyPart *& ) ),
4557  d->m_extension, TQT_SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & , const KParts::WindowArgs &, KParts::ReadOnlyPart *&) ) );
4558 
4559  connect( child->m_extension, TQT_SIGNAL( popupMenu( const TQPoint &, const KFileItemList & ) ),
4560  d->m_extension, TQT_SIGNAL( popupMenu( const TQPoint &, const KFileItemList & ) ) );
4561  connect( child->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList & ) ),
4562  d->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList & ) ) );
4563  connect( child->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags ) ),
4564  d->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KFileItemList &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags ) ) );
4565  connect( child->m_extension, TQT_SIGNAL( popupMenu( const TQPoint &, const KURL &, const TQString &, mode_t ) ),
4566  d->m_extension, TQT_SIGNAL( popupMenu( const TQPoint &, const KURL &, const TQString &, mode_t ) ) );
4567  connect( child->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const TQString &, mode_t ) ),
4568  d->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const TQString &, mode_t ) ) );
4569  connect( child->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t ) ),
4570  d->m_extension, TQT_SIGNAL( popupMenu( KXMLGUIClient *, const TQPoint &, const KURL &, const KParts::URLArgs &, KParts::BrowserExtension::PopupFlags, mode_t ) ) );
4571 
4572  connect( child->m_extension, TQT_SIGNAL( infoMessage( const TQString & ) ),
4573  d->m_extension, TQT_SIGNAL( infoMessage( const TQString & ) ) );
4574 
4575  connect( child->m_extension, TQT_SIGNAL( requestFocus( KParts::ReadOnlyPart * ) ),
4576  this, TQT_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 
4649 KParts::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( TQT_TQOBJECT(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 
4703 KParts::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, TQT_SIGNAL( activePartChanged( KParts::Part * ) ),
4710  this, TQT_SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
4711  connect( d->m_manager, TQT_SIGNAL( partRemoved( KParts::Part * ) ),
4712  this, TQT_SLOT( slotPartRemoved( KParts::Part * ) ) );
4713  }
4714 
4715  return d->m_manager;
4716 }
4717 
4718 void TDEHTMLPart::submitFormAgain()
4719 {
4720  disconnect(this, TQT_SIGNAL(completed()), this, TQT_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 
4728 void 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 
4733 void 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 = kapp->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, TQT_SIGNAL(completed()), this, TQT_SLOT(submitFormAgain()));
4928  }
4929  else
4930  {
4931  emit d->m_extension->openURLRequest( u, args );
4932  }
4933 }
4934 
4935 void 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 
5024 void 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 
5034 void TDEHTMLPart::slotChildStarted( TDEIO::Job *job )
5035 {
5036  tdehtml::ChildFrame *child = frame( TQT_TQOBJECT_CONST(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 
5056 void TDEHTMLPart::slotChildCompleted()
5057 {
5058  slotChildCompleted( false );
5059 }
5060 
5061 void TDEHTMLPart::slotChildCompleted( bool pendingAction )
5062 {
5063  tdehtml::ChildFrame *child = frame( TQT_TQOBJECT_CONST(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 
5074 void 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, TQT_SIGNAL( docCreated() ), this, TQT_SLOT( slotChildDocCreated() ) );
5092 }
5093 
5094 void TDEHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
5095 {
5096  tdehtml::ChildFrame *child = frame( TQT_TQOBJECT_CONST(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 
5153 void TDEHTMLPart::slotRequestFocus( KParts::ReadOnlyPart * )
5154 {
5155  emit d->m_extension->requestFocus(this);
5156 }
5157 
5158 tdehtml::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 
5180 bool 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 
5214 TDEHTMLPart *
5215 TDEHTMLPart::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 
5257 TDEHTMLPart *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 
5270 KParts::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 
5276 KParts::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 
5291 bool 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 
5303 KJSProxy *TDEHTMLPart::framejScript(KParts::ReadOnlyPart *framePart)
5304 {
5305  TDEHTMLPart* const kp = ::tqqt_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 
5321 TDEHTMLPart *TDEHTMLPart::parentPart()
5322 {
5323  return ::tqqt_cast<TDEHTMLPart *>( parent() );
5324 }
5325 
5326 tdehtml::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
5355 static int s_saveStateIndentLevel = 0;
5356 #endif
5357 
5358 void 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 
5444 void 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 
5632 void TDEHTMLPart::show()
5633 {
5634  if ( d->m_view )
5635  d->m_view->show();
5636 }
5637 
5638 void TDEHTMLPart::hide()
5639 {
5640  if ( d->m_view )
5641  d->m_view->hide();
5642 }
5643 
5644 DOM::Node TDEHTMLPart::nodeUnderMouse() const
5645 {
5646  return d->m_view->nodeUnderMouse();
5647 }
5648 
5649 DOM::Node TDEHTMLPart::nonSharedNodeUnderMouse() const
5650 {
5651  return d->m_view->nonSharedNodeUnderMouse();
5652 }
5653 
5654 void 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 
5664 int TDEHTMLPart::zoomFactor() const
5665 {
5666  return d->m_zoomFactor;
5667 }
5668 
5669 // ### make the list configurable ?
5670 static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
5671 static const int zoomSizeCount = (sizeof(zoomSizes) / sizeof(int));
5672 static const int minZoom = 20;
5673 static const int maxZoom = 300;
5674 
5675 // My idea of useful stepping ;-) (LS)
5676 extern const int KDE_NO_EXPORT fastZoomSizes[] = { 20, 50, 75, 90, 100, 120, 150, 200, 300 };
5677 extern const int KDE_NO_EXPORT fastZoomSizeCount = sizeof fastZoomSizes / sizeof fastZoomSizes[0];
5678 
5679 void TDEHTMLPart::slotIncZoom()
5680 {
5681  zoomIn(zoomSizes, zoomSizeCount);
5682 }
5683 
5684 void TDEHTMLPart::slotDecZoom()
5685 {
5686  zoomOut(zoomSizes, zoomSizeCount);
5687 }
5688 
5689 void TDEHTMLPart::slotIncZoomFast()
5690 {
5691  zoomIn(fastZoomSizes, fastZoomSizeCount);
5692 }
5693 
5694 void TDEHTMLPart::slotDecZoomFast()
5695 {
5696  zoomOut(fastZoomSizes, fastZoomSizeCount);
5697 }
5698 
5699 void 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 
5714 void 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 
5728 void 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( tqwaitCursor );
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 
5757 void TDEHTMLPart::slotZoomView( int delta )
5758 {
5759  if ( delta < 0 )
5760  slotIncZoom();
5761  else
5762  slotDecZoom();
5763 }
5764 
5765 void 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 
5789 void TDEHTMLPart::setJSStatusBarText( const TQString &text )
5790 {
5791  setStatusBarText(text, BarOverrideText);
5792 }
5793 
5794 void TDEHTMLPart::setJSDefaultStatusBarText( const TQString &text )
5795 {
5796  setStatusBarText(text, BarDefaultText);
5797 }
5798 
5799 TQString TDEHTMLPart::jsStatusBarText() const
5800 {
5801  return d->m_statusBarText[BarOverrideText];
5802 }
5803 
5804 TQString TDEHTMLPart::jsDefaultStatusBarText() const
5805 {
5806  return d->m_statusBarText[BarDefaultText];
5807 }
5808 
5809 TQString TDEHTMLPart::referrer() const
5810 {
5811  return d->m_referrer;
5812 }
5813 
5814 TQString 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 
5835 TQString 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( Qt::LocalDate );
5843  }
5844  //kdDebug(6050) << "TDEHTMLPart::lastModified: " << d->m_lastModified << endl;
5845  return d->m_lastModified;
5846 }
5847 
5848 void 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 
5862 void 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( tqwaitCursor );
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 
5891 TQStringList 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 
5904 TQPtrList<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 
5917 bool 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 
5934 void TDEHTMLPart::setDNDEnabled( bool b )
5935 {
5936  d->m_bDnd = b;
5937 }
5938 
5939 bool TDEHTMLPart::dndEnabled() const
5940 {
5941  return d->m_bDnd;
5942 }
5943 
5944 void 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 
5984 static 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 
6013 static 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 
6049 void 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() == Qt::LeftButton ||
6066  _mouse->button() == Qt::MidButton )
6067  {
6068  d->m_bMousePressed = true;
6069 
6070 #ifndef TDEHTML_NO_SELECTION
6071  if ( _mouse->button() == Qt::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() == Qt::RightButton && parentPart() != 0 && d->m_bBackRightClick )
6120  {
6121  d->m_bRightMousePressed = true;
6122  } else if ( _mouse->button() == Qt::RightButton )
6123  {
6124  popupMenu( d->m_strSelectedURL );
6125  // might be deleted, don't touch "this"
6126  }
6127 }
6128 
6129 void TDEHTMLPart::tdehtmlMouseDoubleClickEvent( tdehtml::MouseDoubleClickEvent *event )
6130 {
6131  TQMouseEvent *_mouse = event->qmouseEvent();
6132  if ( _mouse->button() == Qt::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 
6193 void 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
6298 void 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 
6370 bool 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 
6379 void 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 QT_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() & Qt::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 
6518 void 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() == Qt::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 QT_NO_CLIPBOARD
6542  if ((d->m_guiProfile == BrowserViewGUI) && (_mouse->button() == Qt::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 QT_NO_CLIPBOARD
6616  TQString text = selectedText();
6617  text.replace(TQChar(0xa0), ' ');
6618  disconnect( kapp->clipboard(), TQT_SIGNAL( selectionChanged()), this, TQT_SLOT( slotClearSelection()));
6619  kapp->clipboard()->setText(text,TQClipboard::Selection);
6620  connect( kapp->clipboard(), TQT_SIGNAL( selectionChanged()), TQT_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 
6632 void TDEHTMLPart::tdehtmlDrawContentsEvent( tdehtml::DrawContentsEvent * )
6633 {
6634 }
6635 
6636 void 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 
6652 void 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 
6675 void TDEHTMLPart::slotSelectAll()
6676 {
6677  KParts::ReadOnlyPart *part = currentFrame();
6678  if (part && part->inherits("TDEHTMLPart"))
6679  static_cast<TDEHTMLPart *>(part)->selectAll();
6680 }
6681 
6682 void TDEHTMLPart::startAutoScroll()
6683 {
6684  connect(&d->m_scrollTimer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( slotAutoScroll() ));
6685  d->m_scrollTimer.start(100, false);
6686 }
6687 
6688 void TDEHTMLPart::stopAutoScroll()
6689 {
6690  disconnect(&d->m_scrollTimer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( slotAutoScroll() ));
6691  if (d->m_scrollTimer.isActive())
6692  d->m_scrollTimer.stop();
6693 }
6694 
6695 
6696 void TDEHTMLPart::slotAutoScroll()
6697 {
6698  if (d->m_view)
6699  d->m_view->doAutoScroll();
6700  else
6701  stopAutoScroll(); // Safety
6702 }
6703 
6704 void 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 
6749 void 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 
6817 bool TDEHTMLPart::checkLinkSecurity(const KURL &linkURL,const TQString &message, const TQString &button)
6818 {
6819  bool linkAllowed = true;
6820 
6821  if ( d->m_doc )
6822  linkAllowed = kapp && kapp->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 
6851 void 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 
6869 void 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_OBJECT_NAME_STRING ) )
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_OBJECT_NAME_STRING ) )
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 
6924 void 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 
6938 DOM::Node TDEHTMLPart::activeNode() const
6939 {
6940  return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
6941 }
6942 
6943 DOM::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 
6953 TDEHTMLPart *TDEHTMLPart::opener()
6954 {
6955  return d->m_opener;
6956 }
6957 
6958 void TDEHTMLPart::setOpener(TDEHTMLPart *_opener)
6959 {
6960  d->m_opener = _opener;
6961 }
6962 
6963 bool TDEHTMLPart::openedByJS()
6964 {
6965  return d->m_openedByJS;
6966 }
6967 
6968 void TDEHTMLPart::setOpenedByJS(bool _openedByJS)
6969 {
6970  d->m_openedByJS = _openedByJS;
6971 }
6972 
6973 void TDEHTMLPart::preloadStyleSheet(const TQString &url, const TQString &stylesheet)
6974 {
6975  tdehtml::Cache::preloadStyleSheet(url, stylesheet);
6976 }
6977 
6978 void TDEHTMLPart::preloadScript(const TQString &url, const TQString &script)
6979 {
6980  tdehtml::Cache::preloadScript(url, script);
6981 }
6982 
6983 TQCString TDEHTMLPart::dcopObjectId() const
6984 {
6985  TQCString id;
6986  id.sprintf("html-widget%d", d->m_dcop_counter);
6987  return id;
6988 }
6989 
6990 long TDEHTMLPart::cacheId() const
6991 {
6992  return d->m_cacheId;
6993 }
6994 
6995 bool TDEHTMLPart::restored() const
6996 {
6997  return d->m_restored;
6998 }
6999 
7000 bool 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 
7010 void TDEHTMLPart::setPluginPageQuestionAsked(const TQString& mimetype)
7011 {
7012  if ( parentPart() )
7013  parentPart()->setPluginPageQuestionAsked(mimetype);
7014 
7015  d->m_pluginPageQuestionAsked.append(mimetype);
7016 }
7017 
7018 void 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 
7087 tdehtml::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 
7107 void TDEHTMLPart::emitCaretPositionChanged(const DOM::Node &node, long offset) {
7108  emit caretPositionChanged(node, offset);
7109 }
7110 
7111 void 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, TQT_SIGNAL(finishedLayout()), this, TQT_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, TQT_SIGNAL(finishedLayout()), this, TQT_SLOT(restoreScrollPosition()));
7131  }
7132 }
7133 
7134 
7135 void 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, TQT_SIGNAL(walletOpened(bool)), d->m_wq, TQT_SLOT(walletOpened(bool)));
7169  connect(d->m_wq, TQT_SIGNAL(walletOpened(TDEWallet::Wallet*)), this, TQT_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 
7177 void 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, TQT_SIGNAL(walletOpened(bool)), d->m_wq, TQT_SLOT(walletOpened(bool)));
7211  connect(d->m_wq, TQT_SIGNAL(walletOpened(TDEWallet::Wallet*)), this, TQT_SLOT(walletOpened(TDEWallet::Wallet*)));
7212  }
7213  d->m_wq->savers.append(qMakePair(key, data));
7214 #endif // TDEHTML_NO_WALLET
7215 }
7216 
7217 
7218 void 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 
7237 void 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, TQT_SIGNAL(walletClosed()), TQT_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, TQT_SIGNAL(leftClickedURL()), TQT_SLOT(launchWalletManager()));
7262  connect(d->m_statusBarWalletLabel, TQT_SIGNAL(rightClickedURL()), TQT_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 
7271 TDEWallet::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 
7287 void 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 
7303 void 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 
7316 void TDEHTMLPart::walletMenu()
7317 {
7318 #ifndef TDEHTML_NO_WALLET
7319  TDEPopupMenu *m = new TDEPopupMenu(0L);
7320  m->insertItem(i18n("&Close Wallet"), this, TQT_SLOT(slotWalletClosed()));
7321  m->popup(TQCursor::pos());
7322 #endif // TDEHTML_NO_WALLET
7323 }
7324 
7325 void TDEHTMLPart::slotToggleCaretMode()
7326 {
7327  setCaretMode(d->m_paToggleCaretMode->isChecked());
7328 }
7329 
7330 void TDEHTMLPart::setFormNotification(TDEHTMLPart::FormNotification fn) {
7331  d->m_formNotification = fn;
7332 }
7333 
7334 TDEHTMLPart::FormNotification TDEHTMLPart::formNotification() const {
7335  return d->m_formNotification;
7336 }
7337 
7338 KURL 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 
7350 bool TDEHTMLPart::isModified() const
7351 {
7352  if ( !d->m_doc )
7353  return false;
7354 
7355  return d->m_doc->unsubmittedFormChanges();
7356 }
7357 
7358 void 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, TQT_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 
7373 void TDEHTMLPart::setSuppressedPopupIndicator( bool enable )
7374 {
7375  setSuppressedPopupIndicator( enable, 0 );
7376 }
7377 
7378 void 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, TQT_SIGNAL(leftClickedURL()), TQT_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 
7414 void 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, TQT_SLOT(showSuppressedPopups()));
7419  m->insertItem(i18n("Show Blocked Window Passive Popup &Notification"), this, TQT_SLOT(togglePopupPassivePopup()),0,57);
7420  m->setItemChecked(57,d->m_settings->jsPopupBlockerPassivePopup());
7421  m->insertItem(i18n("&Configure JavaScript New Window Policies..."), this, TQT_SLOT(launchJSConfigDialog()));
7422  m->popup(TQCursor::pos());
7423 }
7424 
7425 void 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 
7431 void 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)
7449 TQString 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 
7458 bool 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 
7474 using namespace KParts;
7475 #include "tdehtml_part.moc"
7476 #include "tdehtmlpart_p.moc"
KURL::setQuery
void setQuery(const TQString &_txt, int encoding_hint=0)
KParts::BrowserExtension
TDEHTMLPartIface
DCOP interface for TDEHTML.
Definition: tdehtml_iface.h:32
KLibLoader::lastErrorMessage
TQString lastErrorMessage() const
KStdAction::findPrev
TDEAction * findPrev(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
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::show
void show()
Convenience method to show the document's view.
Definition: tdehtml_part.cpp:5632
TDEConfig
KMessageBox::error
static void error(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, int options=Notify)
KParts::BrowserExtension::childObject
static BrowserExtension * childObject(TQObject *obj)
KURL
KStringHandler::rsqueeze
static TQString rsqueeze(const TQString &str, uint maxlen=40)
KURL::setRef
void setRef(const TQString &_txt)
TDEStdAccel::next
const TDEShortcut & next()
KLibFactory
TDEHTMLPart::isCaretMode
bool isCaretMode() const
Returns whether caret mode is on/off.
Definition: tdehtml_part.cpp:2662
KURL::hasRef
bool hasRef() const
KURL::hasSubURL
bool hasSubURL() const
TDEHTMLPart::setStatusMessagesEnabled
void setStatusMessagesEnabled(bool enable)
Enable/disable statusbar messages.
Definition: tdehtml_part.cpp:911
TDEHTMLPart::completeURL
KURL completeURL(const TQString &url)
returns a KURL object for the given url.
Definition: tdehtml_part.cpp:2371
KParts::ReadOnlyPart::m_url
KURL m_url
TDEHTMLPart::hasSelection
bool hasSelection() const
Has the user selected anything?
Definition: tdehtml_part.cpp:3596
KParts::WindowArgs
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::setSuppressedPopupIndicator
void setSuppressedPopupIndicator(bool enable)
Shows or hides the suppressed popup indicator.
Definition: tdehtml_part.cpp:7373
DOM::Node
The Node interface is the primary datatype for the entire Document Object Model.
Definition: dom_node.h:274
KParts::StatusBarExtension::childObject
static StatusBarExtension * childObject(TQObject *obj)
DOM::Node::nodeName
DOMString nodeName() const
The name of this node, depending on its type; see the table above.
Definition: dom_node.cpp:176
TDEHTMLPart::urlCursor
TQCursor urlCursor() const
Returns the cursor which is used when the cursor is on a link.
Definition: tdehtml_part.cpp:2602
TDEHTMLPart::dndEnabled
bool dndEnabled() const
Returns whether Dragn'n'Drop support is enabled or not.
Definition: tdehtml_part.cpp:5939
KXMLGUIClient
KParts
DOM::HTMLDocument
An HTMLDocument is the root of the HTML hierarchy and holds the entire content.
Definition: html_document.h:73
TDEHTMLPageCache::saveData
void saveData(long id, TQDataStream *str)
Save the data of cache entry id to the datastream str.
Definition: tdehtml_pagecache.cpp:272
TDEHTMLPart::documentSource
TQString documentSource() const
Returns the content of the source document.
Definition: tdehtml_part.cpp:864
TDEHTMLPart::metaRefreshEnabled
bool metaRefreshEnabled() const
Returns true if automatic forwarding is enabled.
Definition: tdehtml_part.cpp:953
TDEHTMLPart::doOpenStream
virtual bool doOpenStream(const TQString &mimeType)
Implements the streaming API of KParts::ReadOnlyPart.
Definition: tdehtml_part.cpp:2025
KURLLabel
TDEHTMLPart::selectedTextAsHTML
TQString selectedTextAsHTML() const
Return the text the user has marked.
Definition: tdehtml_part.cpp:3437
TDEHTMLPart::isEditable
bool isEditable() const
Returns true if the document is editable, false otherwise.
Definition: tdehtml_part.cpp:2683
TDEHTMLSettings
Settings for the HTML view.
Definition: tdehtml_settings.h:38
KStringHandler::csqueeze
static TQString csqueeze(const TQString &str, uint maxlen=40)
TDEHTMLPart::nextAnchor
bool nextAnchor()
Go to the next anchor.
Definition: tdehtml_part.cpp:2569
TDEHTMLPart::document
DOM::Document document() const
Returns a reference to the DOM document.
Definition: tdehtml_part.cpp:859
TDEConfigGroupSaver
KParts::BrowserInterface
TDEHTMLPart::onURL
void onURL(const TQString &url)
Emitted if the cursor is moved over an URL.
KParts::ReadOnlyPart::started
void started(TDEIO::Job *)
TDEHTMLPart::selectionChanged
void selectionChanged()
This signal is emitted when the selection changes.
KParts::ReadOnlyPart::completed
void completed()
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
TDEGlobalSettings::showIconsOnPushButtons
static bool showIconsOnPushButtons()
KURL::query
TQString query() const
TDEIcon::SizeMedium
kdError
kdbgstream kdError(int area=0)
TDEHTMLPart::browserExtension
KParts::BrowserExtension * browserExtension() const
Returns a pointer to the KParts::BrowserExtension.
Definition: tdehtml_part.cpp:896
TDEHTMLPart::setZoomFactor
void setZoomFactor(int percent)
Sets the Zoom factor.
Definition: tdehtml_part.cpp:5728
KPassivePopup::message
static KPassivePopup * message(const TQString &text, TQWidget *parent, const char *name=0)
KParts::PartManager::removePart
virtual void removePart(Part *part)
KParts::BrowserInterface::callMethod
void callMethod(const char *name, const TQVariant &argument)
KURL::protocol
TQString protocol() const
TDEGlobalSettings::dndEventDelay
static int dndEventDelay()
TDEHTMLPart::stopAnimations
void stopAnimations()
Stops all animated images on the current and child pages.
Definition: tdehtml_part.cpp:2055
KStdAction::findNext
TDEAction * findNext(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
KURL::fileName
TQString fileName(bool _ignore_trailing_slash_in_path=true) const
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::findTextBegin
void findTextBegin()
Initiates a text search.
Definition: tdehtml_part.cpp:2737
TDEHTMLPart::encoding
TQString encoding() const
Returns the encoding the page currently uses.
Definition: tdehtml_part.cpp:2485
TDEHTMLPart::referrer
TQString referrer() const
Referrer used for links in this page.
Definition: tdehtml_part.cpp:5809
TDEHTMLPart::tdehtmlDrawContentsEvent
virtual void tdehtmlDrawContentsEvent(tdehtml::DrawContentsEvent *)
Eventhandler for the tdehtml::DrawContentsEvent.
Definition: tdehtml_part.cpp:6632
KParts::BrowserRun::askEmbedOrSave
static AskSaveResult askEmbedOrSave(const KURL &url, const TQString &mimeType, const TQString &suggestedFilename=TQString::null, int flags=0)
KParts::Part::widget
virtual TQWidget * widget()
KCharsets::descriptiveEncodingNames
TQStringList descriptiveEncodingNames()
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
TDEHTMLPart::openFile
virtual bool openFile()
Internal empty reimplementation of KParts::ReadOnlyPart::openFile .
Definition: tdehtml_part.cpp:1498
TDEHTMLPart::findFrame
TDEHTMLPart * findFrame(const TQString &f)
Finds a frame by name.
Definition: tdehtml_part.cpp:5257
kdDebug
kdbgstream kdDebug(int area=0)
TDEHTMLPart::setCaretDisplayPolicyNonFocused
void setCaretDisplayPolicyNonFocused(CaretDisplayPolicy policy)
Sets the caret display policy when the view is not focused.
Definition: tdehtml_part.cpp:2711
KParts::Part
KParts::URLArgs::setDoPost
void setDoPost(bool enable)
TDEHTMLPart::pluginsEnabled
bool pluginsEnabled() const
Returns true if plugins are enabled/disabled.
Definition: tdehtml_part.cpp:1279
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::scheduleRedirection
void scheduleRedirection(int delay, const TQString &url, bool lockHistory=true)
Schedules a redirection after delay seconds.
Definition: tdehtml_part.cpp:2383
KParts::URLArgs::setContentType
void setContentType(const TQString &contentType)
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...
TDEActionMenu
KURL::queryItem
TQString queryItem(const TQString &item) const
TDEHTMLPart::setFixedFont
void setFixedFont(const TQString &name)
Sets the fixed font style.
Definition: tdehtml_part.cpp:2592
TDEHTMLPageCache::endData
void endData(long id)
Signal end of data for the cache entry with id id.
Definition: tdehtml_pagecache.cpp:166
DOM::Document::createRange
Range createRange()
Introduced in DOM Level 2 This method is from the DocumentRange interface.
Definition: dom_doc.cpp:352
KParts::URLArgs::frameName
TQString frameName
KURL::setUser
void setUser(const TQString &_txt)
KURL::isEmpty
bool isEmpty() const
KURL::split
static List split(const TQString &_url)
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
TDEAction
TDEHTMLPart::setEncoding
bool setEncoding(const TQString &name, bool override=false)
Sets the encoding the page uses.
Definition: tdehtml_part.cpp:2467
TDEHTMLPart::preloadStyleSheet
void preloadStyleSheet(const TQString &url, const TQString &stylesheet)
Loads a style sheet into the stylesheet cache.
Definition: tdehtml_part.cpp:6973
TDEHTMLPart::caretPositionChanged
void caretPositionChanged(const DOM::Node &node, long offset)
This signal is emitted whenever the caret position has been changed.
TDEHTMLPageCache::createCacheEntry
long createCacheEntry()
Create a new cache entry.
Definition: tdehtml_pagecache.cpp:143
TDELocale::removeCatalogue
void removeCatalogue(const TQString &catalog)
TDEHTMLPart::guiActivateEvent
virtual void guiActivateEvent(KParts::GUIActivateEvent *event)
Internal reimplementation of KParts::Part::guiActivateEvent .
Definition: tdehtml_part.cpp:6636
KParts::Part::setWidget
virtual void setWidget(TQWidget *widget)
TDEHTMLPart::setJScriptEnabled
void setJScriptEnabled(bool enable)
Enable/disable Javascript support.
Definition: tdehtml_part.cpp:930
KNotifyClient::instance
TDEInstance * instance()
TDEIcon::Desktop
TDEHTMLPart::setJavaEnabled
void setJavaEnabled(bool enable)
Enables/disables Java applet support.
Definition: tdehtml_part.cpp:1244
TDEHTMLPart::setSelection
void setSelection(const DOM::Range &)
Sets the current selection.
Definition: tdehtml_part.cpp:3668
TDEHTMLPageCache::cancelFetch
void cancelFetch(TQObject *recvObj)
Cancel sending data to recvObj.
Definition: tdehtml_pagecache.cpp:218
KURL::host
TQString host() const
TDEHTMLPart::doWriteStream
virtual bool doWriteStream(const TQByteArray &data)
Implements the streaming API of KParts::ReadOnlyPart.
Definition: tdehtml_part.cpp:2036
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
TDEHTMLPageCache::self
static TDEHTMLPageCache * self()
static "constructor".
Definition: tdehtml_pagecache.cpp:121
tdehtml
Definition: tdehtml_caret.cpp:26
KURLLabel::setSizePolicy
virtual void setSizePolicy(TQSizePolicy)
TDEHTMLPart::~TDEHTMLPart
virtual ~TDEHTMLPart()
Destructor.
Definition: tdehtml_part.cpp:467
TDEHTMLPart::nodeUnderMouse
DOM::Node nodeUnderMouse() const
Returns the Node currently under the mouse.
Definition: tdehtml_part.cpp:5644
DOM::Node::parentNode
Node parentNode() const
The parent of this node.
Definition: dom_node.cpp:205
KURL::setFileName
void setFileName(const TQString &_txt)
KURL::setPass
void setPass(const TQString &_txt)
tdelocale.h
KParts::LiveConnectExtension
TDEHTMLPart::tdehtmlMousePressEvent
virtual void tdehtmlMousePressEvent(tdehtml::MousePressEvent *event)
Eventhandler of the tdehtml::MousePressEvent.
Definition: tdehtml_part.cpp:6049
KStdAction::saveAs
TDEAction * saveAs(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
TDEStdAccel::end
const TDEShortcut & end()
TDEHTMLPart::caretDisplayPolicyNonFocused
CaretDisplayPolicy caretDisplayPolicyNonFocused() const
Returns the current caret policy when the view is not focused.
Definition: tdehtml_part.cpp:2702
TDEHTMLPart::javaEnabled
bool javaEnabled() const
Return true if Java applet support is enabled, false if disabled.
Definition: tdehtml_part.cpp:1250
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::setURLCursor
void setURLCursor(const TQCursor &c)
Sets the cursor to use when the cursor is on a link.
Definition: tdehtml_part.cpp:2597
KGuiItem
TDEHTMLPart::setOnlyLocalReferences
void setOnlyLocalReferences(bool enable)
Security option.
Definition: tdehtml_part.cpp:2612
TDEHTMLPart::jsDefaultStatusBarText
TQString jsDefaultStatusBarText() const
Called by KJS.
Definition: tdehtml_part.cpp:5804
KParts::URLArgs::setForcesNewWindow
void setForcesNewWindow(bool forcesNewWindow)
TDEToggleAction
KLibrary::unload
void unload() const
KURL::isLocalFile
bool isLocalFile() const
KParts::URLArgs::setLockHistory
void setLockHistory(bool lock)
TDEHTMLPart::prevAnchor
bool prevAnchor()
Go to previous anchor.
Definition: tdehtml_part.cpp:2578
TDEHTMLPart::showError
virtual void showError(TDEIO::Job *job)
Called when a certain error situation (i.e.
Definition: tdehtml_part.cpp:1702
TDEHTMLPart::doCloseStream
virtual bool doCloseStream()
Implements the streaming API of KParts::ReadOnlyPart.
Definition: tdehtml_part.cpp:2042
kdWarning
kdbgstream kdWarning(int area=0)
TDEGlobal::charsets
static KCharsets * charsets()
KParts::ReadOnlyPart::url
KURL url() const
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
KURL::setPath
void setPath(const TQString &path)
KMessageBox::information
static void information(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, const TQString &dontShowAgainName=TQString::null, int options=Notify)
TDEHTMLSettings::init
void init()
Called by constructor and reparseConfiguration.
Definition: tdehtml_settings.cpp:290
KLibrary
DOM::Node::isNull
bool isNull() const
tests if this Node is 0.
Definition: dom_node.h:892
TDEHTMLPart::onlyLocalReferences
bool onlyLocalReferences() const
Returns whether only file:/ or data:/ references are allowed to be loaded ( default false )...
Definition: tdehtml_part.cpp:2607
DOM::DOMString
This class implements the basic string we use in the DOM.
Definition: dom_string.h:43
TDEHTMLPart::setEditable
void setEditable(bool enable)
Makes the document editable.
Definition: tdehtml_part.cpp:2667
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::Document
The Document interface represents the entire HTML or XML document.
Definition: dom_doc.h:245
TDEHTMLPart::setCaretVisible
void setCaretVisible(bool show)
Sets the visibility of the caret.
Definition: tdehtml_part.cpp:2718
TDEHTMLPart::isModified
bool isModified() const
Checks whether the page contains unsubmitted form changes.
Definition: tdehtml_part.cpp:7350
TDEHTMLPart::closeURL
virtual bool closeURL()
Stops loading the document and kills all data requests (for images, etc.)
Definition: tdehtml_part.cpp:769
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::paint
void paint(TQPainter *, const TQRect &, int=0, bool *=0)
Paints the HTML page to a TQPainter.
Definition: tdehtml_part.cpp:2049
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
KParts::URLArgs::reload
bool reload
TDEHTMLPart::jScriptInterpreter
KJS::Interpreter * jScriptInterpreter()
Returns the JavaScript interpreter the part is using.
Definition: tdehtml_part.cpp:916
TDEHTMLPart::setAutoloadImages
void setAutoloadImages(bool enable)
Specifies whether images contained in the document should be loaded automatically or not...
Definition: tdehtml_part.cpp:1335
KCharsets::encodingForName
TQString encodingForName(const TQString &descriptiveName)
TDEHTMLPart::setCaretMode
void setCaretMode(bool enable)
Enables/disables caret mode.
Definition: tdehtml_part.cpp:2645
KParts::GUIActivateEvent
KParts::URLArgs::docState
TQStringList docState
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::formNotification
FormNotification formNotification() const
Determine if signal should be emitted before, instead or never when a submitForm() happens...
Definition: tdehtml_part.cpp:7334
TDEIcon::Small
KParts::PartManager::activePart
virtual Part * activePart() const
TDEHTMLPart::selectedText
virtual TQString selectedText() const
Returns the text the user has marked.
Definition: tdehtml_part.cpp:3454
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)
KParts::StatusBarExtension
TDESelectAction
KParts::BrowserHostExtension
KLibLoader::library
virtual KLibrary * library(const char *libname)
KParts::URLArgs
DOM::Node::firstChild
Node firstChild() const
The first child of this node.
Definition: dom_node.cpp:217
KTempFile
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
TDEHTMLPart::lastModified
TQString lastModified() const
Last-modified date (in raw string format), if received in the [HTTP] headers.
Definition: tdehtml_part.cpp:5835
TDEHTMLPart::view
TDEHTMLView * view() const
Returns a pointer to the HTML document's view.
Definition: tdehtml_part.cpp:906
TDEHTMLPart::openURL
virtual bool openURL(const KURL &url)
Opens the specified URL url.
Definition: tdehtml_part.cpp:565
TDEHTMLPart::hide
void hide()
Convenience method to hide the document's view.
Definition: tdehtml_part.cpp:5638
TDEHTMLPart::tdehtmlMouseMoveEvent
virtual void tdehtmlMouseMoveEvent(tdehtml::MouseMoveEvent *event)
Eventhandler for the tdehtml::MouseMouseMoveEvent.
Definition: tdehtml_part.cpp:6379
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
KParts::PartManager::addPart
virtual void addPart(Part *part, bool setActive=true)
KParts::URLArgs::setNewTab
void setNewTab(bool newTab)
KURL::encode_string
static TQString encode_string(const TQString &str, int encoding_hint=0)
TDEHTMLPart::end
virtual void end()
Call this after your last call to write().
Definition: tdehtml_part.cpp:2010
DOM::EventListener
Introduced in DOM Level 2.
Definition: dom2_events.h:64
DOM
The Document Object Model (DOM) is divided into two parts, the COREDOM core DOM, specifying some core...
Definition: design.h:56
KLibLoader::self
static KLibLoader * self()
KURLDrag::metaData
TQMap< TQString, TQString > & metaData()
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::setJSDefaultStatusBarText
void setJSDefaultStatusBarText(const TQString &text)
Called by KJS.
Definition: tdehtml_part.cpp:5794
TDEGlobal::locale
static TDELocale * locale()
TDEHTMLPart::preloadScript
void preloadScript(const TQString &url, const TQString &script)
Loads a script into the script cache.
Definition: tdehtml_part.cpp:6978
TDEHTMLPart::tdehtmlMouseReleaseEvent
virtual void tdehtmlMouseReleaseEvent(tdehtml::MouseReleaseEvent *event)
Eventhandler for the tdehtml::MouseMouseReleaseEvent.
Definition: tdehtml_part.cpp:6518
TDEHTMLPart::popupMenu
void popupMenu(const TQString &url, const TQPoint &point)
Emitted when the user clicks the right mouse button on the document.
KWin::activateWindow
static void activateWindow(WId win, long time=0)
KParts::URLArgs::xOffset
int xOffset
TDEShortcut
TDEHTMLPart::nonSharedNodeUnderMouse
DOM::Node nonSharedNodeUnderMouse() const
Returns the Node currently under the mouse that is not shared.
Definition: tdehtml_part.cpp:5649
KStdAction::find
TDEAction * find(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
KMultipleDrag
KURL::htmlURL
TQString htmlURL() const
TDEHTMLPart::selectAll
void selectAll()
Marks all text in the document as selected.
Definition: tdehtml_part.cpp:6749
TDEHTMLPart::createJavaContext
KJavaAppletContext * createJavaContext()
Returns the java context of the applets.
Definition: tdehtml_part.cpp:1268
KStdAction::selectAll
TDEAction * selectAll(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
DOM::NamedNodeMap::getNamedItem
Node getNamedItem(const DOMString &name) const
Retrieves a node specified by name.
Definition: dom_node.cpp:66
KURL::decode_string
static TQString decode_string(const TQString &str, int encoding_hint=0)
TDEHTMLPageCache::addData
void addData(long id, const TQByteArray &data)
Add data to the cache entry with id id.
Definition: tdehtml_pagecache.cpp:158
KMultipleDrag::addDragObject
void addDragObject(TQDragObject *dragObject)
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
KLibLoader::factory
KLibFactory * factory(const char *libname)
TDEHTMLPart::nodeActivated
void nodeActivated(const DOM::Node &)
This signal is emitted when an element retrieves the keyboard focus.
KParts::ReadOnlyPart::canceled
void canceled(const TQString &errMsg)
TDEHTMLPart::selection
DOM::Range selection() const
Returns the selected part of the HTML.
Definition: tdehtml_part.cpp:3606
KParts::PartManager::setAllowNestedParts
void setAllowNestedParts(bool allow)
TDEHTMLPart::setMetaRefreshEnabled
void setMetaRefreshEnabled(bool enable)
Enable/disable automatic forwarding by
Definition: tdehtml_part.cpp:948
KParts::URLArgs::metaData
TQMap< TQString, TQString > & metaData()
TDEHTMLPart::zoomFactor
int zoomFactor() const
Returns the current zoom factor.
Definition: tdehtml_part.cpp:5664
TDELocale::formatDateTime
TQString formatDateTime(const TQDateTime &pDateTime, bool shortFormat=true, bool includeSecs=false) const
TDEHTMLPageCache::cancelEntry
void cancelEntry(long id)
Cancel the entry.
Definition: tdehtml_pagecache.cpp:174
TDEPopupMenu
TDEHTMLPart::setStandardFont
void setStandardFont(const TQString &name)
Sets the standard font style.
Definition: tdehtml_part.cpp:2587
KParts::PartManager
TDEHTMLPart
This class is tdehtml's main class.
Definition: tdehtml_part.h:183
TDEHTMLPart::statusMessagesEnabled
bool statusMessagesEnabled() const
Returns true if status messages are enabled.
Definition: tdehtml_part.cpp:925
TDEHTMLPart::autoloadImages
bool autoloadImages() const
Returns whether images contained in the document are loaded automatically or not. ...
Definition: tdehtml_part.cpp:1359
KURL::url
TQString url(int _trailing=0, int encoding_hint=0) const
KURL::path
TQString path() const
KLibrary::symbol
void * symbol(const char *name) const
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::tdehtmlMouseDoubleClickEvent
virtual void tdehtmlMouseDoubleClickEvent(tdehtml::MouseDoubleClickEvent *)
Eventhandler for the tdehtml::MouseDoubleClickEvent.
Definition: tdehtml_part.cpp:6129
TDEHTMLView
Renders and displays HTML in a TQScrollView.
Definition: tdehtmlview.h:78
KURL::encodedHtmlRef
TQString encodedHtmlRef() const
TDEHTMLPartBrowserExtension
This is the BrowserExtension for a TDEHTMLPart document.
Definition: tdehtml_ext.h:41
TDEGlobal::config
static TDEConfig * config()
endl
kndbgstream & endl(kndbgstream &s)
locate
TQString locate(const char *type, const TQString &filename, const TDEInstance *instance=TDEGlobal::instance())
KParts::URLArgs::yOffset
int yOffset
TDEHTMLPart::framejScript
KJSProxy * framejScript(KParts::ReadOnlyPart *framePart)
Returns child frame framePart its script interpreter.
Definition: tdehtml_part.cpp:5303
TDEHTMLPart::gotoAnchor
bool gotoAnchor(const TQString &name)
Finds the anchor named name.
Definition: tdehtml_part.cpp:2521
TDEHTMLPart::jScriptEnabled
bool jScriptEnabled() const
Returns true if Javascript support is enabled or false otherwise.
Definition: tdehtml_part.cpp:939
TDELocale::encoding
const char * encoding() const
TDEHTMLPart::setPluginsEnabled
void setPluginsEnabled(bool enable)
Enables or disables plugins, default is enabled.
Definition: tdehtml_part.cpp:1273
TDEHTMLPart::setDNDEnabled
void setDNDEnabled(bool b)
Enables or disables Drag'n'Drop support.
Definition: tdehtml_part.cpp:5934
KURL::List
TDEHTMLPart::findTextNext
bool findTextNext()
Finds the next occurence of a string set by findText()
Definition: tdehtml_part.cpp:3063
TDEHTMLPart::CaretDisplayPolicy
CaretDisplayPolicy
Enumeration for displaying the caret.
Definition: tdehtml_part.h:495
KURLDrag
KURL::join
static KURL join(const List &_list)
TDEHTMLPart::backgroundURL
KURL backgroundURL() const
Returns the URL for the background Image (used by save background)
Definition: tdehtml_part.cpp:4117
KURL::isValid
bool isValid() const
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::partManager
KParts::PartManager * partManager()
Returns a reference to the partmanager instance which manages html frame objects. ...
Definition: tdehtml_part.cpp:4703
TDEHTMLPart::findFramePart
KParts::ReadOnlyPart * findFramePart(const TQString &f)
Finds a frame by name.
Definition: tdehtml_part.cpp:5270
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
DOM::Node::nextSibling
Node nextSibling() const
The node immediately following this node.
Definition: dom_node.cpp:235
KParts::URLArgs::serviceType
TQString serviceType
TDEHTMLPart::javaContext
KJavaAppletContext * javaContext()
Returns the java context of the applets.
Definition: tdehtml_part.cpp:1263
KURL::prettyURL
TQString prettyURL(int _trailing=0) const
TDEHTMLPart::pageReferrer
TQString pageReferrer() const
Referrer used to obtain this page.
Definition: tdehtml_part.cpp:5814
KParts::StatusBarExtension::setStatusBar
void setStatusBar(KStatusBar *status)
TDEHTMLPart::setJSStatusBarText
void setJSStatusBarText(const TQString &text)
Called by KJS.
Definition: tdehtml_part.cpp:5789
TDEHTMLPart::setActiveNode
void setActiveNode(const DOM::Node &node)
Sets the focused node of the document to the specified node.
Definition: tdehtml_part.cpp:6924
KURL::htmlRef
TQString htmlRef() const
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
KParts::ReadOnlyPart
TDEHTMLPart::activeNode
DOM::Node activeNode() const
Returns the node that has the keyboard focus.
Definition: tdehtml_part.cpp:6938
TDEHTMLPageCache::isComplete
bool isComplete(long id)
Definition: tdehtml_pagecache.cpp:191
KParts::URLArgs::postData
TQByteArray postData
TDEHTMLPart::jsStatusBarText
TQString jsStatusBarText() const
Called by KJS.
Definition: tdehtml_part.cpp:5799
DOM::Node::nodeType
unsigned short nodeType() const
A code representing the type of the underlying object, as defined above.
Definition: dom_node.cpp:199
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

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdehtml by doxygen 1.8.8
This website is maintained by Timothy Pearson.