• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

KHTML

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

KDE's Doxygen guidelines are available online.

KHTML

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

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal