[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
darin
darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 06:06:20 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit 4ffca5b72bec1403c2e2c9b614392f286605e51b
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Apr 17 01:07:15 2002 +0000
WebCore:
* src/kdelibs/khtml/khtml_part.cpp: Added. Not used yet, but maybe we'll use
part of it some time soon.
* src/kdelibs/khtml/khtml_part.h: Reenabled this file, and made changes so it
could be used instead of our own header.
* src/kwq/KWQKHTMLPart.h: Removed.
* src/kwq/KWQKHTMLPart.mm: (KHTMLPart::KHTMLPart): Add parameter to match KDE.
(KHTMLPart::settings): Add const to match KDE.
(KHTMLPart::scheduleRedirection): Add parameter to match KDE.
(KHTMLPart::encoding): Add const to match KDE.
(KHTMLPart::urlCursor): Update return value to match KDE.
(KHTMLPart::urlSelected): Add parameter to match KDE.
(KHTMLPart::requestObject): Put plugins array on private object.
(KHTMLPart::frames): Remove const to match KDE.
(KHTMLPart::documentSource): Add const to match KDE.
(KHTMLPart::setTitle): Put dataSource on private object.
(KHTMLPart::setDataSource): New, not inline any more.
(KHTMLPart::getDataSource): New, not inline any more.
* src/libwebcore.exp: Update for function name changes.
* src/kwq/khtml/khtml_settings.h:
* src/kwq/KWQKHTMLSettings.mm: (KHTMLSettings::changeCursor): Add const.
* src/kwq/KWQView.mm: (-[KWQHTMLView layout]): No need to check xmlDocImpl()
and renderer() for NULL now, because KHTMLView::layout does.
* src/kwq/KWQKloader.mm: (Loader::load): Use type instead of id.
WebKit:
* WebView.subproj/IFBaseWebControllerPrivate.mm: Include khtml_part.h instead
of KWQKHTMLPart.h.
* WebView.subproj/IFWebFrame.mm: Include khtml_part.h instead of KWQKHTMLPart.h.
* WebView.subproj/IFWebDataSource.mm: (-[IFWebDataSource documentTextFromDOM]):
Remove an unneeded cast and an extra retain/autorelease.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@1035 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog-2002-12-03 b/WebCore/ChangeLog-2002-12-03
index 8b1dff1..8aa7aa5 100644
--- a/WebCore/ChangeLog-2002-12-03
+++ b/WebCore/ChangeLog-2002-12-03
@@ -1,5 +1,37 @@
2002-04-16 Darin Adler <darin at apple.com>
+ * src/kdelibs/khtml/khtml_part.cpp: Added. Not used yet, but maybe we'll use
+ part of it some time soon.
+
+ * src/kdelibs/khtml/khtml_part.h: Reenabled this file, and made changes so it
+ could be used instead of our own header.
+ * src/kwq/KWQKHTMLPart.h: Removed.
+
+ * src/kwq/KWQKHTMLPart.mm: (KHTMLPart::KHTMLPart): Add parameter to match KDE.
+ (KHTMLPart::settings): Add const to match KDE.
+ (KHTMLPart::scheduleRedirection): Add parameter to match KDE.
+ (KHTMLPart::encoding): Add const to match KDE.
+ (KHTMLPart::urlCursor): Update return value to match KDE.
+ (KHTMLPart::urlSelected): Add parameter to match KDE.
+ (KHTMLPart::requestObject): Put plugins array on private object.
+ (KHTMLPart::frames): Remove const to match KDE.
+ (KHTMLPart::documentSource): Add const to match KDE.
+ (KHTMLPart::setTitle): Put dataSource on private object.
+ (KHTMLPart::setDataSource): New, not inline any more.
+ (KHTMLPart::getDataSource): New, not inline any more.
+
+ * src/libwebcore.exp: Update for function name changes.
+
+ * src/kwq/khtml/khtml_settings.h:
+ * src/kwq/KWQKHTMLSettings.mm: (KHTMLSettings::changeCursor): Add const.
+
+ * src/kwq/KWQView.mm: (-[KWQHTMLView layout]): No need to check xmlDocImpl()
+ and renderer() for NULL now, because KHTMLView::layout does.
+
+ * src/kwq/KWQKloader.mm: (Loader::load): Use type instead of id.
+
+2002-04-16 Darin Adler <darin at apple.com>
+
* src/kwq/kio/jobclasses.h:
* src/kwq/KWQKjobclasses.mm: (TransferJob::setError): New.
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 8b1dff1..8aa7aa5 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,5 +1,37 @@
2002-04-16 Darin Adler <darin at apple.com>
+ * src/kdelibs/khtml/khtml_part.cpp: Added. Not used yet, but maybe we'll use
+ part of it some time soon.
+
+ * src/kdelibs/khtml/khtml_part.h: Reenabled this file, and made changes so it
+ could be used instead of our own header.
+ * src/kwq/KWQKHTMLPart.h: Removed.
+
+ * src/kwq/KWQKHTMLPart.mm: (KHTMLPart::KHTMLPart): Add parameter to match KDE.
+ (KHTMLPart::settings): Add const to match KDE.
+ (KHTMLPart::scheduleRedirection): Add parameter to match KDE.
+ (KHTMLPart::encoding): Add const to match KDE.
+ (KHTMLPart::urlCursor): Update return value to match KDE.
+ (KHTMLPart::urlSelected): Add parameter to match KDE.
+ (KHTMLPart::requestObject): Put plugins array on private object.
+ (KHTMLPart::frames): Remove const to match KDE.
+ (KHTMLPart::documentSource): Add const to match KDE.
+ (KHTMLPart::setTitle): Put dataSource on private object.
+ (KHTMLPart::setDataSource): New, not inline any more.
+ (KHTMLPart::getDataSource): New, not inline any more.
+
+ * src/libwebcore.exp: Update for function name changes.
+
+ * src/kwq/khtml/khtml_settings.h:
+ * src/kwq/KWQKHTMLSettings.mm: (KHTMLSettings::changeCursor): Add const.
+
+ * src/kwq/KWQView.mm: (-[KWQHTMLView layout]): No need to check xmlDocImpl()
+ and renderer() for NULL now, because KHTMLView::layout does.
+
+ * src/kwq/KWQKloader.mm: (Loader::load): Use type instead of id.
+
+2002-04-16 Darin Adler <darin at apple.com>
+
* src/kwq/kio/jobclasses.h:
* src/kwq/KWQKjobclasses.mm: (TransferJob::setError): New.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 8b1dff1..8aa7aa5 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,5 +1,37 @@
2002-04-16 Darin Adler <darin at apple.com>
+ * src/kdelibs/khtml/khtml_part.cpp: Added. Not used yet, but maybe we'll use
+ part of it some time soon.
+
+ * src/kdelibs/khtml/khtml_part.h: Reenabled this file, and made changes so it
+ could be used instead of our own header.
+ * src/kwq/KWQKHTMLPart.h: Removed.
+
+ * src/kwq/KWQKHTMLPart.mm: (KHTMLPart::KHTMLPart): Add parameter to match KDE.
+ (KHTMLPart::settings): Add const to match KDE.
+ (KHTMLPart::scheduleRedirection): Add parameter to match KDE.
+ (KHTMLPart::encoding): Add const to match KDE.
+ (KHTMLPart::urlCursor): Update return value to match KDE.
+ (KHTMLPart::urlSelected): Add parameter to match KDE.
+ (KHTMLPart::requestObject): Put plugins array on private object.
+ (KHTMLPart::frames): Remove const to match KDE.
+ (KHTMLPart::documentSource): Add const to match KDE.
+ (KHTMLPart::setTitle): Put dataSource on private object.
+ (KHTMLPart::setDataSource): New, not inline any more.
+ (KHTMLPart::getDataSource): New, not inline any more.
+
+ * src/libwebcore.exp: Update for function name changes.
+
+ * src/kwq/khtml/khtml_settings.h:
+ * src/kwq/KWQKHTMLSettings.mm: (KHTMLSettings::changeCursor): Add const.
+
+ * src/kwq/KWQView.mm: (-[KWQHTMLView layout]): No need to check xmlDocImpl()
+ and renderer() for NULL now, because KHTMLView::layout does.
+
+ * src/kwq/KWQKloader.mm: (Loader::load): Use type instead of id.
+
+2002-04-16 Darin Adler <darin at apple.com>
+
* src/kwq/kio/jobclasses.h:
* src/kwq/KWQKjobclasses.mm: (TransferJob::setError): New.
diff --git a/WebCore/khtml/khtml_part.cpp b/WebCore/khtml/khtml_part.cpp
new file mode 100644
index 0000000..056e85e
--- /dev/null
+++ b/WebCore/khtml/khtml_part.cpp
@@ -0,0 +1,4282 @@
+// -*- c-basic-offset: 2 -*-
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 1998, 1999 Torben Weis <weis at kde.org>
+ * 1999 Lars Knoll <knoll at kde.org>
+ * 1999 Antti Koivisto <koivisto at kde.org>
+ * 2000 Simon Hausmann <hausmann at kde.org>
+ * 2000 Stefan Schimanski <1Stein at gmx.de>
+ * 2001 George Staikos <staikos at kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define SPEED_DEBUG
+#include "khtml_part.h"
+
+#include "khtml_pagecache.h"
+
+#include "dom/dom_string.h"
+#include "dom/dom_element.h"
+#include "html/html_documentimpl.h"
+#include "html/html_baseimpl.h"
+#include "html/html_miscimpl.h"
+#include "html/html_imageimpl.h"
+#include "rendering/render_text.h"
+#include "rendering/render_frames.h"
+#include "misc/htmlhashes.h"
+#include "misc/loader.h"
+#include "xml/dom2_eventsimpl.h"
+#include "xml/xml_tokenizer.h"
+#include "css/cssstyleselector.h"
+#include "css/csshelper.h"
+using namespace DOM;
+
+#include "khtmlview.h"
+#include <kparts/partmanager.h>
+#include "ecma/kjs_proxy.h"
+#include "khtml_settings.h"
+
+#include <sys/types.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include <kstandarddirs.h>
+#include <kio/job.h>
+#include <kio/global.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kcharsets.h>
+#include <kmessagebox.h>
+#include <kstdaction.h>
+#include <kfiledialog.h>
+#include <ktrader.h>
+#include <kdatastream.h>
+#include <ktempfile.h>
+#include <kglobalsettings.h>
+#include <kurldrag.h>
+#include <kapplication.h>
+#if !defined(QT_NO_DRAGANDDROP)
+#include <kmultipledrag.h>
+#endif
+
+#include <ksslcertchain.h>
+#include <ksslinfodlg.h>
+
+
+#include <qclipboard.h>
+#include <qfile.h>
+#include <qmetaobject.h>
+#include <private/qucomextra_p.h>
+
+#include "khtmlpart_p.h"
+
+namespace khtml {
+ class PartStyleSheetLoader : public CachedObjectClient
+ {
+ public:
+ PartStyleSheetLoader(KHTMLPart *part, DOM::DOMString url, DocLoader* dl)
+ {
+ m_part = part;
+ m_cachedSheet = Cache::requestStyleSheet(dl, url );
+ if (m_cachedSheet)
+ m_cachedSheet->ref( this );
+ }
+ virtual ~PartStyleSheetLoader()
+ {
+ if ( m_cachedSheet ) m_cachedSheet->deref(this);
+ }
+ virtual void setStyleSheet(const DOM::DOMString&, const DOM::DOMString &sheet)
+ {
+ if ( m_part )
+ m_part->setUserStyleSheet( sheet.string() );
+
+ delete this;
+ }
+ QGuardedPtr<KHTMLPart> m_part;
+ khtml::CachedCSSStyleSheet *m_cachedSheet;
+ };
+};
+
+
+FrameList::Iterator FrameList::find( const QString &name )
+{
+ Iterator it = begin();
+ Iterator e = end();
+
+ for (; it!=e; ++it )
+ if ( (*it).m_name==name )
+ break;
+
+ return it;
+}
+
+KHTMLPart::KHTMLPart( QWidget *parentWidget, const char *widgetname, QObject *parent, const char *name,
+ GUIProfile prof )
+: KParts::ReadOnlyPart( parent, name )
+{
+ d = 0;
+ KHTMLFactory::registerPart( this );
+ setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
+ init( new KHTMLView( this, parentWidget, widgetname ), prof );
+}
+
+KHTMLPart::KHTMLPart( KHTMLView *view, QObject *parent, const char *name, GUIProfile prof )
+: KParts::ReadOnlyPart( parent, name )
+{
+ d = 0;
+ KHTMLFactory::registerPart( this );
+ setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
+ assert( view );
+ init( view, prof );
+}
+
+void KHTMLPart::init( KHTMLView *view, GUIProfile prof )
+{
+ if ( prof == DefaultGUI )
+ setXMLFile( "khtml.rc" );
+ else if ( prof == BrowserViewGUI )
+ setXMLFile( "khtml_browser.rc" );
+
+ d = new KHTMLPartPrivate(parent());
+
+ d->m_view = view;
+ setWidget( d->m_view );
+
+ d->m_guiProfile = prof;
+ d->m_extension = new KHTMLPartBrowserExtension( this );
+ d->m_hostExtension = new KHTMLPartBrowserHostExtension( this );
+
+ d->m_bSecurityInQuestion = false;
+ d->m_paLoadImages = 0;
+ d->m_bMousePressed = false;
+ d->m_paViewDocument = new KAction( i18n( "View Document Source" ), 0, this, SLOT( slotViewDocumentSource() ), actionCollection(), "viewDocumentSource" );
+ d->m_paViewFrame = new KAction( i18n( "View Frame Source" ), 0, this, SLOT( slotViewFrameSource() ), actionCollection(), "viewFrameSource" );
+ d->m_paSaveBackground = new KAction( i18n( "Save &Background Image As..." ), 0, this, SLOT( slotSaveBackground() ), actionCollection(), "saveBackground" );
+ d->m_paSaveDocument = new KAction( i18n( "&Save As..." ), CTRL+Key_S, this, SLOT( slotSaveDocument() ), actionCollection(), "saveDocument" );
+ if ( parentPart() )
+ d->m_paSaveDocument->setShortcut( KShortcut() ); // avoid clashes
+ d->m_paSaveFrame = new KAction( i18n( "Save &Frame As..." ), 0, this, SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" );
+ d->m_paSecurity = new KAction( i18n( "Security..." ), "decrypted", 0, this, SLOT( slotSecurity() ), actionCollection(), "security" );
+ d->m_paDebugRenderTree = new KAction( "print rendering tree to stdout", 0, this, SLOT( slotDebugRenderTree() ), actionCollection(), "debugRenderTree" );
+ d->m_paDebugDOMTree = new KAction( "print DOM tree to stdout", 0, this, SLOT( slotDebugDOMTree() ), actionCollection(), "debugDOMTree" );
+
+ QString foo1 = i18n("Show Images");
+ QString foo2 = i18n("Show Animated Images");
+ QString foo3 = i18n("Stop Animated Images");
+
+ d->m_paSetEncoding = new KSelectAction( i18n( "Set &Encoding" ), 0, this, SLOT( slotSetEncoding() ), actionCollection(), "setEncoding" );
+ QStringList encodings = KGlobal::charsets()->descriptiveEncodingNames();
+ encodings.prepend( i18n( "Auto" ) );
+ d->m_paSetEncoding->setItems( encodings );
+ d->m_paSetEncoding->setCurrentItem(0);
+
+ d->m_paUseStylesheet = new KSelectAction( i18n( "&Use Stylesheet"), 0, this, SLOT( slotUseStylesheet() ), actionCollection(), "useStylesheet" );
+
+ d->m_paIncZoomFactor = new KHTMLZoomFactorAction( this, true, i18n( "Increase Font Sizes" ), "viewmag+", this, SLOT( slotIncZoom() ), actionCollection(), "incFontSizes" );
+ d->m_paDecZoomFactor = new KHTMLZoomFactorAction( this, false, i18n( "Decrease Font Sizes" ), "viewmag-", this, SLOT( slotDecZoom() ), actionCollection(), "decFontSizes" );
+
+ d->m_paFind = KStdAction::find( this, SLOT( slotFind() ), actionCollection(), "find" );
+ if ( parentPart() )
+ d->m_paFind->setShortcut( KShortcut() ); // avoid clashes
+
+ d->m_paPrintFrame = new KAction( i18n( "Print Frame" ), "frameprint", 0, this, SLOT( slotPrintFrame() ), actionCollection(), "printFrame" );
+
+ d->m_paSelectAll = KStdAction::selectAll( this, SLOT( slotSelectAll() ), actionCollection(), "selectAll" );
+ if ( parentPart() )
+ d->m_paSelectAll->setShortcut( KShortcut() ); // avoid clashes
+
+ // set the default java(script) flags according to the current host.
+ d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled();
+ d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled();
+ d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled();
+
+ connect( this, SIGNAL( completed() ),
+ this, SLOT( updateActions() ) );
+ connect( this, SIGNAL( completed( bool ) ),
+ this, SLOT( updateActions() ) );
+ connect( this, SIGNAL( started( KIO::Job * ) ),
+ this, SLOT( updateActions() ) );
+
+ d->m_popupMenuXML = KXMLGUIFactory::readConfigFile( locate( "data", "khtml/khtml_popupmenu.rc", KHTMLFactory::instance() ) );
+
+ connect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
+ this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
+ connect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+ connect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+
+ findTextBegin(); //reset find variables
+
+ connect( &d->m_redirectionTimer, SIGNAL( timeout() ),
+ this, SLOT( slotRedirect() ) );
+
+ d->m_dcopobject = new KHTMLPartIface(this);
+}
+
+KHTMLPart::~KHTMLPart()
+{
+ //kdDebug(6050) << "KHTMLPart::~KHTMLPart " << this << endl;
+ if ( d->m_findDialog )
+ disconnect( d->m_findDialog, SIGNAL( destroyed() ),
+ this, SLOT( slotFindDialogDestroyed() ) );
+
+ if ( d->m_manager )
+ {
+ d->m_manager->setActivePart( 0 );
+ // Shouldn't we delete d->m_manager here ? (David)
+ // No need to, I would say. We specify "this" as parent qobject
+ // in ::partManager() (Simon)
+ }
+
+ stopAutoScroll();
+ d->m_redirectionTimer.stop();
+
+ if ( d->m_job )
+ d->m_job->kill();
+
+ if ( d->m_doc && d->m_doc->docLoader() )
+ khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
+
+ disconnect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
+ this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
+ disconnect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+ disconnect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+
+ clear();
+
+ if ( d->m_view )
+ {
+ d->m_view->hide();
+ d->m_view->viewport()->hide();
+ d->m_view->m_part = 0;
+ }
+
+ delete d; d = 0;
+ KHTMLFactory::deregisterPart( this );
+}
+
+bool KHTMLPart::restoreURL( const KURL &url )
+{
+ kdDebug( 6050 ) << "KHTMLPart::restoreURL " << url.url() << endl;
+
+ d->m_redirectionTimer.stop();
+
+ /*
+ * That's not a good idea as it will call closeURL() on all
+ * child frames, preventing them from further loading. This
+ * method gets called from restoreState() in case of a full frameset
+ * restoral, and restoreState() calls closeURL() before restoring
+ * anyway.
+ kdDebug( 6050 ) << "closing old URL" << endl;
+ closeURL();
+ */
+
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+ d->m_workingURL = url;
+
+ d->m_restored = true;
+
+ // set the java(script) flags according to the current host.
+ d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
+ d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
+ d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
+
+ m_url = url;
+
+ KHTMLPageCache::self()->fetchData( d->m_cacheId, this, SLOT(slotRestoreData(const QByteArray &)));
+
+ emit started( 0L );
+
+ return true;
+}
+
+
+bool KHTMLPart::openURL( const KURL &url )
+{
+ kdDebug( 6050 ) << "KHTMLPart(" << this << ")::openURL " << url.url() << endl;
+
+ d->m_redirectionTimer.stop();
+
+ // check to see if this is an "error://" URL. This is caused when an error
+ // occurs before this part was loaded (e.g. KonqRun), and is passed to
+ // khtmlpart so that it can display the error.
+ if ( url.protocol() == "error" && url.hasSubURL() ) {
+ closeURL();
+ /**
+ * The format of the error url is that two variables are passed in the query:
+ * error = int kio error code, errText = QString error text from kio
+ * and the URL where the error happened is passed as a sub URL.
+ */
+ KURL::List urls = KURL::split( url );
+ //kdDebug() << "Handling error URL. URL count:" << urls.count() << endl;
+
+ if ( urls.count() > 1 ) {
+ KURL mainURL = urls.first();
+ int error = mainURL.queryItem( "error" ).toInt();
+ // error=0 isn't a valid error code, so 0 means it's missing from the URL
+ if ( error == 0 ) error = KIO::ERR_UNKNOWN;
+ QString errorText = mainURL.queryItem( "errText" );
+ urls.pop_front();
+ d->m_workingURL = KURL::join( urls );
+ //kdDebug() << "Emitting fixed URL " << d->m_workingURL.prettyURL() << endl;
+ emit d->m_extension->setLocationBarURL( d->m_workingURL.prettyURL() );
+ htmlError( error, errorText, d->m_workingURL );
+ return true;
+ }
+ }
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ // in case we have a) no frameset (don't test m_frames.count(), iframes get in there)
+ // b) the url is identical with the currently
+ // displayed one (except for the htmlref!) , c) the url request is not a POST
+ // operation and d) the caller did not request to reload the page we try to
+ // be smart and instead of reloading the whole document we just jump to the
+ // request html anchor
+ bool isFrameSet = false;
+ if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
+ HTMLDocumentImpl* htmlDoc = static_cast<HTMLDocumentImpl*>(d->m_doc);
+ isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
+ }
+ if ( !isFrameSet &&
+ urlcmp( url.url(), m_url.url(), true, true ) &&
+ url.hasRef() && !args.doPost() && !args.reload )
+ {
+ kdDebug( 6050 ) << "KHTMLPart::openURL, jumping to anchor. m_url = " << url.url() << endl;
+ m_url = url;
+ emit started( 0L );
+
+ if ( !gotoAnchor( url.encodedHtmlRef()) )
+ gotoAnchor( url.htmlRef() );
+
+ d->m_bComplete = true;
+ d->m_doc->setParsing(false);
+
+ kdDebug( 6050 ) << "completed..." << endl;
+ emit completed();
+ return true;
+ }
+
+ kdDebug( 6050 ) << "closing old URL" << endl;
+ closeURL();
+
+ args.metaData().insert("main_frame_request", parentPart() == 0 ? "TRUE" : "FALSE" );
+ args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE" : "FALSE" );
+ args.metaData().insert("ssl_activate_warnings", "TRUE" );
+ d->m_bReloading = args.reload;
+
+ if ( args.doPost() && (url.protocol().startsWith("http")) )
+ {
+ d->m_job = KIO::http_post( url, args.postData, false );
+ d->m_job->addMetaData("content-type", args.contentType() );
+ }
+ else
+ d->m_job = KIO::get( url, args.reload, false );
+
+ d->m_job->addMetaData(args.metaData());
+
+ connect( d->m_job, SIGNAL( result( KIO::Job * ) ),
+ SLOT( slotFinished( KIO::Job * ) ) );
+ connect( d->m_job, SIGNAL( data( KIO::Job*, const QByteArray &)),
+ SLOT( slotData( KIO::Job*, const QByteArray &)));
+
+ connect( d->m_job, SIGNAL(redirection(KIO::Job*, const KURL&) ),
+ SLOT( slotRedirection(KIO::Job*,const KURL&) ) );
+
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+ d->m_restored = false;
+
+ // delete old status bar msg's from kjs (if it _was_ activated on last URL)
+ if( d->m_bJScriptEnabled )
+ {
+ d->m_kjsStatusBarText = QString::null;
+ d->m_kjsDefaultStatusBarText = QString::null;
+ }
+
+ // set the javascript flags according to the current url
+ d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
+ d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
+ d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
+
+ // 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
+ // data arrives) (Simon)
+ m_url = url;
+ if(m_url.protocol().startsWith( "http" ) && !m_url.host().isEmpty() &&
+ m_url.path().isEmpty()) {
+ m_url.setPath("/");
+ emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
+ }
+ // copy to m_workingURL after fixing m_url above
+ d->m_workingURL = m_url;
+
+ kdDebug( 6050 ) << "KHTMLPart::openURL now (before started) m_url = " << m_url.url() << endl;
+
+ connect( d->m_job, SIGNAL( speed( KIO::Job*, unsigned long ) ),
+ this, SLOT( slotJobSpeed( KIO::Job*, unsigned long ) ) );
+
+ connect( d->m_job, SIGNAL( percent( KIO::Job*, unsigned long ) ),
+ this, SLOT( slotJobPercent( KIO::Job*, unsigned long ) ) );
+
+ emit started( 0L );
+
+ return true;
+}
+
+bool KHTMLPart::closeURL()
+{
+ if ( d->m_job )
+ {
+ KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
+ d->m_job->kill();
+ d->m_job = 0;
+ }
+
+ if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
+ HTMLDocumentImpl* hdoc = static_cast<HTMLDocumentImpl*>( d->m_doc );
+
+ if ( hdoc->body() && d->m_bLoadEventEmitted ) {
+ hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT, false, false );
+ if ( d->m_doc )
+ d->m_doc->updateRendering();
+ d->m_bLoadEventEmitted = false;
+ }
+ }
+
+ d->m_bComplete = true; // to avoid emitting completed() in slotFinishedParsing() (David)
+ d->m_bLoadEventEmitted = true; // don't want that one either
+ d->m_bReloading = false;
+
+ KHTMLPageCache::self()->cancelFetch(this);
+ if ( d->m_doc && d->m_doc->parsing() )
+ {
+ kdDebug( 6050 ) << " was still parsing... calling end " << endl;
+ slotFinishedParsing();
+ d->m_doc->setParsing(false);
+ }
+
+ if ( !d->m_workingURL.isEmpty() )
+ {
+ // Aborted before starting to render
+ kdDebug( 6050 ) << "Aborted before starting to render, reverting location bar to " << m_url.prettyURL() << endl;
+ emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
+ }
+
+ d->m_workingURL = KURL();
+
+ if ( d->m_doc && d->m_doc->docLoader() )
+ khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
+
+ // tell all subframes to stop as well
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() )
+ ( *it ).m_part->closeURL();
+
+ d->m_bPendingChildRedirection = false;
+
+ // Stop any started redirections as well!! (DA)
+ if ( d && d->m_redirectionTimer.isActive() )
+ d->m_redirectionTimer.stop();
+
+ // null node activated.
+ emit nodeActivated(Node());
+
+ return true;
+}
+
+DOM::HTMLDocument KHTMLPart::htmlDocument() const
+{
+ if (d->m_doc && d->m_doc->isHTMLDocument())
+ return static_cast<HTMLDocumentImpl*>(d->m_doc);
+ else
+ return static_cast<HTMLDocumentImpl*>(0);
+}
+
+DOM::Document KHTMLPart::document() const
+{
+ return d->m_doc;
+}
+
+
+KParts::BrowserExtension *KHTMLPart::browserExtension() const
+{
+ return d->m_extension;
+}
+
+KHTMLView *KHTMLPart::view() const
+{
+ return d->m_view;
+}
+
+void KHTMLPart::setJScriptEnabled( bool enable )
+{
+ if ( !enable && jScriptEnabled() && d->m_jscript ) {
+ d->m_jscript->clear();
+ }
+ d->m_bJScriptForce = enable;
+ d->m_bJScriptOverride = true;
+}
+
+bool KHTMLPart::jScriptEnabled() const
+{
+ if ( d->m_bJScriptOverride )
+ return d->m_bJScriptForce;
+ return d->m_bJScriptEnabled;
+}
+
+void KHTMLPart::setMetaRefreshEnabled( bool enable )
+{
+ d->m_metaRefreshEnabled = enable;
+}
+
+bool KHTMLPart::metaRefreshEnabled() const
+{
+ return d->m_metaRefreshEnabled;
+}
+
+// Define this to disable dlopening kjs_html, when directly linking to it.
+// You need to edit khtml/Makefile.am to add ./ecma/libkjs_html.la to LIBADD
+// and to edit khtml/ecma/Makefile.am to s/kjs_html/libkjs_html/, remove libkhtml from LIBADD,
+// remove LDFLAGS line, and replace kde_module with either lib (shared) or noinst (static)
+//#define DIRECT_LINKAGE_TO_ECMA
+
+#ifdef DIRECT_LINKAGE_TO_ECMA
+extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
+#endif
+
+KJSProxy *KHTMLPart::jScript()
+{
+ if (!jScriptEnabled()) return 0;
+
+ if ( !d->m_jscript )
+ {
+#ifndef DIRECT_LINKAGE_TO_ECMA
+ KLibrary *lib = KLibLoader::self()->library("kjs_html");
+ if ( !lib ) {
+ setJScriptEnabled( false );
+ return 0;
+ }
+ // look for plain C init function
+ void *sym = lib->symbol("kjs_html_init");
+ if ( !sym ) {
+ lib->unload();
+ setJScriptEnabled( false );
+ return 0;
+ }
+ typedef KJSProxy* (*initFunction)(KHTMLPart *);
+ initFunction initSym = (initFunction) sym;
+ d->m_jscript = (*initSym)(this);
+ d->m_kjs_lib = lib;
+#else
+ d->m_jscript = kjs_html_init(this);
+ // d->m_kjs_lib remains 0L.
+#endif
+ if (d->m_bJScriptDebugEnabled)
+ d->m_jscript->setDebugEnabled(true);
+ }
+
+ return d->m_jscript;
+}
+
+QVariant KHTMLPart::executeScript( const QString &script )
+{
+ return executeScript( DOM::Node(), script );
+}
+
+//Enable this to see all JS scripts being executed
+//#define KJS_VERBOSE
+
+QVariant KHTMLPart::executeScript( const DOM::Node &n, const QString &script )
+{
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "KHTMLPart::executeScript n=" << n.nodeName().string().latin1() << "(" << (n.isNull() ? 0 : n.nodeType()) << ") " << script << endl;
+#endif
+ KJSProxy *proxy = jScript();
+
+ if (!proxy || proxy->paused())
+ return QVariant();
+ d->m_runningScripts++;
+ QVariant ret = proxy->evaluate( QString::null, 0, script, n );
+ d->m_runningScripts--;
+ if (!d->m_runningScripts && d->m_doc && !d->m_doc->parsing() && d->m_submitForm )
+ submitFormAgain();
+ DocumentImpl::updateDocumentsRendering();
+
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "KHTMLPart::executeScript - done" << endl;
+#endif
+ return ret;
+}
+
+bool KHTMLPart::scheduleScript(const DOM::Node &n, const QString& script)
+{
+ //kdDebug(6050) << "KHTMLPart::scheduleScript "<< script << endl;
+
+ d->scheduledScript = script;
+ d->scheduledScriptNode = n;
+
+ return true;
+}
+
+QVariant KHTMLPart::executeScheduledScript()
+{
+ if( d->scheduledScript.isEmpty() )
+ return QVariant();
+
+ //kdDebug(6050) << "executing delayed " << d->scheduledScript << endl;
+
+ QVariant ret = executeScript( d->scheduledScriptNode, d->scheduledScript );
+ d->scheduledScript = QString();
+ d->scheduledScriptNode = DOM::Node();
+
+ return ret;
+}
+
+void KHTMLPart::setJavaEnabled( bool enable )
+{
+ d->m_bJavaForce = enable;
+ d->m_bJavaOverride = true;
+}
+
+bool KHTMLPart::javaEnabled() const
+{
+#ifndef Q_WS_QWS
+ if( d->m_bJavaOverride )
+ return d->m_bJavaForce;
+ return d->m_bJavaEnabled;
+#else
+ return false;
+#endif
+}
+
+KJavaAppletContext *KHTMLPart::javaContext()
+{
+#ifndef Q_WS_QWS
+ return d->m_javaContext;
+#else
+ return 0;
+#endif
+}
+
+KJavaAppletContext *KHTMLPart::createJavaContext()
+{
+#ifndef Q_WS_QWS
+ if ( !d->m_javaContext ) {
+ d->m_javaContext = new KJavaAppletContext();
+ connect( d->m_javaContext, SIGNAL(showStatus(const QString&)),
+ this, SIGNAL(setStatusBarText(const QString&)) );
+ connect( d->m_javaContext, SIGNAL(showDocument(const QString&, const QString&)),
+ this, SLOT(slotShowDocument(const QString&, const QString&)) );
+ }
+
+ return d->m_javaContext;
+#else
+ return 0;
+#endif
+}
+
+void KHTMLPart::setPluginsEnabled( bool enable )
+{
+ d->m_bPluginsForce = enable;
+ d->m_bPluginsOverride = true;
+}
+
+bool KHTMLPart::pluginsEnabled() const
+{
+ if ( d->m_bPluginsOverride )
+ return d->m_bPluginsForce;
+ return d->m_bPluginsEnabled;
+}
+
+void KHTMLPart::slotShowDocument( const QString &url, const QString &target )
+{
+ // this is mostly copied from KHTMLPart::slotChildURLRequest. The better approach
+ // would be to put those functions into a single one.
+ khtml::ChildFrame *child = 0;
+ KParts::URLArgs args;
+ args.frameName = target;
+
+ QString frameName = args.frameName.lower();
+ if ( !frameName.isEmpty() )
+ {
+ if ( frameName == QString::fromLatin1( "_top" ) )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_blank" ) )
+ {
+ emit d->m_extension->createNewWindow( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_parent" ) )
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+
+ emit d->m_extension->openURLRequest( url, newArgs );
+ return;
+ }
+ else if ( frameName != QString::fromLatin1( "_self" ) )
+ {
+ khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
+
+ if ( !_frame )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+
+ child = _frame;
+ }
+ }
+
+ // TODO: handle child target correctly! currently the script are always executed fur the parent
+ if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
+ executeScript( url.right( url.length() - 11) );
+ return;
+ }
+
+ if ( child ) {
+ requestObject( child, KURL(url), args );
+ } else if ( frameName==QString::fromLatin1("_self") ) // this is for embedded objects (via <object>) which want to replace the current document
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+ emit d->m_extension->openURLRequest( KURL(url), newArgs );
+ }
+}
+
+void KHTMLPart::slotDebugDOMTree()
+{
+ if ( d->m_doc && d->m_doc->firstChild() )
+ qDebug("%s", d->m_doc->firstChild()->toHTML().latin1());
+}
+
+void KHTMLPart::slotDebugRenderTree()
+{
+#ifndef NDEBUG
+ if ( d->m_doc )
+ d->m_doc->renderer()->printTree();
+#endif
+}
+
+void KHTMLPart::setAutoloadImages( bool enable )
+{
+ if ( d->m_doc && d->m_doc->docLoader()->autoloadImages() == enable )
+ return;
+
+ if ( d->m_doc )
+ d->m_doc->docLoader()->setAutoloadImages( enable );
+
+ unplugActionList( "loadImages" );
+
+ if ( enable ) {
+ delete d->m_paLoadImages;
+ d->m_paLoadImages = 0;
+ }
+ else if ( !d->m_paLoadImages )
+ d->m_paLoadImages = new KAction( i18n( "Display Images on Page" ), "images_display", 0, this, SLOT( slotLoadImages() ), actionCollection(), "loadImages" );
+
+ if ( d->m_paLoadImages ) {
+ QPtrList<KAction> lst;
+ lst.append( d->m_paLoadImages );
+ plugActionList( "loadImages", lst );
+ }
+}
+
+bool KHTMLPart::autoloadImages() const
+{
+ if ( d->m_doc )
+ return d->m_doc->docLoader()->autoloadImages();
+
+ return true;
+}
+
+void KHTMLPart::clear()
+{
+ kdDebug( 6090 ) << "KHTMLPart::clear() this = " << this << endl;
+ if ( d->m_bCleared )
+ return;
+ d->m_bCleared = true;
+
+ d->m_bClearing = true;
+
+ {
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for(; it != end; ++it )
+ {
+ // Stop HTMLRun jobs for frames
+ if ( (*it).m_run )
+ (*it).m_run->abort();
+ }
+ }
+
+ {
+ QValueList<khtml::ChildFrame>::ConstIterator it = d->m_objects.begin();
+ QValueList<khtml::ChildFrame>::ConstIterator end = d->m_objects.end();
+ for(; it != end; ++it )
+ {
+ // Stop HTMLRun jobs for objects
+ if ( (*it).m_run )
+ (*it).m_run->abort();
+ }
+ }
+
+
+ findTextBegin(); // resets d->m_findNode and d->m_findPos
+
+ d->m_mousePressNode = DOM::Node();
+
+
+ if ( d->m_doc )
+ {
+ kdDebug( 6090 ) << "KHTMLPart::clear(): detaching the document " << d->m_doc << endl;
+ d->m_doc->detach();
+ }
+
+ // Moving past doc so that onUnload works.
+ if ( d->m_jscript )
+ d->m_jscript->clear();
+
+ if ( d->m_view )
+ d->m_view->clear();
+
+ // do not dereference the document before the jscript and view are cleared, as some destructors
+ // might still try to access the document.
+ if ( d->m_doc )
+ {
+ kdDebug( 6090 ) << "KHTMLPart::clear(): dereferencing the document " << d->m_doc << endl;
+ d->m_doc->deref();
+ }
+ d->m_doc = 0;
+
+ delete d->m_decoder;
+
+ d->m_decoder = 0;
+
+ {
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for(; it != end; ++it )
+ {
+ if ( (*it).m_part )
+ {
+ partManager()->removePart( (*it).m_part );
+ delete (KParts::ReadOnlyPart *)(*it).m_part;
+ }
+ }
+ }
+
+ d->m_frames.clear();
+ d->m_objects.clear();
+
+#ifndef Q_WS_QWS
+ delete d->m_javaContext;
+ d->m_javaContext = 0;
+#endif
+
+ d->m_delayRedirect = 0;
+ d->m_redirectURL = QString::null;
+ d->m_bHTTPRefresh = false;
+ d->m_bClearing = false;
+ d->m_frameNameId = 1;
+ d->m_bFirstData = true;
+
+ d->m_bMousePressed = false;
+
+ d->m_selectionStart = DOM::Node();
+ d->m_selectionEnd = DOM::Node();
+ d->m_startOffset = 0;
+ d->m_endOffset = 0;
+#ifndef QT_NO_CLIPBOARD
+ connect( kapp->clipboard(), SIGNAL( selectionChanged()), SLOT( slotClearSelection()));
+#endif
+
+ d->m_totalObjectCount = 0;
+ d->m_loadedObjects = 0;
+ d->m_jobPercent = 0;
+
+ if ( !d->m_haveEncoding )
+ d->m_encoding = QString::null;
+#ifdef SPEED_DEBUG
+ d->m_parsetime.restart();
+#endif
+}
+
+bool KHTMLPart::openFile()
+{
+ return true;
+}
+
+DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const
+{
+ if ( d && d->m_doc && d->m_doc->isHTMLDocument() )
+ return static_cast<HTMLDocumentImpl*>(d->m_doc);
+ return 0;
+}
+
+DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const
+{
+ if ( d )
+ return d->m_doc;
+ return 0;
+}
+
+/*bool KHTMLPart::isSSLInUse() const
+{
+ return d->m_ssl_in_use;
+}*/
+
+void KHTMLPart::slotData( KIO::Job* kio_job, const QByteArray &data )
+{
+ assert ( d->m_job == kio_job );
+
+ //kdDebug( 6050 ) << "slotData: " << data.size() << endl;
+ // The first data ?
+ if ( !d->m_workingURL.isEmpty() )
+ {
+ //kdDebug( 6050 ) << "begin!" << endl;
+
+ begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
+
+ d->m_doc->docLoader()->setReloading(d->m_bReloading);
+ d->m_workingURL = KURL();
+
+ d->m_cacheId = KHTMLPageCache::self()->createCacheEntry();
+
+ // When the first data arrives, the metadata has just been made available
+ d->m_bSecurityInQuestion = false;
+ d->m_ssl_in_use = (d->m_job->queryMetaData("ssl_in_use") == "TRUE");
+ kdDebug(6050) << "SSL in use? " << d->m_job->queryMetaData("ssl_in_use") << endl;
+
+ {
+ KHTMLPart *p = parentPart();
+ if (p && p->d->m_ssl_in_use != d->m_ssl_in_use) {
+ while (p->parentPart()) p = p->parentPart();
+
+ p->d->m_paSecurity->setIcon( "halfencrypted" );
+ p->d->m_bSecurityInQuestion = true;
+ kdDebug(6050) << "parent setIcon half done." << endl;
+ }
+ }
+
+ d->m_paSecurity->setIcon( d->m_ssl_in_use ? "encrypted" : "decrypted" );
+ kdDebug(6050) << "setIcon " << ( d->m_ssl_in_use ? "encrypted" : "decrypted" ) << " done." << endl;
+
+ // Shouldn't all of this be done only if ssl_in_use == true ? (DF)
+
+ d->m_ssl_peer_certificate = d->m_job->queryMetaData("ssl_peer_certificate");
+ d->m_ssl_peer_chain = d->m_job->queryMetaData("ssl_peer_chain");
+ d->m_ssl_peer_ip = d->m_job->queryMetaData("ssl_peer_ip");
+ d->m_ssl_cipher = d->m_job->queryMetaData("ssl_cipher");
+ d->m_ssl_cipher_desc = d->m_job->queryMetaData("ssl_cipher_desc");
+ d->m_ssl_cipher_version = d->m_job->queryMetaData("ssl_cipher_version");
+ d->m_ssl_cipher_used_bits = d->m_job->queryMetaData("ssl_cipher_used_bits");
+ d->m_ssl_cipher_bits = d->m_job->queryMetaData("ssl_cipher_bits");
+ d->m_ssl_cert_state = d->m_job->queryMetaData("ssl_cert_state");
+
+ // Check for charset meta-data
+ QString qData = d->m_job->queryMetaData("charset");
+ if ( !qData.isEmpty() && !d->m_haveEncoding ) // only use information if the user didn't override the settings
+ d->m_encoding = qData;
+
+ // Support for http-refresh
+ qData = d->m_job->queryMetaData("http-refresh");
+ if( !qData.isEmpty() && d->m_metaRefreshEnabled )
+ {
+ kdDebug(6050) << "HTTP Refresh Request: " << qData << endl;
+ int delay;
+ int pos = qData.find( ';' );
+ if ( pos == -1 )
+ pos = qData.find( ',' );
+
+ if( pos == -1 )
+ {
+ delay = qData.stripWhiteSpace().toInt();
+ scheduleRedirection( qData.toInt(), m_url.url());
+ }
+ else
+ {
+ int end_pos = qData.length();
+ delay = qData.left(pos).stripWhiteSpace().toInt();
+ while ( qData[++pos] == ' ' );
+ if ( qData.find( "url", pos, false ) == pos )
+ {
+ pos += 3;
+ while (qData[pos] == ' ' || qData[pos] == '=' )
+ pos++;
+ if ( qData[pos] == '"' )
+ {
+ pos++;
+ int index = end_pos-1;
+ while( index > pos )
+ {
+ if ( qData[index] == '"' )
+ break;
+ index--;
+ }
+ if ( index > pos )
+ end_pos = index;
+ }
+ }
+ scheduleRedirection( delay, d->m_doc->completeURL( qData.mid( pos, end_pos ) ));
+ }
+ d->m_bHTTPRefresh = true;
+ }
+
+ // Support for http last-modified
+ d->m_lastModified = d->m_job->queryMetaData("modified");
+ //kdDebug() << "KHTMLPart::slotData metadata modified: " << d->m_lastModified << endl;
+ }
+
+ KHTMLPageCache::self()->addData(d->m_cacheId, data);
+ write( data.data(), data.size() );
+}
+
+void KHTMLPart::slotRestoreData(const QByteArray &data )
+{
+ // The first data ?
+ if ( !d->m_workingURL.isEmpty() )
+ {
+ long saveCacheId = d->m_cacheId;
+ begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
+ d->m_cacheId = saveCacheId;
+ d->m_workingURL = KURL();
+ }
+
+ //kdDebug( 6050 ) << "slotRestoreData: " << data.size() << endl;
+ write( data.data(), data.size() );
+
+ if (data.size() == 0)
+ {
+ //kdDebug( 6050 ) << "slotRestoreData: <<end of data>>" << endl;
+ // End of data.
+ if (d->m_doc && d->m_doc->parsing())
+ end(); //will emit completed()
+ }
+}
+
+void KHTMLPart::showError( KIO::Job* job )
+{
+ kdDebug() << "KHTMLPart::showError d->m_bParsing=" << (d->m_doc && d->m_doc->parsing()) << " d->m_bComplete=" << d->m_bComplete
+ << " d->m_bCleared=" << d->m_bCleared << endl;
+
+ if (job->error() == KIO::ERR_NO_CONTENT)
+ return;
+
+ if ( (d->m_doc && d->m_doc->parsing()) || d->m_workingURL.isEmpty() ) // if we got any data already
+ job->showErrorDialog( /*d->m_view*/ );
+ else
+ {
+ htmlError( job->error(), job->errorText(), d->m_workingURL );
+ }
+}
+
+// This is a protected method, placed here because of it's relevance to showError
+void KHTMLPart::htmlError( int errorCode, const QString& text, const KURL& reqUrl )
+{
+ kdDebug(6050) << "KHTMLPart::htmlError errorCode=" << errorCode << " text=" << text << endl;
+ // make sure we're not executing any embedded JS
+ bool bJSFO = d->m_bJScriptForce;
+ bool bJSOO = d->m_bJScriptOverride;
+ d->m_bJScriptForce = false;
+ d->m_bJScriptOverride = true;
+ begin();
+ QString errText = QString::fromLatin1( "<HTML><HEAD><TITLE>" );
+ errText += i18n( "Error while loading %1" ).arg( reqUrl.prettyURL() );
+ errText += QString::fromLatin1( "</TITLE></HEAD><BODY><P>" );
+ errText += i18n( "An error occured while loading <B>%1</B>:" ).arg( reqUrl.prettyURL() );
+ errText += QString::fromLatin1( "</P><P>" );
+ QString kioErrString = KIO::buildErrorString( errorCode, text );
+ // In case the error string has '\n' in it, replace with <BR/>
+ kioErrString.replace( QRegExp("\n"), "<BR/>" );
+ errText += kioErrString;
+ errText += QString::fromLatin1( "</PRE></P></BODY></HTML>" );
+ write(errText);
+ end();
+
+ d->m_bJScriptForce = bJSFO;
+ d->m_bJScriptOverride = bJSOO;
+
+ // make the working url the current url, so that reload works and
+ // emit the progress signals to advance one step in the history
+ // (so that 'back' works)
+ m_url = reqUrl; // same as d->m_workingURL
+ d->m_workingURL = KURL();
+ emit started( 0 );
+ emit completed();
+ return;
+ // following disabled until 3.1
+
+ QString errorName, techName, description;
+ QStringList causes, solutions;
+
+ QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
+ QDataStream stream(raw, IO_ReadOnly);
+
+ stream >> errorName >> techName >> description >> causes >> solutions;
+
+ QString url, protocol, datetime;
+ url = reqUrl.prettyURL();
+ protocol = reqUrl.protocol();
+ datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
+ false );
+
+ QString doc = QString::fromLatin1( "<html><head><title>" );
+ doc += i18n( "Error: " );
+ doc += errorName;
+ doc += QString::fromLatin1( " - %1</title></head><body><h1>" ).arg( url );
+ doc += i18n( "The requested operation could not be completed" );
+ doc += QString::fromLatin1( "</h1><h2>" );
+ doc += errorName;
+ doc += QString::fromLatin1( "</h2>" );
+ if ( techName != QString::null ) {
+ doc += QString::fromLatin1( "<h2>" );
+ doc += i18n( "Technical Reason: " );
+ doc += techName;
+ doc += QString::fromLatin1( "</h2>" );
+ }
+ doc += QString::fromLatin1( "<h3>" );
+ doc += i18n( "Details of the Request:" );
+ doc += QString::fromLatin1( "</h3><ul><li>" );
+ doc += i18n( "URL: %1" ).arg( url );
+ doc += QString::fromLatin1( "</li><li>" );
+ if ( protocol != QString::null ) {
+ // uncomment for 3.1... i18n change
+ // doc += i18n( "Protocol: %1" ).arg( protocol ).arg( protocol );
+ doc += QString::fromLatin1( "</li><li>" );
+ }
+ doc += i18n( "Date and Time: %1" ).arg( datetime );
+ doc += QString::fromLatin1( "</li><li>" );
+ doc += i18n( "Additional Information: %1" ).arg( text );
+ doc += QString::fromLatin1( "</li></ul><h3>" );
+ doc += i18n( "Description:" );
+ doc += QString::fromLatin1( "</h3><p>" );
+ doc += description;
+ doc += QString::fromLatin1( "</p>" );
+ if ( causes.count() ) {
+ doc += QString::fromLatin1( "<h3>" );
+ doc += i18n( "Possible Causes:" );
+ doc += QString::fromLatin1( "</h3><ul><li>" );
+ doc += causes.join( "</li><li>" );
+ doc += QString::fromLatin1( "</li></ul>" );
+ }
+ if ( solutions.count() ) {
+ doc += QString::fromLatin1( "<h3>" );
+ doc += i18n( "Possible Solutions:" );
+ doc += QString::fromLatin1( "</h3><ul><li>" );
+ doc += solutions.join( "</li><li>" );
+ doc += QString::fromLatin1( "</li></ul>" );
+ }
+ doc += QString::fromLatin1( "</body></html>" );
+
+ write( doc );
+ end();
+}
+
+void KHTMLPart::slotFinished( KIO::Job * job )
+{
+ if (job->error())
+ {
+ KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
+ d->m_job = 0L;
+ emit canceled( job->errorString() );
+ // TODO: what else ?
+ checkCompleted();
+ showError( job );
+ return;
+ }
+ //kdDebug( 6050 ) << "slotFinished" << endl;
+
+ KHTMLPageCache::self()->endData(d->m_cacheId);
+
+ if ( d->m_doc && d->m_doc->docLoader()->expireDate() && m_url.protocol().lower().startsWith("http"))
+ KIO::http_update_cache(m_url, false, d->m_doc->docLoader()->expireDate());
+
+ d->m_workingURL = KURL();
+ d->m_job = 0L;
+
+ if (d->m_doc->parsing())
+ end(); //will emit completed()
+}
+
+void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset )
+{
+ clear();
+ d->m_bCleared = false;
+ d->m_cacheId = 0;
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+
+ if(url.isValid()) {
+ QString urlString = url.url();
+ KHTMLFactory::vLinks()->insert( urlString );
+ QString urlString2 = url.prettyURL();
+ if ( urlString != urlString2 ) {
+ KHTMLFactory::vLinks()->insert( urlString2 );
+ }
+ }
+
+ // ###
+ //stopParser();
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ args.xOffset = xOffset;
+ args.yOffset = yOffset;
+ d->m_extension->setURLArgs( args );
+
+ d->m_referrer = url.url();
+ m_url = url;
+ KURL baseurl;
+
+ if ( !m_url.isEmpty() )
+ {
+ KURL::List lst = KURL::split( m_url );
+ if ( !lst.isEmpty() )
+ baseurl = *lst.begin();
+
+ KURL title( baseurl );
+ title.setRef( QString::null );
+ title.setQuery( QString::null );
+ emit setWindowCaption( title.url() );
+ }
+ else
+ emit setWindowCaption( i18n( "no title", "* Unknown *" ) );
+
+ // ### not sure if XHTML documents served as text/xml should use DocumentImpl or HTMLDocumentImpl
+ if (args.serviceType == "text/xml")
+ d->m_doc = DOMImplementationImpl::instance()->createDocument( d->m_view );
+ else
+ d->m_doc = DOMImplementationImpl::instance()->createHTMLDocument( d->m_view );
+
+ d->m_doc->ref();
+ if (!d->m_doc->attached())
+ d->m_doc->attach( );
+ d->m_doc->setURL( m_url.url() );
+ // We prefer m_baseURL over m_url because m_url changes when we are
+ // about to load a new page.
+ d->m_doc->setBaseURL( baseurl.url() );
+ d->m_doc->docLoader()->setShowAnimations( KHTMLFactory::defaultHTMLSettings()->showAnimations() );
+
+ // Inherit domain from parent
+ KHTMLPart* parent = parentPart();
+ if (d->m_doc->isHTMLDocument() && parent && parent->d->m_doc && parent->d->m_doc->isHTMLDocument()) {
+ DOMString domain = static_cast<HTMLDocumentImpl*>(parent->d->m_doc)->domain();
+ kdDebug() << "KHTMLPart::begin setting frame domain to " << domain.string() << endl;
+ static_cast<HTMLDocumentImpl*>(d->m_doc)->setDomain( domain, true );
+ }
+
+ d->m_paUseStylesheet->setItems(QStringList());
+ d->m_paUseStylesheet->setEnabled( false );
+
+ setAutoloadImages( KHTMLFactory::defaultHTMLSettings()->autoLoadImages() );
+ QString userStyleSheet = KHTMLFactory::defaultHTMLSettings()->userStyleSheet();
+ if ( !userStyleSheet.isEmpty() )
+ setUserStyleSheet( KURL( userStyleSheet ) );
+
+ d->m_doc->setRestoreState(args.docState);
+ d->m_doc->open();
+ // clear widget
+ d->m_view->resizeContents( 0, 0 );
+ connect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
+
+ emit d->m_extension->enableAction( "print", true );
+
+ d->m_doc->setParsing(true);
+}
+
+void KHTMLPart::write( const char *str, int len )
+{
+ if ( !d->m_decoder ) {
+ d->m_decoder = new khtml::Decoder();
+ if(d->m_encoding != QString::null)
+ d->m_decoder->setEncoding(d->m_encoding.latin1(), d->m_haveEncoding);
+ else
+ d->m_decoder->setEncoding(settings()->encoding().latin1(), d->m_haveEncoding);
+ }
+ if ( len == 0 )
+ return;
+
+ if ( len == -1 )
+ len = strlen( str );
+
+ QString decoded = d->m_decoder->decode( str, len );
+
+ if(decoded.isEmpty()) return;
+
+ if(d->m_bFirstData) {
+ // determine the parse mode
+ d->m_doc->determineParseMode( decoded );
+ d->m_bFirstData = false;
+
+ //kdDebug(6050) << "KHTMLPart::write haveEnc = " << d->m_haveEncoding << endl;
+ // ### this is still quite hacky, but should work a lot better than the old solution
+ if(d->m_decoder->visuallyOrdered()) d->m_doc->setVisuallyOrdered();
+ d->m_doc->recalcStyle( NodeImpl::Force );
+ }
+
+ if (jScript())
+ jScript()->appendSourceFile(m_url.url(),decoded);
+ Tokenizer* t = d->m_doc->tokenizer();
+ if(t)
+ t->write( decoded, true );
+}
+
+void KHTMLPart::write( const QString &str )
+{
+ if ( str.isNull() )
+ return;
+
+ if(d->m_bFirstData) {
+ // determine the parse mode
+ d->m_doc->setParseMode( DocumentImpl::Strict );
+ d->m_bFirstData = false;
+ }
+ if (jScript())
+ jScript()->appendSourceFile(m_url.url(),str);
+ Tokenizer* t = d->m_doc->tokenizer();
+ if(t)
+ t->write( str, true );
+}
+
+void KHTMLPart::end()
+{
+ // make sure nothing's left in there...
+ if(d->m_decoder)
+ write(d->m_decoder->flush());
+ if (d->m_doc)
+ d->m_doc->finishParsing();
+}
+
+void KHTMLPart::paint(QPainter *p, const QRect &rc, int yOff, bool *more)
+{
+ if (!d->m_view) return;
+ d->m_view->paint(p, rc, yOff, more);
+}
+
+void KHTMLPart::stopAnimations()
+{
+ if ( d->m_doc )
+ d->m_doc->docLoader()->setShowAnimations( KHTMLSettings::KAnimationDisabled );
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
+ KParts::ReadOnlyPart* p = ( *it ).m_part;
+ static_cast<KHTMLPart*>( p )->stopAnimations();
+ }
+}
+
+void KHTMLPart::slotFinishedParsing()
+{
+ d->m_doc->setParsing(false);
+ checkEmitLoadEvent();
+ disconnect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
+
+ if (!d->m_view)
+ return; // We are probably being destructed.
+ // check if the scrollbars are really needed for the content
+ // if not, remove them, relayout, and repaint
+
+ d->m_view->restoreScrollBar();
+
+ if ( !m_url.encodedHtmlRef().isEmpty() )
+ if ( !gotoAnchor( m_url.encodedHtmlRef()) )
+ gotoAnchor( m_url.htmlRef() );
+
+ checkCompleted();
+}
+
+void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
+{
+ if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
+ KHTMLPart* p = this;
+ while ( p ) {
+ KHTMLPart* op = p;
+ p->d->m_totalObjectCount++;
+ p = p->parentPart();
+ if ( !p && d->m_loadedObjects <= d->m_totalObjectCount )
+ QTimer::singleShot( 200, op, SLOT( slotProgressUpdate() ) );
+ }
+ }
+}
+
+void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
+{
+ if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
+ KHTMLPart* p = this;
+ while ( p ) {
+ KHTMLPart* op = p;
+ p->d->m_loadedObjects++;
+ p = p->parentPart();
+ if ( !p && d->m_loadedObjects <= d->m_totalObjectCount && d->m_jobPercent >= 100 )
+ QTimer::singleShot( 200, op, SLOT( slotProgressUpdate() ) );
+ }
+ }
+
+ checkCompleted();
+}
+
+void KHTMLPart::slotProgressUpdate()
+{
+ int percent;
+ if ( d->m_loadedObjects < d->m_totalObjectCount )
+ percent = d->m_jobPercent / 4 + ( d->m_loadedObjects*300 ) / ( 4*d->m_totalObjectCount );
+ else
+ percent = d->m_jobPercent;
+
+ if ( d->m_loadedObjects < d->m_totalObjectCount && percent >= 75 )
+ emit d->m_extension->infoMessage( i18n( "%1 of 1 Image loaded", "%1 of %n Images loaded", d->m_totalObjectCount ).arg( d->m_loadedObjects ) );
+
+ emit d->m_extension->loadingProgress( percent );
+}
+
+void KHTMLPart::slotJobSpeed( KIO::Job* /*job*/, unsigned long speed )
+{
+ emit d->m_extension->speedProgress( speed );
+}
+
+void KHTMLPart::slotJobPercent( KIO::Job* /*job*/, unsigned long percent )
+{
+ d->m_jobPercent = percent;
+
+ if ( !parentPart() )
+ QTimer::singleShot( 0, this, SLOT( slotProgressUpdate() ) );
+}
+
+void KHTMLPart::checkCompleted()
+{
+// kdDebug( 6050 ) << "KHTMLPart::checkCompleted() parsing: " << d->m_doc->parsing() << endl;
+// kdDebug( 6050 ) << " complete: " << d->m_bComplete << endl;
+
+ // restore the cursor position
+ if (d->m_doc && !d->m_doc->parsing() && !d->m_focusNodeRestored)
+ {
+ if (d->m_focusNodeNumber >= 0)
+ d->m_doc->setFocusNode(d->m_doc->nodeWithAbsIndex(d->m_focusNodeNumber));
+ else
+ d->m_doc->setFocusNode(0);
+ d->m_focusNodeRestored = true;
+ }
+
+ // Any frame that hasn't completed yet ?
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !(*it).m_bCompleted )
+ return;
+
+ // Are we still parsing - or have we done the completed stuff already ?
+ if ( d->m_bComplete || (d->m_doc && d->m_doc->parsing()) )
+ return;
+
+ // Still waiting for images/scripts from the loader ?
+ int requests = 0;
+ if ( d->m_doc && d->m_doc->docLoader() )
+ requests = khtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
+
+ if ( requests > 0 )
+ return;
+
+ // OK, completed.
+ // Now do what should be done when we are really completed.
+ d->m_bComplete = true;
+
+ checkEmitLoadEvent(); // if we didn't do it before
+
+ // check that the view has not been moved by the user
+ if ( m_url.encodedHtmlRef().isEmpty() && d->m_view->contentsY() == 0 )
+ d->m_view->setContentsPos( d->m_extension->urlArgs().xOffset,
+ d->m_extension->urlArgs().yOffset );
+
+ d->m_view->complete();
+
+ if ( !d->m_redirectURL.isEmpty() )
+ {
+ // Do not start redirection for frames here! That action is
+ // deferred until the parent emits a completed signal.
+ if ( parentPart() == 0 )
+ d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
+
+ emit completed( true );
+ }
+ else
+ {
+ if ( d->m_bPendingChildRedirection )
+ emit completed ( true );
+ else
+ emit completed();
+ }
+
+ // find the alternate stylesheets
+ QStringList sheets;
+ if (d->m_doc)
+ sheets = d->m_doc->availableStyleSheets();
+ d->m_paUseStylesheet->setItems( sheets );
+ d->m_paUseStylesheet->setEnabled( !sheets.isEmpty() );
+ if (!sheets.isEmpty())
+ d->m_paUseStylesheet->setCurrentItem(kMax(sheets.findIndex(d->m_sheetUsed), 0));
+
+ if (!parentPart())
+ emit setStatusBarText(i18n("Done."));
+
+#ifdef SPEED_DEBUG
+ kdDebug(6050) << "DONE: " <<d->m_parsetime.elapsed() << endl;
+#endif
+}
+
+void KHTMLPart::checkEmitLoadEvent()
+{
+ if ( d->m_bLoadEventEmitted || !d->m_doc || d->m_doc->parsing() ) return;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !(*it).m_bCompleted ) // still got a frame running -> too early
+ return;
+
+ d->m_bLoadEventEmitted = true;
+ if (d->m_doc)
+ d->m_doc->close();
+}
+
+const KHTMLSettings *KHTMLPart::settings() const
+{
+ return d->m_settings;
+}
+
+#ifndef KDE_NO_COMPAT
+KURL KHTMLPart::baseURL() const
+{
+ if ( !d->m_doc ) return KURL();
+
+ return d->m_doc->baseURL();
+}
+
+QString KHTMLPart::baseTarget() const
+{
+ if ( !d->m_doc ) return QString::null;
+
+ return d->m_doc->baseTarget();
+}
+#endif
+
+KURL KHTMLPart::completeURL( const QString &url )
+{
+ if ( !d->m_doc ) return url;
+
+ if (d->m_decoder)
+ return KURL(d->m_doc->completeURL(url), d->m_decoder->codec()->mibEnum());
+
+ return KURL( d->m_doc->completeURL( url ) );
+}
+
+// ### implement lockhistory being optional (sometimes javascript wants
+// to do redirection that end up in the history!)
+void KHTMLPart::scheduleRedirection( int delay, const QString &url, bool /* doLockHistory*/ )
+{
+ //kdDebug(6050) << "KHTMLPart::scheduleRedirection delay=" << delay << " url=" << url << endl;
+ if( d->m_redirectURL.isEmpty() || delay < d->m_delayRedirect )
+ {
+ d->m_delayRedirect = delay;
+ d->m_redirectURL = url;
+ if ( d->m_bComplete ) {
+ d->m_redirectionTimer.stop();
+ d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
+ }
+ }
+}
+
+void KHTMLPart::slotRedirect()
+{
+ QString u = d->m_redirectURL;
+ d->m_delayRedirect = 0;
+ d->m_redirectURL = QString::null;
+ if ( u.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
+ {
+ QString script = KURL::decode_string( u.right( u.length() - 11 ) );
+ //kdDebug( 6050 ) << "KHTMLPart::slotRedirect script=" << script << endl;
+ QVariant res = executeScript( script );
+ if ( res.type() == QVariant::String ) {
+ begin( url() );
+ write( res.asString() );
+ end();
+ }
+ return;
+ }
+ KParts::URLArgs args;
+ if ( urlcmp( u, m_url.url(), true, true ) )
+ args.reload = true;
+
+ args.setLockHistory( true );
+ urlSelected( u, 0, 0, QString::null, args );
+}
+
+void KHTMLPart::slotRedirection(KIO::Job*, const KURL& url)
+{
+ // the slave told us that we got redirected
+ // kdDebug( 6050 ) << "redirection by KIO to " << url.url() << endl;
+ emit d->m_extension->setLocationBarURL( url.prettyURL() );
+ d->m_workingURL = url;
+}
+
+bool KHTMLPart::setEncoding( const QString &name, bool override )
+{
+ d->m_encoding = name;
+ d->m_haveEncoding = override;
+
+ if( !m_url.isEmpty() ) {
+ // reload document
+ closeURL();
+ KURL url = m_url;
+ m_url = 0;
+ openURL(url);
+ }
+
+ return true;
+}
+
+QString KHTMLPart::encoding() const
+{
+ if(d->m_haveEncoding && !d->m_encoding.isEmpty())
+ return d->m_encoding;
+
+ if(d->m_decoder && d->m_decoder->encoding())
+ return QString(d->m_decoder->encoding());
+
+ return(settings()->encoding());
+}
+
+void KHTMLPart::setUserStyleSheet(const KURL &url)
+{
+ if ( d->m_doc && d->m_doc->docLoader() )
+ (void) new khtml::PartStyleSheetLoader(this, url.url(), d->m_doc->docLoader());
+}
+
+void KHTMLPart::setUserStyleSheet(const QString &styleSheet)
+{
+ if ( d->m_doc )
+ d->m_doc->setUserStyleSheet( styleSheet );
+}
+
+bool KHTMLPart::gotoAnchor( const QString &name )
+{
+ if (!d->m_doc)
+ return false;
+
+ HTMLCollectionImpl *anchors =
+ new HTMLCollectionImpl( d->m_doc, HTMLCollectionImpl::DOC_ANCHORS);
+ anchors->ref();
+ NodeImpl *n = anchors->namedItem(name);
+ anchors->deref();
+
+ if(!n) {
+ kdDebug(6050) << "KHTMLPart::gotoAnchor node '" << name << "' not found" << endl;
+ return false;
+ }
+
+ int x = 0, y = 0;
+ HTMLElementImpl *a = static_cast<HTMLElementImpl *>(n);
+ a->getUpperLeftCorner(x, y);
+ d->m_view->setContentsPos(x-50, y-50);
+
+ return true;
+}
+
+void KHTMLPart::setStandardFont( const QString &name )
+{
+ d->m_settings->setStdFontName(name);
+}
+
+void KHTMLPart::setFixedFont( const QString &name )
+{
+ d->m_settings->setFixedFontName(name);
+}
+
+void KHTMLPart::setURLCursor( const QCursor &c )
+{
+ d->m_linkCursor = c;
+}
+
+QCursor KHTMLPart::urlCursor() const
+{
+ return d->m_linkCursor;
+}
+
+bool KHTMLPart::onlyLocalReferences() const
+{
+ return d->m_onlyLocalReferences;
+}
+
+void KHTMLPart::setOnlyLocalReferences(bool enable)
+{
+ d->m_onlyLocalReferences = enable;
+}
+
+void KHTMLPart::findTextBegin()
+{
+ d->m_findPos = -1;
+ d->m_findNode = 0;
+}
+
+bool KHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive, bool isRegExp )
+{
+ if ( !d->m_doc )
+ return false;
+
+ if(!d->m_findNode) {
+ if (d->m_doc->isHTMLDocument())
+ d->m_findNode = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
+ else
+ d->m_findNode = d->m_doc;
+ }
+
+ if ( !d->m_findNode )
+ {
+ kdDebug() << "KHTMLPart::findTextNext no findNode -> return false" << endl;
+ return false;
+ }
+ if ( d->m_findNode->id() == ID_FRAMESET )
+ {
+ kdDebug() << "KHTMLPart::findTextNext FRAMESET -> return false" << endl;
+ return false;
+ }
+
+ while(1)
+ {
+ if( (d->m_findNode->nodeType() == Node::TEXT_NODE || d->m_findNode->nodeType() == Node::CDATA_SECTION_NODE) && d->m_findNode->renderer() )
+ {
+ DOMString nodeText = d->m_findNode->nodeValue();
+ DOMStringImpl *t = nodeText.implementation();
+ QConstString s(t->s, t->l);
+
+ int matchLen = 0;
+ if ( isRegExp ) {
+ QRegExp matcher( str );
+ matcher.setCaseSensitive( caseSensitive );
+ d->m_findPos = matcher.search(s.string(), d->m_findPos+1);
+ if ( d->m_findPos != -1 )
+ matchLen = matcher.matchedLength();
+ }
+ else {
+ d->m_findPos = s.string().find(str, d->m_findPos+1, caseSensitive);
+ matchLen = str.length();
+ }
+
+ if(d->m_findPos != -1)
+ {
+ int x = 0, y = 0;
+ static_cast<khtml::RenderText *>(d->m_findNode->renderer())
+ ->posOfChar(d->m_findPos, x, y);
+ d->m_view->setContentsPos(x-50, y-50);
+
+ d->m_selectionStart = d->m_findNode;
+ d->m_startOffset = d->m_findPos;
+ d->m_selectionEnd = d->m_findNode;
+ d->m_endOffset = d->m_findPos + matchLen;
+ d->m_startBeforeEnd = true;
+
+ d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
+ d->m_selectionEnd.handle(), d->m_endOffset );
+ emitSelectionChanged();
+ return true;
+ }
+ }
+ d->m_findPos = -1;
+
+ NodeImpl *next;
+
+ if ( forward )
+ {
+ next = d->m_findNode->firstChild();
+
+ if(!next) next = d->m_findNode->nextSibling();
+ while(d->m_findNode && !next) {
+ d->m_findNode = d->m_findNode->parentNode();
+ if( d->m_findNode ) {
+ next = d->m_findNode->nextSibling();
+ }
+ }
+ }
+ else
+ {
+ next = d->m_findNode->lastChild();
+
+ if (!next ) next = d->m_findNode->previousSibling();
+ while ( d->m_findNode && !next )
+ {
+ d->m_findNode = d->m_findNode->parentNode();
+ if( d->m_findNode )
+ {
+ next = d->m_findNode->previousSibling();
+ }
+ }
+ }
+
+ d->m_findNode = next;
+ if(!d->m_findNode) return false;
+ }
+}
+
+QString KHTMLPart::selectedText() const
+{
+ QString text;
+ DOM::Node n = d->m_selectionStart;
+ while(!n.isNull()) {
+ if(n.nodeType() == DOM::Node::TEXT_NODE) {
+ QString str = n.nodeValue().string();
+ if(n == d->m_selectionStart && n == d->m_selectionEnd)
+ text = str.mid(d->m_startOffset, d->m_endOffset - d->m_startOffset);
+ else if(n == d->m_selectionStart)
+ text = str.mid(d->m_startOffset);
+ else if(n == d->m_selectionEnd)
+ text += str.left(d->m_endOffset);
+ else
+ text += str;
+ }
+ else {
+ // This is our simple HTML -> ASCII transformation:
+ unsigned short id = n.elementId();
+ switch(id) {
+ case ID_TD:
+ case ID_TH:
+ case ID_BR:
+ case ID_HR:
+ case ID_OL:
+ case ID_UL:
+ case ID_LI:
+ case ID_DD:
+ case ID_DL:
+ case ID_DT:
+ case ID_PRE:
+ case ID_BLOCKQUOTE:
+ text += "\n";
+ break;
+ case ID_P:
+ case ID_TR:
+ case ID_H1:
+ case ID_H2:
+ case ID_H3:
+ case ID_H4:
+ case ID_H5:
+ case ID_H6:
+ text += "\n\n";
+ break;
+ }
+ }
+ if(n == d->m_selectionEnd) break;
+ DOM::Node next = n.firstChild();
+ if(next.isNull()) next = n.nextSibling();
+ while( next.isNull() && !n.parentNode().isNull() ) {
+ n = n.parentNode();
+ next = n.nextSibling();
+ }
+
+ n = next;
+ }
+ return text;
+}
+
+bool KHTMLPart::hasSelection() const
+{
+ return ( !d->m_selectionStart.isNull() &&
+ !d->m_selectionEnd.isNull() );
+}
+
+DOM::Range KHTMLPart::selection() const
+{
+ DOM::Range r = document().createRange();DOM::Range();
+ r.setStart( d->m_selectionStart, d->m_startOffset );
+ r.setEnd( d->m_selectionEnd, d->m_endOffset );
+ return r;
+}
+
+
+void KHTMLPart::setSelection( const DOM::Range &r )
+{
+ d->m_selectionStart = r.startContainer();
+ d->m_startOffset = r.startOffset();
+ d->m_selectionEnd = r.endContainer();
+ d->m_endOffset = r.endOffset();
+ d->m_doc->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
+ d->m_selectionEnd.handle(),d->m_endOffset);
+}
+
+void KHTMLPart::slotClearSelection()
+{
+ d->m_selectionStart = 0;
+ d->m_startOffset = 0;
+ d->m_selectionEnd = 0;
+ d->m_endOffset = 0;
+ if ( d->m_doc ) d->m_doc->clearSelection();
+ emitSelectionChanged();
+}
+
+void KHTMLPart::overURL( const QString &url, const QString &target, bool shiftPressed )
+{
+ if ( !d->m_kjsStatusBarText.isEmpty() && !shiftPressed ) {
+ emit onURL( url );
+ emit setStatusBarText( d->m_kjsStatusBarText );
+ d->m_kjsStatusBarText = QString::null;
+ return;
+ }
+
+ emit onURL( url );
+
+ if ( url.isEmpty() )
+ {
+ emit setStatusBarText(url);
+ return;
+ }
+
+ if (url.find( QString::fromLatin1( "javascript:" ),0, false ) != -1 )
+ {
+ emit setStatusBarText( url.mid( url.find( "javascript:", 0, false ) ) );
+ return;
+ }
+
+ KURL u = completeURL(url);
+
+ // special case for <a href="">
+ if ( url.isEmpty() )
+ u.setFileName( url );
+
+ QString com;
+
+ KMimeType::Ptr typ = KMimeType::findByURL( u );
+
+ if ( typ )
+ com = typ->comment( u, false );
+
+ if ( u.isMalformed() )
+ {
+ emit setStatusBarText(u.prettyURL());
+ return;
+ }
+
+ if ( u.isLocalFile() )
+ {
+ // TODO : use KIO::stat() and create a KFileItem out of its result,
+ // to use KFileItem::statusBarText()
+ QCString path = QFile::encodeName( u.path() );
+
+ struct stat buff;
+ bool ok = !stat( path.data(), &buff );
+
+ struct stat lbuff;
+ if (ok) ok = !lstat( path.data(), &lbuff );
+
+ QString text = u.url();
+ QString text2 = text;
+
+ if (ok && S_ISLNK( lbuff.st_mode ) )
+ {
+ QString tmp;
+ if ( com.isNull() )
+ tmp = i18n( "Symbolic Link");
+ else
+ tmp = i18n("%1 (Link)").arg(com);
+ char buff_two[1024];
+ text += " -> ";
+ int n = readlink ( path.data(), buff_two, 1022);
+ if (n == -1)
+ {
+ text2 += " ";
+ text2 += tmp;
+ emit setStatusBarText(text2);
+ return;
+ }
+ buff_two[n] = 0;
+
+ text += buff_two;
+ text += " ";
+ text += tmp;
+ }
+ else if ( ok && S_ISREG( buff.st_mode ) )
+ {
+ if (buff.st_size < 1024)
+ text = i18n("%2 (%1 bytes)").arg((long) buff.st_size).arg(text2); // always put the URL last, in case it contains '%'
+ else
+ {
+ float d = (float) buff.st_size/1024.0;
+ text = i18n("%1 (%2 K)").arg(text2).arg(KGlobal::locale()->formatNumber(d, 2)); // was %.2f
+ }
+ text += " ";
+ text += com;
+ }
+ else if ( ok && S_ISDIR( buff.st_mode ) )
+ {
+ text += " ";
+ text += com;
+ }
+ else
+ {
+ text += " ";
+ text += com;
+ }
+ emit setStatusBarText(text);
+ }
+ else
+ {
+ QString extra;
+ if (target == QString::fromLatin1("_blank"))
+ {
+ extra = i18n(" (In new window)");
+ }
+ else if (!target.isEmpty() &&
+ (target != QString::fromLatin1("_top")) &&
+ (target != QString::fromLatin1("_self")) &&
+ (target != QString::fromLatin1("_parent")))
+ {
+ extra = i18n(" (In other frame)");
+ }
+
+ if (u.protocol() == QString::fromLatin1("mailto")) {
+ QString mailtoMsg/* = QString::fromLatin1("<img src=%1>").arg(locate("icon", QString::fromLatin1("locolor/16x16/actions/mail_send.png")))*/;
+ mailtoMsg += i18n("Email to: ") + KURL::decode_string(u.path());
+ QStringList queries = QStringList::split('&', u.query().mid(1));
+ for (QStringList::Iterator it = queries.begin(); it != queries.end(); ++it)
+ if ((*it).startsWith(QString::fromLatin1("subject=")))
+ mailtoMsg += i18n(" - Subject: ") + KURL::decode_string((*it).mid(8));
+ else if ((*it).startsWith(QString::fromLatin1("cc=")))
+ mailtoMsg += i18n(" - CC: ") + KURL::decode_string((*it).mid(3));
+ else if ((*it).startsWith(QString::fromLatin1("bcc=")))
+ mailtoMsg += i18n(" - BCC: ") + KURL::decode_string((*it).mid(4));
+ emit setStatusBarText(mailtoMsg);
+ return;
+ }
+ // Is this check neccessary at all? (Frerich)
+#if 0
+ else if (u.protocol() == QString::fromLatin1("http")) {
+ DOM::Node hrefNode = nodeUnderMouse().parentNode();
+ while (hrefNode.nodeName().string() != QString::fromLatin1("A") && !hrefNode.isNull())
+ hrefNode = hrefNode.parentNode();
+
+ if (!hrefNode.isNull()) {
+ DOM::Node hreflangNode = hrefNode.attributes().getNamedItem("HREFLANG");
+ if (!hreflangNode.isNull()) {
+ QString countryCode = hreflangNode.nodeValue().string().lower();
+ // Map the language code to an appropriate country code.
+ if (countryCode == QString::fromLatin1("en"))
+ countryCode = QString::fromLatin1("gb");
+ QString flagImg = QString::fromLatin1("<img src=%1>").arg(
+ locate("locale", QString::fromLatin1("l10n/")
+ + countryCode
+ + QString::fromLatin1("/flag.png")));
+ emit setStatusBarText(flagImg + u.prettyURL() + extra);
+ }
+ }
+ }
+#endif
+ emit setStatusBarText(u.prettyURL() + extra);
+ }
+}
+
+void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target,
+ KParts::URLArgs args )
+{
+ bool hasTarget = false;
+
+ QString target = _target;
+ if ( target.isEmpty() && d->m_doc )
+ target = d->m_doc->baseTarget();
+ if ( !target.isEmpty() )
+ hasTarget = true;
+
+ if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
+ {
+ executeScript( url.right( url.length() - 11) );
+ return;
+ }
+
+ KURL cURL = completeURL(url);
+ // special case for <a href="">
+ if ( url.isEmpty() )
+ cURL.setFileName( url );
+
+ if ( !cURL.isValid() )
+ // ### ERROR HANDLING
+ return;
+
+ //kdDebug( 6000 ) << "urlSelected: complete URL:" << cURL.url() << " target = " << target << endl;
+
+ if ( button == LeftButton && ( state & ShiftButton ) )
+ {
+ KIO::MetaData metaData;
+ metaData["referrer"] = d->m_referrer;
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As..." ), cURL, metaData );
+ return;
+ }
+
+ if (!checkLinkSecurity(cURL,
+ i18n( "<qt>The link <B>%1</B><BR>leads from this untrusted page to your local filesystem.<BR>Do you want to follow the link?" ),
+ i18n( "Follow" )))
+ return;
+
+ args.frameName = target;
+
+ // For http-refresh, force the io-slave to re-get the page
+ // as needed instead of loading from cache. NOTE: I would
+ // have done a "verify" instead, but I am not sure that servers
+ // will include the correct response (specfically "Refresh:") on
+ // a "HEAD" request which is what a "verify" setting results in.(DA)
+ if ( d->m_bHTTPRefresh )
+ {
+ d->m_bHTTPRefresh = false;
+ args.metaData()["cache"]="reload"; //"verify";
+ }
+
+ args.metaData().insert("main_frame_request",
+ parentPart() == 0 ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_activate_warnings", "TRUE");
+
+ if ( hasTarget )
+ {
+ // unknown frame names should open in a new window.
+ khtml::ChildFrame *frame = recursiveFrameRequest( cURL, args, false );
+ if ( frame )
+ {
+ args.metaData()["referrer"] = d->m_referrer;
+ requestObject( frame, cURL, args );
+ return;
+ }
+ }
+
+ if ( !d->m_bComplete && !hasTarget )
+ closeURL();
+
+ if (!d->m_referrer.isEmpty())
+ args.metaData()["referrer"] = d->m_referrer;
+
+ if ( button == MidButton && (state & ShiftButton) )
+ {
+ KParts::WindowArgs winArgs;
+ winArgs.lowerWindow = true;
+ KParts::ReadOnlyPart *newPart = 0;
+ emit d->m_extension->createNewWindow( cURL, args, winArgs, newPart );
+ return;
+ }
+ emit d->m_extension->openURLRequest( cURL, args );
+}
+
+void KHTMLPart::slotViewDocumentSource()
+{
+ KURL url(m_url);
+ if (!(url.isLocalFile()) && KHTMLPageCache::self()->isValid(d->m_cacheId))
+ {
+ KTempFile sourceFile(QString::null, QString::fromLatin1(".html"));
+ if (sourceFile.status() == 0)
+ {
+ KHTMLPageCache::self()->saveData(d->m_cacheId, sourceFile.dataStream());
+ url = KURL();
+ url.setPath(sourceFile.name());
+ }
+ }
+
+ // emit d->m_extension->openURLRequest( m_url, KParts::URLArgs( false, 0, 0, QString::fromLatin1( "text/plain" ) ) );
+ (void) KRun::runURL( url, QString::fromLatin1("text/plain") );
+}
+
+void KHTMLPart::slotViewFrameSource()
+{
+ KParts::ReadOnlyPart *frame = currentFrame();
+ if ( !frame )
+ return;
+
+ KURL url = frame->url();
+ if (!(url.isLocalFile()) && frame->inherits("KHTMLPart"))
+ {
+ long cacheId = static_cast<KHTMLPart *>(frame)->d->m_cacheId;
+
+ if (KHTMLPageCache::self()->isValid(cacheId))
+ {
+ KTempFile sourceFile(QString::null, QString::fromLatin1(".html"));
+ if (sourceFile.status() == 0)
+ {
+ KHTMLPageCache::self()->saveData(cacheId, sourceFile.dataStream());
+ url = KURL();
+ url.setPath(sourceFile.name());
+ }
+ }
+ }
+
+ (void) KRun::runURL( url, QString::fromLatin1("text/plain") );
+}
+
+KURL KHTMLPart::backgroundURL() const
+{
+ // ### what about XML documents? get from CSS?
+ if (!d->m_doc || !d->m_doc->isHTMLDocument())
+ return KURL();
+
+ QString relURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
+
+ return KURL( m_url, relURL );
+}
+
+void KHTMLPart::slotSaveBackground()
+{
+ KIO::MetaData metaData;
+ metaData["referrer"] = d->m_referrer;
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n("Save background image as"), backgroundURL(), metaData );
+}
+
+void KHTMLPart::slotSaveDocument()
+{
+ KURL srcURL( m_url );
+
+ if ( srcURL.fileName(false).isEmpty() )
+ srcURL.setFileName( "index.html" );
+
+ KIO::MetaData metaData;
+ // Referre unknown?
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, i18n("*.html *.htm|HTML files"), d->m_cacheId );
+}
+
+void KHTMLPart::slotSecurity()
+{
+// kdDebug( 6050 ) << "Meta Data:" << endl
+// << d->m_ssl_peer_cert_subject
+// << endl
+// << d->m_ssl_peer_cert_issuer
+// << endl
+// << d->m_ssl_cipher
+// << endl
+// << d->m_ssl_cipher_desc
+// << endl
+// << d->m_ssl_cipher_version
+// << endl
+// << d->m_ssl_good_from
+// << endl
+// << d->m_ssl_good_until
+// << endl
+// << d->m_ssl_cert_state
+// << endl;
+
+ KSSLInfoDlg *kid = new KSSLInfoDlg(d->m_ssl_in_use, widget(), "kssl_info_dlg", true );
+
+ if (d->m_bSecurityInQuestion)
+ kid->setSecurityInQuestion(true);
+
+ if (d->m_ssl_in_use) {
+ KSSLCertificate *x = KSSLCertificate::fromString(d->m_ssl_peer_certificate.local8Bit());
+ if (x) {
+ // Set the chain back onto the certificate
+ QStringList cl = QStringList::split(QString("\n"), d->m_ssl_peer_chain);
+ QPtrList<KSSLCertificate> ncl;
+
+ ncl.setAutoDelete(true);
+ for (QStringList::Iterator it = cl.begin(); it != cl.end(); ++it) {
+ KSSLCertificate *y = KSSLCertificate::fromString((*it).local8Bit());
+ if (y) ncl.append(y);
+ }
+
+ if (ncl.count() > 0)
+ x->chain().setChain(ncl);
+
+ kid->setup(x,
+ d->m_ssl_peer_ip,
+ m_url.url(),
+ d->m_ssl_cipher,
+ d->m_ssl_cipher_desc,
+ d->m_ssl_cipher_version,
+ d->m_ssl_cipher_used_bits.toInt(),
+ d->m_ssl_cipher_bits.toInt(),
+ (KSSLCertificate::KSSLValidation) d->m_ssl_cert_state.toInt()
+ );
+ kid->exec();
+ delete x;
+ } else kid->exec();
+ } else kid->exec();
+}
+
+void KHTMLPart::slotSaveFrame()
+{
+ if ( !d->m_activeFrame )
+ return; // should never be the case, but one never knows :-)
+
+ KURL srcURL( static_cast<KParts::ReadOnlyPart *>( d->m_activeFrame )->url() );
+
+ if ( srcURL.fileName(false).isEmpty() )
+ srcURL.setFileName( "index.html" );
+
+ KIO::MetaData metaData;
+ // Referrer unknown?
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, i18n("*.html *.htm|HTML files") );
+}
+
+void KHTMLPart::slotSetEncoding()
+{
+ // first Item is always auto
+ if(d->m_paSetEncoding->currentItem() == 0)
+ setEncoding(QString::null, false);
+ else {
+ // strip of the language to get the raw encoding again.
+ QString enc = KGlobal::charsets()->encodingForName(d->m_paSetEncoding->currentText());
+ setEncoding(enc, true);
+ }
+}
+
+void KHTMLPart::slotUseStylesheet()
+{
+ if (d->m_doc && d->m_paUseStylesheet->currentText() != d->m_sheetUsed) {
+ d->m_sheetUsed = d->m_paUseStylesheet->currentText();
+ d->m_doc->updateStyleSelector();
+ }
+}
+
+void KHTMLPart::updateActions()
+{
+ bool frames = false;
+
+ QValueList<khtml::ChildFrame>::ConstIterator it = d->m_frames.begin();
+ QValueList<khtml::ChildFrame>::ConstIterator end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( (*it).m_type == khtml::ChildFrame::Frame )
+ {
+ frames = true;
+ break;
+ }
+
+ d->m_paViewFrame->setEnabled( frames );
+ d->m_paSaveFrame->setEnabled( frames );
+
+ if ( frames )
+ d->m_paFind->setText( i18n( "&Find in Frame..." ) );
+ else
+ d->m_paFind->setText( i18n( "&Find..." ) );
+
+ KParts::Part *frame = 0;
+
+ if ( frames )
+ frame = currentFrame();
+
+ bool enableFindAndSelectAll = true;
+
+ if ( frame )
+ enableFindAndSelectAll = frame->inherits( "KHTMLPart" );
+
+ d->m_paFind->setEnabled( enableFindAndSelectAll );
+ d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
+
+ bool enablePrintFrame = false;
+
+ if ( frame )
+ {
+ QObject *ext = KParts::BrowserExtension::childObject( frame );
+ if ( ext )
+ enablePrintFrame = ext->metaObject()->slotNames().contains( "print()" );
+ }
+
+ d->m_paPrintFrame->setEnabled( enablePrintFrame );
+
+ QString bgURL;
+
+ // ### frames
+ if ( d->m_doc && d->m_doc->isHTMLDocument() && static_cast<HTMLDocumentImpl*>(d->m_doc)->body() && !d->m_bClearing )
+ bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
+
+ d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
+}
+
+bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
+ const QStringList ¶ms, bool isIFrame )
+{
+// kdDebug( 6050 ) << "childRequest( ..., " << url << ", " << frameName << " )" << endl;
+ FrameIt it = d->m_frames.find( frameName );
+ if ( it == d->m_frames.end() )
+ {
+ khtml::ChildFrame child;
+// kdDebug( 6050 ) << "inserting new frame into frame map " << frameName << endl;
+ child.m_name = frameName;
+ it = d->m_frames.append( child );
+ }
+
+ (*it).m_type = isIFrame ? khtml::ChildFrame::IFrame : khtml::ChildFrame::Frame;
+ (*it).m_frame = frame;
+ (*it).m_params = params;
+
+ // Support for <frame src="javascript:string">
+ if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
+ {
+ QVariant res = executeScript( DOM::Node(frame->element()), url.right( url.length() - 11) );
+ KURL myurl;
+ myurl.setProtocol("javascript");
+ if ( res.type() == QVariant::String )
+ myurl.setPath(res.asString());
+ return processObjectRequest(&(*it), myurl, QString("text/html") );
+ }
+ return requestObject( &(*it), completeURL( url ));
+}
+
+QString KHTMLPart::requestFrameName()
+{
+ return QString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
+}
+
+bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
+ const QStringList ¶ms )
+{
+ if (url.isEmpty())
+ return false;
+ khtml::ChildFrame child;
+ QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child );
+ (*it).m_frame = frame;
+ (*it).m_type = khtml::ChildFrame::Object;
+ (*it).m_params = params;
+
+ KParts::URLArgs args;
+ args.serviceType = serviceType;
+ return requestObject( &(*it), completeURL( url ), args );
+}
+
+bool KHTMLPart::requestObject( khtml::ChildFrame *child, const KURL &url, const KParts::URLArgs &_args )
+{
+ if (!checkLinkSecurity(url))
+ return false;
+ if ( child->m_bPreloaded )
+ {
+ // kdDebug(6005) << "KHTMLPart::requestObject preload" << endl;
+ if ( child->m_frame && child->m_part )
+ child->m_frame->setWidget( child->m_part->widget() );
+
+ child->m_bPreloaded = false;
+ return true;
+ }
+
+ KParts::URLArgs args( _args );
+
+ if ( child->m_run )
+ child->m_run->abort();
+
+ if ( child->m_part && !args.reload && urlcmp( child->m_part->url().url(), url.url(), true, true ) )
+ args.serviceType = child->m_serviceType;
+
+ child->m_args = args;
+ child->m_args.reload = d->m_bReloading;
+ child->m_serviceName = QString::null;
+ if (!d->m_referrer.isEmpty() && !child->m_args.metaData().contains( "referrer" ))
+ child->m_args.metaData()["referrer"] = d->m_referrer;
+
+ child->m_args.metaData().insert("main_frame_request",
+ parentPart() == 0 ? "TRUE":"FALSE");
+ child->m_args.metaData().insert("ssl_was_in_use",
+ d->m_ssl_in_use ? "TRUE":"FALSE");
+ child->m_args.metaData().insert("ssl_activate_warnings", "TRUE");
+
+ // We want a KHTMLPart if the HTML says <frame src=""> or <frame src="about:blank">
+ if ((url.isEmpty() || url.url() == "about:blank") && args.serviceType.isEmpty())
+ args.serviceType = QString::fromLatin1( "text/html" );
+
+ if ( args.serviceType.isEmpty() ) {
+ child->m_run = new KHTMLRun( this, child, url, child->m_args,
+ child->m_type != khtml::ChildFrame::Frame );
+ return false;
+ } else {
+ return processObjectRequest( child, url, args.serviceType );
+ }
+}
+
+bool KHTMLPart::processObjectRequest( khtml::ChildFrame *child, const KURL &_url, const QString &mimetype )
+{
+ //kdDebug( 6050 ) << "KHTMLPart::processObjectRequest trying to create part for " << mimetype << endl;
+
+ // IMPORTANT: create a copy of the url here, because it is just a reference, which was likely to be given
+ // by an emitting frame part (emit openURLRequest( blahurl, ... ) . A few lines below we delete the part
+ // though -> the reference becomes invalid -> crash is likely
+ KURL url( _url );
+
+ // khtmlrun called us this way to indicate a loading error
+ if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) )
+ {
+ checkEmitLoadEvent();
+ child->m_bCompleted = true;
+ return true;
+ }
+
+ if (child->m_bNotify)
+ {
+ child->m_bNotify = false;
+ if ( !child->m_args.lockHistory() )
+ emit d->m_extension->openURLNotify();
+ }
+
+ if ( !child->m_services.contains( mimetype ) )
+ {
+ KParts::ReadOnlyPart *part = createPart( d->m_view->viewport(), child->m_name.ascii(), this, child->m_name.ascii(), mimetype, child->m_serviceName, child->m_services, child->m_params );
+
+ if ( !part )
+ {
+ if ( child->m_frame )
+ if (child->m_frame->partLoadingErrorNotify( child, url, mimetype ))
+ return true; // we succeeded after all (a fallback was used)
+
+ checkEmitLoadEvent();
+ return false;
+ }
+
+ //CRITICAL STUFF
+ if ( child->m_part )
+ {
+ partManager()->removePart( (KParts::ReadOnlyPart *)child->m_part );
+ delete (KParts::ReadOnlyPart *)child->m_part;
+ }
+
+ child->m_serviceType = mimetype;
+ if ( child->m_frame )
+ child->m_frame->setWidget( part->widget() );
+
+ if ( child->m_type != khtml::ChildFrame::Object )
+ partManager()->addPart( part, false );
+// else
+// kdDebug(6005) << "AH! NO FRAME!!!!!" << endl;
+
+ child->m_part = part;
+ assert( ((void*) child->m_part) != 0);
+
+ if ( child->m_type != khtml::ChildFrame::Object )
+ {
+ connect( part, SIGNAL( started( KIO::Job *) ),
+ this, SLOT( slotChildStarted( KIO::Job *) ) );
+ connect( part, SIGNAL( completed() ),
+ this, SLOT( slotChildCompleted() ) );
+ connect( part, SIGNAL( completed(bool) ),
+ this, SLOT( slotChildCompleted(bool) ) );
+ connect( part, SIGNAL( setStatusBarText( const QString & ) ),
+ this, SIGNAL( setStatusBarText( const QString & ) ) );
+ connect( this, SIGNAL( completed() ),
+ part, SLOT( slotParentCompleted() ) );
+ connect( this, SIGNAL( completed(bool) ),
+ part, SLOT( slotParentCompleted() ) );
+ }
+
+ child->m_extension = KParts::BrowserExtension::childObject( part );
+
+ if ( child->m_extension )
+ {
+ connect( child->m_extension, SIGNAL( openURLNotify() ),
+ d->m_extension, SIGNAL( openURLNotify() ) );
+
+ connect( child->m_extension, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ),
+ this, SLOT( slotChildURLRequest( const KURL &, const KParts::URLArgs & ) ) );
+
+ connect( child->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ),
+ d->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ) );
+ connect( child->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs &, const KParts::WindowArgs &, KParts::ReadOnlyPart *& ) ),
+ d->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & , const KParts::WindowArgs &, KParts::ReadOnlyPart *&) ) );
+
+ connect( child->m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ),
+ d->m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ) );
+ connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ),
+ d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ) );
+ connect( child->m_extension, SIGNAL( popupMenu( const QPoint &, const KURL &, const QString &, mode_t ) ),
+ d->m_extension, SIGNAL( popupMenu( const QPoint &, const KURL &, const QString &, mode_t ) ) );
+ connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ),
+ d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ) );
+
+ connect( child->m_extension, SIGNAL( infoMessage( const QString & ) ),
+ d->m_extension, SIGNAL( infoMessage( const QString & ) ) );
+
+ child->m_extension->setBrowserInterface( d->m_extension->browserInterface() );
+ }
+ }
+
+ checkEmitLoadEvent();
+ // Some JS code in the load event may have destroyed the part
+ // In that case, abort
+ if ( !child->m_part )
+ return false;
+
+ if ( child->m_bPreloaded )
+ {
+ if ( child->m_frame && child->m_part )
+ child->m_frame->setWidget( child->m_part->widget() );
+
+ child->m_bPreloaded = false;
+ return true;
+ }
+
+ child->m_args.reload = d->m_bReloading;
+
+ // make sure the part has a way to find out about the mimetype.
+ // we actually set it in child->m_args in requestObject already,
+ // but it's useless if we had to use a KHTMLRun instance, as the
+ // point the run object is to find out exactly the mimetype.
+ child->m_args.serviceType = mimetype;
+
+ child->m_bCompleted = false;
+ if ( child->m_extension )
+ child->m_extension->setURLArgs( child->m_args );
+
+ if(url.protocol() == "javascript" || url.url() == "about:blank") {
+ if (!child->m_part->inherits("KHTMLPart"))
+ return false;
+
+ KHTMLPart* p = static_cast<KHTMLPart*>(static_cast<KParts::ReadOnlyPart *>(child->m_part));
+
+ p->begin();
+ if (d->m_doc && p->d->m_doc)
+ p->d->m_doc->setBaseURL(d->m_doc->baseURL());
+ if (!url.url().startsWith("about:")) {
+ p->write(url.path());
+ } else {
+ p->m_url = url;
+ }
+ p->end();
+ return true;
+ }
+ else if ( !url.isEmpty() )
+ {
+ //kdDebug( 6050 ) << "opening " << url.url() << " in frame " << child->m_part << endl;
+ return child->m_part->openURL( url );
+ }
+ else
+ return true;
+}
+
+KParts::ReadOnlyPart *KHTMLPart::createPart( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name, const QString &mimetype,
+ QString &serviceName, QStringList &serviceTypes,
+ const QStringList ¶ms )
+{
+ QString constr;
+ if ( !serviceName.isEmpty() )
+ constr.append( QString::fromLatin1( "Name == '%1'" ).arg( serviceName ) );
+
+ KTrader::OfferList offers = KTrader::self()->query( mimetype, "KParts/ReadOnlyPart", constr, QString::null );
+
+ if ( offers.isEmpty() )
+ return 0L;
+
+ KService::Ptr service = *offers.begin();
+
+ KLibFactory *factory = KLibLoader::self()->factory( QFile::encodeName(service->library()) );
+
+ if ( !factory )
+ return 0L;
+
+ KParts::ReadOnlyPart *res = 0L;
+
+ const char *className = "KParts::ReadOnlyPart";
+ if ( service->serviceTypes().contains( "Browser/View" ) )
+ className = "Browser/View";
+
+ if ( factory->inherits( "KParts::Factory" ) )
+ res = static_cast<KParts::ReadOnlyPart *>(static_cast<KParts::Factory *>( factory )->createPart( parentWidget, widgetName, parent, name, className, params ));
+ else
+ res = static_cast<KParts::ReadOnlyPart *>(factory->create( parentWidget, widgetName, className ));
+
+ if ( !res )
+ return res;
+
+ serviceTypes = service->serviceTypes();
+ serviceName = service->name();
+
+ return res;
+}
+
+KParts::PartManager *KHTMLPart::partManager()
+{
+ if ( !d->m_manager )
+ {
+ d->m_manager = new KParts::PartManager( d->m_view->topLevelWidget(), this, "khtml part manager" );
+ d->m_manager->setAllowNestedParts( true );
+ connect( d->m_manager, SIGNAL( activePartChanged( KParts::Part * ) ),
+ this, SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
+ connect( d->m_manager, SIGNAL( partRemoved( KParts::Part * ) ),
+ this, SLOT( slotPartRemoved( KParts::Part * ) ) );
+ }
+
+ return d->m_manager;
+}
+
+void KHTMLPart::submitFormAgain()
+{
+ if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
+ 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 );
+
+ delete d->m_submitForm;
+ d->m_submitForm = 0;
+ disconnect(this, SIGNAL(completed()), this, SLOT(submitFormAgain()));
+}
+
+void KHTMLPart::submitForm( const char *action, const QString &url, const QByteArray &formData, const QString &_target, const QString& contentType, const QString& boundary )
+{
+ kdDebug(6000) << this << ": KHTMLPart::submitForm target=" << _target << " url=" << url << endl;
+ KURL u = completeURL( url );
+
+ if ( !u.isValid() )
+ {
+ // ### ERROR HANDLING!
+ return;
+ }
+
+ // Form security checks
+ //
+
+ /* This is separate for a reason. It has to be _before_ all script, etc,
+ * AND I don't want to break anything that uses checkLinkSecurity() in
+ * other places.
+ */
+
+ // This causes crashes... needs to be fixed.
+ if (u.protocol() != "https") {
+ if (d->m_ssl_in_use) { // Going from SSL -> nonSSL
+ int rc = KMessageBox::warningContinueCancel(NULL, i18n("Warning: This is a secure form but it is attempting to send your data back unencrypted."
+ "\nA third party may be able to intercept and view this information."
+ "\nAre you sure you wish to continue?"),
+ i18n("SSL"));
+ if (rc == KMessageBox::Cancel)
+ return;
+ } else { // Going from nonSSL -> nonSSL
+ KSSLSettings kss(true);
+ if (kss.warnOnUnencrypted()) {
+ int rc = KMessageBox::warningContinueCancel(NULL,
+ i18n("Warning: Your data is about to be transmitted across the network unencrypted."
+ "\nAre you sure you wish to continue?"),
+ i18n("KDE"),
+ QString::null,
+ "WarnOnUnencryptedForm");
+ // Move this setting into KSSL instead
+ KConfig *config = kapp->config();
+ QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
+ KConfigGroupSaver saver( config, grpNotifMsgs );
+
+ if (!config->readBoolEntry("WarnOnUnencryptedForm", true)) {
+ config->deleteEntry("WarnOnUnencryptedForm");
+ config->sync();
+ kss.setWarnOnUnencrypted(false);
+ kss.save();
+ }
+ if (rc == KMessageBox::Cancel)
+ return;
+ }
+ }
+ }
+
+ // End form security checks
+ //
+
+ QString urlstring = u.url();
+
+ if ( urlstring.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
+ urlstring = KURL::decode_string(urlstring);
+ executeScript( urlstring.right( urlstring.length() - 11) );
+ return;
+ }
+
+ if (!checkLinkSecurity(u,
+ i18n( "<qt>The form will be submitted to <BR><B>%1</B><BR>on your local filesystem.<BR>Do you want to submit the form?" ),
+ i18n( "Submit" )))
+ return;
+
+ KParts::URLArgs args;
+
+ if (!d->m_referrer.isEmpty())
+ args.metaData()["referrer"] = d->m_referrer;
+
+ args.metaData().insert("main_frame_request",
+ parentPart() == 0 ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_activate_warnings", "TRUE");
+ args.frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
+
+ if ( strcmp( action, "get" ) == 0 ) {
+ u.setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
+ args.setDoPost( false );
+ }
+ else {
+ args.postData = formData;
+ args.setDoPost( true );
+
+ // construct some user headers if necessary
+ if (contentType.isNull() || contentType == "application/x-www-form-urlencoded")
+ args.setContentType( "Content-Type: application/x-www-form-urlencoded" );
+ else // contentType must be "multipart/form-data"
+ args.setContentType( "Content-Type: " + contentType + "; boundary=" + boundary );
+ }
+
+ if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
+ if( d->m_submitForm ) {
+ kdDebug(6000) << "KHTMLPart::submitForm ABORTING!" << endl;
+ return;
+ }
+ d->m_submitForm = new KHTMLPartPrivate::SubmitForm;
+ d->m_submitForm->submitAction = action;
+ d->m_submitForm->submitUrl = url;
+ d->m_submitForm->submitFormData = formData;
+ d->m_submitForm->target = _target;
+ d->m_submitForm->submitContentType = contentType;
+ d->m_submitForm->submitBoundary = boundary;
+ connect(this, SIGNAL(completed()), this, SLOT(submitFormAgain()));
+ }
+ else
+ {
+ emit d->m_extension->openURLRequest( u, args );
+ }
+}
+
+void KHTMLPart::popupMenu( const QString &linkUrl )
+{
+ KURL popupURL;
+ KURL linkKURL;
+ if ( linkUrl.isEmpty() ) // click on background
+ popupURL = this->url();
+ else { // click on link
+ popupURL = completeURL( linkUrl );
+ linkKURL = popupURL;
+ }
+
+ KXMLGUIClient *client = new KHTMLPopupGUIClient( this, d->m_popupMenuXML, linkKURL );
+
+ emit d->m_extension->popupMenu( client, QCursor::pos(), popupURL,
+ QString::fromLatin1( "text/html" ), S_IFREG /*always a file*/ );
+
+ delete client;
+
+ emit popupMenu(linkUrl, QCursor::pos());
+}
+
+void KHTMLPart::slotParentCompleted()
+{
+ if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
+ {
+ // kdDebug(6050) << this << ": Child redirection -> " << d->m_redirectURL << endl;
+ d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
+ }
+}
+
+void KHTMLPart::slotChildStarted( KIO::Job *job )
+{
+ khtml::ChildFrame *child = frame( sender() );
+
+ assert( child );
+
+ child->m_bCompleted = false;
+
+ if ( d->m_bComplete )
+ {
+#if 0
+ // WABA: Looks like this belongs somewhere else
+ if ( !parentPart() ) // "toplevel" html document? if yes, then notify the hosting browser about the document (url) changes
+ {
+ emit d->m_extension->openURLNotify();
+ }
+#endif
+ d->m_bComplete = false;
+ emit started( job );
+ }
+}
+
+void KHTMLPart::slotChildCompleted()
+{
+ slotChildCompleted( false );
+}
+
+void KHTMLPart::slotChildCompleted( bool complete )
+{
+ khtml::ChildFrame *child = frame( sender() );
+
+ assert( child );
+
+ child->m_bCompleted = true;
+ child->m_args = KParts::URLArgs();
+
+ if ( parentPart() == 0 )
+ d->m_bPendingChildRedirection = (d->m_bPendingChildRedirection || complete);
+
+ checkCompleted();
+}
+
+void KHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
+{
+ khtml::ChildFrame *child = frame( sender()->parent() );
+
+ QString frameName = args.frameName.lower();
+ if ( !frameName.isEmpty() )
+ {
+ if ( frameName == QString::fromLatin1( "_top" ) )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_blank" ) )
+ {
+ emit d->m_extension->createNewWindow( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_parent" ) )
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+
+ emit d->m_extension->openURLRequest( url, newArgs );
+ return;
+ }
+ else if ( frameName != QString::fromLatin1( "_self" ) )
+ {
+ khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
+
+ if ( !_frame )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+
+ child = _frame;
+ }
+ }
+
+ // TODO: handle child target correctly! currently the script are always executed fur the parent
+ QString urlStr = url.url();
+ if ( urlStr.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
+ executeScript( urlStr.right( urlStr.length() - 11) );
+ return;
+ }
+
+ if ( child ) {
+ // Inform someone that we are about to show something else.
+ child->m_bNotify = true;
+ requestObject( child, url, args );
+ } else if ( frameName==QString::fromLatin1("_self") ) // this is for embedded objects (via <object>) which want to replace the current document
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+ emit d->m_extension->openURLRequest( url, newArgs );
+ }
+}
+
+khtml::ChildFrame *KHTMLPart::frame( const QObject *obj )
+{
+ assert( obj->inherits( "KParts::ReadOnlyPart" ) );
+ const KParts::ReadOnlyPart *part = static_cast<const KParts::ReadOnlyPart *>( obj );
+
+ FrameIt it = d->m_frames.begin();
+ FrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( (KParts::ReadOnlyPart *)(*it).m_part == part )
+ return &(*it);
+
+ return 0L;
+}
+
+KHTMLPart *KHTMLPart::findFrame( const QString &f )
+{
+#if 0
+ kdDebug() << "KHTMLPart::findFrame '" << f << "'" << endl;
+ FrameIt it2 = d->m_frames.begin();
+ FrameIt end = d->m_frames.end();
+ for (; it2 != end; ++it2 )
+ kdDebug() << " - having frame '" << (*it2).m_name << "'" << endl;
+#endif
+ // ### http://www.w3.org/TR/html4/appendix/notes.html#notes-frames
+ ConstFrameIt it = d->m_frames.find( f );
+ if ( it == d->m_frames.end() )
+ {
+ //kdDebug() << "KHTMLPart::findFrame frame " << f << " not found" << endl;
+ return 0L;
+ }
+ else {
+ KParts::ReadOnlyPart *p = (*it).m_part;
+ if ( p && p->inherits( "KHTMLPart" ))
+ {
+ //kdDebug() << "KHTMLPart::findFrame frame " << f << " is a KHTMLPart, ok" << endl;
+ return (KHTMLPart*)p;
+ }
+ else
+ {
+#if 0
+ if (p)
+ kdWarning() << "KHTMLPart::findFrame frame " << f << " found but isn't a KHTMLPart ! " << p->className() << endl;
+ else
+ kdWarning() << "KHTMLPart::findFrame frame " << f << " found but m_part=0L" << endl;
+#endif
+ return 0L;
+ }
+ }
+}
+
+KParts::ReadOnlyPart *KHTMLPart::currentFrame() const
+{
+ KParts::ReadOnlyPart* part = (KParts::ReadOnlyPart*)(this);
+ // Find active part in our frame manager, in case we are a frameset
+ // and keep doing that (in case of nested framesets).
+ // Just realized we could also do this recursively, calling part->currentFrame()...
+ while ( part && part->inherits("KHTMLPart") &&
+ static_cast<KHTMLPart *>(part)->d->m_frames.count() > 0 ) {
+ KHTMLPart* frameset = static_cast<KHTMLPart *>(part);
+ part = static_cast<KParts::ReadOnlyPart *>(frameset->partManager()->activePart());
+ if ( !part ) return frameset;
+ }
+ return part;
+}
+
+bool KHTMLPart::frameExists( const QString &frameName )
+{
+ ConstFrameIt it = d->m_frames.find( frameName );
+ if ( it == d->m_frames.end() )
+ return false;
+
+ // WABA: We only return true if the child actually has a frame
+ // set. Otherwise we might find our preloaded-selve.
+ // This happens when we restore the frameset.
+ return (!(*it).m_frame.isNull());
+}
+
+KHTMLPart *KHTMLPart::parentPart()
+{
+ if ( !parent() || !parent()->inherits( "KHTMLPart" ) )
+ return 0L;
+
+ return (KHTMLPart *)parent();
+}
+
+khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args,
+ bool callParent )
+{
+ FrameIt it = d->m_frames.find( args.frameName );
+
+ if ( it != d->m_frames.end() )
+ return &(*it);
+
+ it = d->m_frames.begin();
+ FrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( (*it).m_part && (*it).m_part->inherits( "KHTMLPart" ) )
+ {
+ KHTMLPart *childPart = (KHTMLPart *)(KParts::ReadOnlyPart *)(*it).m_part;
+
+ khtml::ChildFrame *res = childPart->recursiveFrameRequest( url, args, false );
+ if ( !res )
+ continue;
+
+ childPart->requestObject( res, url, args );
+ return 0L;
+ }
+
+ if ( parentPart() && callParent )
+ {
+ khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( url, args );
+
+ if ( res )
+ parentPart()->requestObject( res, url, args );
+
+ return 0L;
+ }
+
+ return 0L;
+}
+
+void KHTMLPart::saveState( QDataStream &stream )
+{
+ kdDebug( 6050 ) << "KHTMLPart::saveState saving URL " << m_url.url() << endl;
+
+ stream << m_url << (Q_INT32)d->m_view->contentsX() << (Q_INT32)d->m_view->contentsY()
+ << (Q_INT32) d->m_view->contentsWidth() << (Q_INT32) d->m_view->contentsHeight() << (Q_INT32) d->m_view->marginWidth() << (Q_INT32) d->m_view->marginHeight();
+
+ // save link cursor position
+ int focusNodeNumber;
+ if (!d->m_focusNodeRestored)
+ focusNodeNumber = d->m_focusNodeNumber;
+ else if (d->m_doc->focusNode())
+ focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
+ else
+ focusNodeNumber = -1;
+ stream << focusNodeNumber;
+
+ // Save the doc's cache id.
+ stream << d->m_cacheId;
+
+ // Save the state of the document (Most notably the state of any forms)
+ QStringList docState;
+ if (d->m_doc)
+ {
+ docState = d->m_doc->docState();
+ }
+ stream << d->m_encoding << d->m_sheetUsed << docState;
+
+ stream << d->m_zoomFactor;
+
+ // Save ssl data
+ stream << d->m_ssl_in_use
+ << d->m_ssl_peer_certificate
+ << d->m_ssl_peer_chain
+ << d->m_ssl_peer_ip
+ << d->m_ssl_cipher
+ << d->m_ssl_cipher_desc
+ << d->m_ssl_cipher_version
+ << d->m_ssl_cipher_used_bits
+ << d->m_ssl_cipher_bits
+ << d->m_ssl_cert_state;
+
+ // Save frame data
+ stream << (Q_UINT32)d->m_frames.count();
+
+ QStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
+ KURL::List frameURLLst;
+ QValueList<QByteArray> frameStateBufferLst;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ {
+ frameNameLst << (*it).m_name;
+ frameServiceTypeLst << (*it).m_serviceType;
+ frameServiceNameLst << (*it).m_serviceName;
+ if ( (*it).m_part )
+ frameURLLst << (*it).m_part->url();
+ else
+ frameURLLst << KURL();
+
+ QByteArray state;
+ QDataStream frameStream( state, IO_WriteOnly );
+
+ if ( (*it).m_part && (*it).m_extension )
+ (*it).m_extension->saveState( frameStream );
+
+ frameStateBufferLst << state;
+ }
+
+ stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst;
+}
+
+void KHTMLPart::restoreState( QDataStream &stream )
+{
+ KURL u;
+ Q_INT32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
+ Q_UINT32 frameCount;
+ QStringList frameNames, frameServiceTypes, docState, frameServiceNames;
+ KURL::List frameURLs;
+ QValueList<QByteArray> frameStateBuffers;
+ QValueList<int> fSizes;
+ QString encoding, sheetUsed;
+ long old_cacheId = d->m_cacheId;
+
+ stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
+
+ d->m_view->setMarginWidth( mWidth );
+ d->m_view->setMarginHeight( mHeight );
+
+ // restore link cursor position
+ // nth node is active. value is set in checkCompleted()
+ stream >> d->m_focusNodeNumber;
+ d->m_focusNodeRestored = false;
+ kdDebug(6050)<<"new focus Node number is:"<<d->m_focusNodeNumber<<endl;
+
+ stream >> d->m_cacheId;
+
+ stream >> encoding >> sheetUsed >> docState;
+ d->m_encoding = encoding;
+ d->m_sheetUsed = sheetUsed;
+
+ int zoomFactor;
+ stream >> zoomFactor;
+ setZoomFactor(zoomFactor);
+
+ // Restore ssl data
+ stream >> d->m_ssl_in_use
+ >> d->m_ssl_peer_certificate
+ >> d->m_ssl_peer_chain
+ >> d->m_ssl_peer_ip
+ >> d->m_ssl_cipher
+ >> d->m_ssl_cipher_desc
+ >> d->m_ssl_cipher_version
+ >> d->m_ssl_cipher_used_bits
+ >> d->m_ssl_cipher_bits
+ >> d->m_ssl_cert_state;
+
+ d->m_paSecurity->setIcon( d->m_ssl_in_use ? "encrypted" : "decrypted" );
+
+ stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
+ >> frameURLs >> frameStateBuffers;
+
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+
+// kdDebug( 6050 ) << "restoreStakte() docState.count() = " << docState.count() << endl;
+// kdDebug( 6050 ) << "m_url " << m_url.url() << " <-> " << u.url() << endl;
+// kdDebug( 6050 ) << "m_frames.count() " << d->m_frames.count() << " <-> " << frameCount << endl;
+
+ if (d->m_cacheId == old_cacheId)
+ {
+ // Partial restore
+ d->m_redirectionTimer.stop();
+
+ FrameIt fIt = d->m_frames.begin();
+ FrameIt fEnd = d->m_frames.end();
+
+ for (; fIt != fEnd; ++fIt )
+ (*fIt).m_bCompleted = false;
+
+ fIt = d->m_frames.begin();
+
+ QStringList::ConstIterator fNameIt = frameNames.begin();
+ QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
+ QStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
+ KURL::List::ConstIterator fURLIt = frameURLs.begin();
+ QValueList<QByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
+
+ for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
+ {
+ khtml::ChildFrame *child = &(*fIt);
+
+// kdDebug( 6050 ) << *fNameIt << " ---- " << *fServiceTypeIt << endl;
+
+ if ( child->m_name != *fNameIt || child->m_serviceType != *fServiceTypeIt )
+ {
+ child->m_bPreloaded = true;
+ child->m_name = *fNameIt;
+ child->m_serviceName = *fServiceNameIt;
+ processObjectRequest( child, *fURLIt, *fServiceTypeIt );
+ }
+
+ if ( child->m_part )
+ {
+ child->m_bCompleted = false;
+ if ( child->m_extension )
+ {
+ QDataStream frameStream( *fBufferIt, IO_ReadOnly );
+ child->m_extension->restoreState( frameStream );
+ }
+ else
+ child->m_part->openURL( *fURLIt );
+ }
+ }
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ args.xOffset = xOffset;
+ args.yOffset = yOffset;
+ args.docState = docState; // WABA: How are we going to restore this??
+ d->m_extension->setURLArgs( args );
+
+ d->m_view->resizeContents( wContents, hContents);
+ d->m_view->setContentsPos( xOffset, yOffset );
+ }
+ else
+ {
+ // Full restore.
+ closeURL();
+ // We must force a clear because we want to be sure to delete all
+ // frames.
+ d->m_bCleared = false;
+ clear();
+ d->m_encoding = encoding;
+ d->m_sheetUsed = sheetUsed;
+
+ QStringList::ConstIterator fNameIt = frameNames.begin();
+ QStringList::ConstIterator fNameEnd = frameNames.end();
+
+ QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
+ QStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
+ KURL::List::ConstIterator fURLIt = frameURLs.begin();
+ QValueList<QByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
+
+ for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
+ {
+ khtml::ChildFrame newChild;
+ newChild.m_bPreloaded = true;
+ newChild.m_name = *fNameIt;
+ newChild.m_serviceName = *fServiceNameIt;
+
+// kdDebug( 6050 ) << *fNameIt << " ---- " << *fServiceTypeIt << endl;
+
+ FrameIt childFrame = d->m_frames.append( newChild );
+
+ processObjectRequest( &(*childFrame), *fURLIt, *fServiceTypeIt );
+
+ (*childFrame).m_bPreloaded = true;
+
+ if ( (*childFrame).m_part )
+ {
+ if ( (*childFrame).m_extension )
+ {
+ QDataStream frameStream( *fBufferIt, IO_ReadOnly );
+ (*childFrame).m_extension->restoreState( frameStream );
+ }
+ else
+ (*childFrame).m_part->openURL( *fURLIt );
+ }
+ }
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ args.xOffset = xOffset;
+ args.yOffset = yOffset;
+ args.docState = docState;
+ d->m_extension->setURLArgs( args );
+// kdDebug( 6050 ) << "in restoreState : calling openURL for " << u.url() << endl;
+ if (!KHTMLPageCache::self()->isValid(d->m_cacheId))
+ openURL( u );
+ else
+ restoreURL( u );
+ }
+
+ d->m_restored = true;
+
+}
+
+void KHTMLPart::show()
+{
+ if ( d->m_view )
+ d->m_view->show();
+}
+
+void KHTMLPart::hide()
+{
+ if ( d->m_view )
+ d->m_view->hide();
+}
+
+DOM::Node KHTMLPart::nodeUnderMouse() const
+{
+ return d->m_view->nodeUnderMouse();
+}
+
+void KHTMLPart::emitSelectionChanged()
+{
+ emit d->m_extension->enableAction( "copy", hasSelection() );
+ emit d->m_extension->selectionInfo( selectedText() );
+ emit selectionChanged();
+}
+
+int KHTMLPart::zoomFactor() const
+{
+ return d->m_zoomFactor;
+}
+
+// ### make the list configurable ?
+static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
+static const int zoomSizeCount = (sizeof(zoomSizes) / sizeof(int));
+static const int minZoom = 20;
+static const int maxZoom = 300;
+
+void KHTMLPart::slotIncZoom()
+{
+ int zoomFactor = d->m_zoomFactor;
+
+ if (zoomFactor < maxZoom) {
+ // find the entry nearest to the given zoomsizes
+ for (int i = 0; i < zoomSizeCount; ++i)
+ if (zoomSizes[i] > zoomFactor) {
+ zoomFactor = zoomSizes[i];
+ break;
+ }
+ setZoomFactor(zoomFactor);
+ }
+}
+
+void KHTMLPart::slotDecZoom()
+{
+ int zoomFactor = d->m_zoomFactor;
+ if (zoomFactor > minZoom) {
+ // find the entry nearest to the given zoomsizes
+ for (int i = zoomSizeCount-1; i >= 0; --i)
+ if (zoomSizes[i] < zoomFactor) {
+ zoomFactor = zoomSizes[i];
+ break;
+ }
+ setZoomFactor(zoomFactor);
+ }
+}
+
+void KHTMLPart::setZoomFactor (int percent)
+{
+ if (percent < minZoom) percent = minZoom;
+ if (percent > maxZoom) percent = maxZoom;
+ if (d->m_zoomFactor == percent) return;
+ d->m_zoomFactor = percent;
+
+ if(d->m_doc) {
+ QApplication::setOverrideCursor( waitCursor );
+ if (d->m_doc->styleSelector())
+ d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
+ d->m_doc->recalcStyle( NodeImpl::Force );
+ QApplication::restoreOverrideCursor();
+ }
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
+ KParts::ReadOnlyPart* p = ( *it ).m_part;
+ static_cast<KHTMLPart*>( p )->setZoomFactor(d->m_zoomFactor);
+ }
+
+ d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
+ d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
+}
+
+void KHTMLPart::setJSStatusBarText( const QString &text )
+{
+ d->m_kjsStatusBarText = text;
+ emit setStatusBarText( d->m_kjsStatusBarText );
+}
+
+void KHTMLPart::setJSDefaultStatusBarText( const QString &text )
+{
+ d->m_kjsDefaultStatusBarText = text;
+ emit setStatusBarText( d->m_kjsDefaultStatusBarText );
+}
+
+QString KHTMLPart::jsStatusBarText() const
+{
+ return d->m_kjsStatusBarText;
+}
+
+QString KHTMLPart::jsDefaultStatusBarText() const
+{
+ return d->m_kjsDefaultStatusBarText;
+}
+
+QString KHTMLPart::referrer() const
+{
+ return d->m_referrer;
+}
+
+QString KHTMLPart::lastModified() const
+{
+ return d->m_lastModified;
+}
+
+void KHTMLPart::slotLoadImages()
+{
+ if (d->m_doc )
+ d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
+ KParts::ReadOnlyPart* p = ( *it ).m_part;
+ static_cast<KHTMLPart*>( p )->slotLoadImages();
+ }
+}
+
+void KHTMLPart::reparseConfiguration()
+{
+ KHTMLSettings *settings = KHTMLFactory::defaultHTMLSettings();
+ settings->init();
+
+ setAutoloadImages( settings->autoLoadImages() );
+ if (d->m_doc)
+ d->m_doc->docLoader()->setShowAnimations( settings->showAnimations() );
+
+ d->m_bJScriptEnabled = settings->isJavaScriptEnabled(m_url.host());
+ d->m_bJScriptDebugEnabled = settings->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = settings->isJavaEnabled(m_url.host());
+ d->m_bPluginsEnabled = settings->isPluginsEnabled(m_url.host());
+ delete d->m_settings;
+ d->m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
+
+ QApplication::setOverrideCursor( waitCursor );
+ if(d->m_doc) d->m_doc->recalcStyle( NodeImpl::Force );
+ QApplication::restoreOverrideCursor();
+}
+
+QStringList KHTMLPart::frameNames() const
+{
+ QStringList res;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ res += (*it).m_name;
+
+ return res;
+}
+
+QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
+{
+ QPtrList<KParts::ReadOnlyPart> res;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ res.append( (*it).m_part );
+
+ return res;
+}
+
+bool KHTMLPart::openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs )
+{
+ FrameIt it = d->m_frames.find( urlArgs.frameName );
+
+ if ( it == d->m_frames.end() )
+ return false;
+
+ // Inform someone that we are about to show something else.
+ if ( !urlArgs.lockHistory() )
+ emit d->m_extension->openURLNotify();
+
+ requestObject( &(*it), url, urlArgs );
+
+ return true;
+}
+
+void KHTMLPart::setDNDEnabled( bool b )
+{
+ d->m_bDnd = b;
+}
+
+bool KHTMLPart::dndEnabled() const
+{
+ return d->m_bDnd;
+}
+
+void KHTMLPart::customEvent( QCustomEvent *event )
+{
+ if ( khtml::MousePressEvent::test( event ) )
+ {
+ khtmlMousePressEvent( static_cast<khtml::MousePressEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::MouseDoubleClickEvent::test( event ) )
+ {
+ khtmlMouseDoubleClickEvent( static_cast<khtml::MouseDoubleClickEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::MouseMoveEvent::test( event ) )
+ {
+ khtmlMouseMoveEvent( static_cast<khtml::MouseMoveEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::MouseReleaseEvent::test( event ) )
+ {
+ khtmlMouseReleaseEvent( static_cast<khtml::MouseReleaseEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::DrawContentsEvent::test( event ) )
+ {
+ khtmlDrawContentsEvent( static_cast<khtml::DrawContentsEvent *>( event ) );
+ return;
+ }
+
+ KParts::ReadOnlyPart::customEvent( event );
+}
+
+void KHTMLPart::khtmlMousePressEvent( khtml::MousePressEvent *event )
+{
+ DOM::DOMString url = event->url();
+ QMouseEvent *_mouse = event->qmouseEvent();
+ DOM::Node innerNode = event->innerNode();
+ d->m_mousePressNode = innerNode;
+
+ d->m_dragStartPos = _mouse->pos();
+
+ if ( !event->url().isNull() ) {
+ d->m_strSelectedURL = event->url().string();
+ d->m_strSelectedURLTarget = event->target().string();
+ }
+ else
+ d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
+
+ if ( _mouse->button() == LeftButton ||
+ _mouse->button() == MidButton )
+ {
+ d->m_bMousePressed = true;
+
+#ifndef KHTML_NO_SELECTION
+ if ( _mouse->button() == LeftButton )
+ {
+ if ( !innerNode.isNull() && innerNode.handle()->renderer()) {
+ int offset = 0;
+ DOM::NodeImpl* node = 0;
+ innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
+ event->absX()-innerNode.handle()->renderer()->xPos(),
+ event->absY()-innerNode.handle()->renderer()->yPos(), node, offset);
+
+ d->m_selectionStart = node;
+ d->m_startOffset = offset;
+// kdDebug(6005) << "KHTMLPart::khtmlMousePressEvent selectionStart=" << d->m_selectionStart.handle()->renderer()
+// << " offset=" << d->m_startOffset << endl;
+ d->m_selectionEnd = d->m_selectionStart;
+ d->m_endOffset = d->m_startOffset;
+ d->m_doc->clearSelection();
+ }
+ else
+ {
+ d->m_selectionStart = DOM::Node();
+ d->m_selectionEnd = DOM::Node();
+ }
+ emitSelectionChanged();
+ startAutoScroll();
+ }
+#else
+ d->m_dragLastPos = _mouse->globalPos();
+#endif
+ }
+
+ if ( _mouse->button() == RightButton )
+ {
+ popupMenu( d->m_strSelectedURL );
+ d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
+ }
+}
+
+void KHTMLPart::khtmlMouseDoubleClickEvent( khtml::MouseDoubleClickEvent * )
+{
+}
+
+void KHTMLPart::khtmlMouseMoveEvent( khtml::MouseMoveEvent *event )
+{
+ QMouseEvent *_mouse = event->qmouseEvent();
+ DOM::Node innerNode = event->innerNode();
+
+#ifndef QT_NO_DRAGANDDROP
+ if( d->m_bMousePressed && (!d->m_strSelectedURL.isEmpty() || (!innerNode.isNull() && innerNode.elementId() == ID_IMG) ) &&
+ ( d->m_dragStartPos - _mouse->pos() ).manhattanLength() > KGlobalSettings::dndEventDelay() &&
+ d->m_bDnd && d->m_mousePressNode == innerNode ) {
+
+ QPixmap p;
+ QDragObject *drag = 0;
+ if( !d->m_strSelectedURL.isEmpty() ) {
+ KURL u( completeURL( d->m_strSelectedURL) );
+ KURLDrag* urlDrag = KURLDrag::newDrag( u, d->m_view->viewport() );
+ if ( !d->m_referrer.isEmpty() )
+ urlDrag->metaData()["referrer"] = d->m_referrer;
+ drag = urlDrag;
+ p = KMimeType::pixmapForURL(u, 0, KIcon::Desktop, KIcon::SizeMedium);
+ } else {
+ HTMLImageElementImpl *i = static_cast<HTMLImageElementImpl *>(innerNode.handle());
+ if( i ) {
+ KMultipleDrag *mdrag = new KMultipleDrag( d->m_view->viewport() );
+ mdrag->addDragObject( new QImageDrag( i->currentImage(), 0L ) );
+ KURL u( completeURL( khtml::parseURL(i->getAttribute(ATTR_SRC)).string() ) );
+ KURLDrag* urlDrag = KURLDrag::newDrag( u, 0L );
+ if ( !d->m_referrer.isEmpty() )
+ urlDrag->metaData()["referrer"] = d->m_referrer;
+ mdrag->addDragObject( urlDrag );
+ drag = mdrag;
+ p = KMimeType::mimeType("image/png")->pixmap(KIcon::Desktop);
+ }
+ }
+
+ if ( !p.isNull() )
+ drag->setPixmap(p);
+
+ stopAutoScroll();
+ if(drag)
+ drag->drag();
+
+ // when we finish our drag, we need to undo our mouse press
+ d->m_bMousePressed = false;
+ d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
+ return;
+ }
+#endif
+
+ DOM::DOMString url = event->url();
+ DOM::DOMString target = event->target();
+
+ // Not clicked -> mouse over stuff
+ if ( !d->m_bMousePressed )
+ {
+ // The mouse is over something
+ if ( url.length() )
+ {
+ bool shiftPressed = ( _mouse->state() & ShiftButton );
+
+ // Image map
+ if ( !innerNode.isNull() && innerNode.elementId() == ID_IMG )
+ {
+ HTMLImageElementImpl *i = static_cast<HTMLImageElementImpl *>(innerNode.handle());
+ if ( i && i->isServerMap() )
+ {
+ khtml::RenderObject *r = i->renderer();
+ if(r)
+ {
+ int absx, absy, vx, vy;
+ r->absolutePosition(absx, absy);
+ view()->contentsToViewport( absx, absy, vx, vy );
+
+ int x(_mouse->x() - vx), y(_mouse->y() - vy);
+
+ d->m_overURL = url.string() + QString("?%1,%2").arg(x).arg(y);
+ d->m_overURLTarget = target.string();
+ overURL( d->m_overURL, target.string(), shiftPressed );
+ return;
+ }
+ }
+ }
+
+ // normal link
+ if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
+ {
+ d->m_overURL = url.string();
+ d->m_overURLTarget = target.string();
+ overURL( d->m_overURL, target.string(), shiftPressed );
+ }
+ }
+ else // Not over a link...
+ {
+ if( !d->m_overURL.isEmpty() ) // and we were over a link -> reset to "default statusbar text"
+ {
+ d->m_overURL = d->m_overURLTarget = QString::null;
+ emit onURL( QString::null );
+ // Default statusbar text can be set from javascript. Otherwise it's empty.
+ emit setStatusBarText( d->m_kjsDefaultStatusBarText );
+ }
+ }
+ }
+ else {
+#ifndef KHTML_NO_SELECTION
+ // selection stuff
+ if( d->m_bMousePressed && innerNode.handle() && innerNode.handle()->renderer() &&
+ ( _mouse->state() == LeftButton )) {
+ int offset;
+ //kdDebug(6000) << "KHTMLPart::khtmlMouseMoveEvent x=" << event->x() << " y=" << event->y()
+ // << " nodeAbsX=" << event->nodeAbsX() << " nodeAbsY=" << event->nodeAbsY()
+ // << endl;
+ DOM::NodeImpl* node=0;
+ innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
+ event->absX()-innerNode.handle()->renderer()->xPos(),
+ event->absY()-innerNode.handle()->renderer()->yPos(), node, offset);
+ d->m_selectionEnd = node;
+ d->m_endOffset = offset;
+// if (d->m_selectionEnd.handle() && d->m_selectionEnd.handle()->renderer())
+// kdDebug( 6000 ) << "setting end of selection to " << d->m_selectionEnd.handle()->renderer() << "/"
+// << d->m_endOffset << endl;
+
+ // we have to get to know if end is before start or not...
+ DOM::Node n = d->m_selectionStart;
+ d->m_startBeforeEnd = false;
+ while(!n.isNull()) {
+ if(n == d->m_selectionEnd) {
+ d->m_startBeforeEnd = true;
+ break;
+ }
+ DOM::Node next = n.firstChild();
+ if(next.isNull()) next = n.nextSibling();
+ while( next.isNull() && !n.parentNode().isNull() ) {
+ n = n.parentNode();
+ next = n.nextSibling();
+ }
+ n = next;
+ //d->m_view->viewport()->repaint(false);
+ }
+
+ if ( !d->m_selectionStart.isNull() && !d->m_selectionEnd.isNull() )
+ {
+ if (d->m_selectionEnd == d->m_selectionStart && d->m_endOffset < d->m_startOffset)
+ d->m_doc
+ ->setSelection(d->m_selectionStart.handle(),d->m_endOffset,
+ d->m_selectionEnd.handle(),d->m_startOffset);
+ else if (d->m_startBeforeEnd)
+ d->m_doc
+ ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
+ d->m_selectionEnd.handle(),d->m_endOffset);
+ else
+ d->m_doc
+ ->setSelection(d->m_selectionEnd.handle(),d->m_endOffset,
+ d->m_selectionStart.handle(),d->m_startOffset);
+ }
+#else
+ if ( d->m_doc && d->m_view ) {
+ QPoint diff( _mouse->globalPos() - d->m_dragLastPos );
+
+ if ( abs( diff.x() ) > 64 || abs( diff.y() ) > 64 ) {
+ d->m_view->scrollBy( -diff.x(), -diff.y() );
+ d->m_dragLastPos = _mouse->globalPos();
+ }
+#endif
+ }
+ }
+
+}
+
+void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
+{
+ DOM::Node innerNode = event->innerNode();
+ d->m_mousePressNode = DOM::Node();
+
+ if ( d->m_bMousePressed )
+ stopAutoScroll();
+
+ // Used to prevent mouseMoveEvent from initiating a drag before
+ // the mouse is pressed again.
+ d->m_bMousePressed = false;
+
+#ifndef QT_NO_CLIPBOARD
+ QMouseEvent *_mouse = event->qmouseEvent();
+ if ((d->m_guiProfile == BrowserViewGUI) && (_mouse->button() == MidButton) && (event->url().isNull()))
+ {
+ QClipboard *cb = QApplication::clipboard();
+ cb->setSelectionMode( true );
+ QCString plain("plain");
+ QString url = cb->text(plain).stripWhiteSpace();
+ KURL u(url);
+ if ( u.isMalformed() ) {
+ // some half-baked guesses for incomplete urls
+ // (the same code is in libkonq/konq_dirpart.cc)
+ if ( url.startsWith( "ftp." ) )
+ {
+ url.prepend( "ftp://" );
+ u = url;
+ }
+ else
+ {
+ url.prepend( "http://" );
+ u = url;
+ }
+ }
+ if (u.isValid())
+ {
+ QString savedReferrer = d->m_referrer;
+ d->m_referrer = QString::null; // Disable referrer.
+ urlSelected(url, 0,0, "_top");
+ d->m_referrer = savedReferrer; // Restore original referrer.
+ }
+ }
+#endif
+
+#ifndef KHTML_NO_SELECTION
+ // delete selection in case start and end position are at the same point
+ if(d->m_selectionStart == d->m_selectionEnd && d->m_startOffset == d->m_endOffset) {
+ d->m_selectionStart = 0;
+ d->m_selectionEnd = 0;
+ d->m_startOffset = 0;
+ d->m_endOffset = 0;
+ emitSelectionChanged();
+ } else {
+ // we have to get to know if end is before start or not...
+ DOM::Node n = d->m_selectionStart;
+ d->m_startBeforeEnd = false;
+ if( d->m_selectionStart == d->m_selectionEnd ) {
+ if( d->m_startOffset < d->m_endOffset )
+ d->m_startBeforeEnd = true;
+ } else {
+ while(!n.isNull()) {
+ if(n == d->m_selectionEnd) {
+ d->m_startBeforeEnd = true;
+ break;
+ }
+ DOM::Node next = n.firstChild();
+ if(next.isNull()) next = n.nextSibling();
+ while( next.isNull() && !n.parentNode().isNull() ) {
+ n = n.parentNode();
+ next = n.nextSibling();
+ }
+ n = next;
+ }
+ }
+ if(!d->m_startBeforeEnd)
+ {
+ DOM::Node tmpNode = d->m_selectionStart;
+ int tmpOffset = d->m_startOffset;
+ d->m_selectionStart = d->m_selectionEnd;
+ d->m_startOffset = d->m_endOffset;
+ d->m_selectionEnd = tmpNode;
+ d->m_endOffset = tmpOffset;
+ d->m_startBeforeEnd = true;
+ }
+ // get selected text and paste to the clipboard
+#ifndef QT_NO_CLIPBOARD
+ QString text = selectedText();
+ text.replace(QRegExp(QChar(0xa0)), " ");
+ QClipboard *cb = QApplication::clipboard();
+ cb->setSelectionMode( true );
+ disconnect( kapp->clipboard(), SIGNAL( selectionChanged()), this, SLOT( slotClearSelection()));
+ cb->setText(text);
+ connect( kapp->clipboard(), SIGNAL( selectionChanged()), SLOT( slotClearSelection()));
+ cb->setSelectionMode( false );
+#endif
+ //kdDebug( 6000 ) << "selectedText = " << text << endl;
+ emitSelectionChanged();
+ }
+#endif
+
+}
+
+void KHTMLPart::khtmlDrawContentsEvent( khtml::DrawContentsEvent * )
+{
+}
+
+void KHTMLPart::guiActivateEvent( KParts::GUIActivateEvent *event )
+{
+ if ( event->activated() )
+ {
+ emitSelectionChanged();
+ emit d->m_extension->enableAction( "print", d->m_doc != 0 );
+
+ if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
+ {
+ QPtrList<KAction> lst;
+ lst.append( d->m_paLoadImages );
+ plugActionList( "loadImages", lst );
+ }
+ }
+}
+
+void KHTMLPart::slotFind()
+{
+ KHTMLPart *part = static_cast<KHTMLPart *>( currentFrame() );
+ if (!part)
+ return;
+
+ if (!part->inherits("KHTMLPart") )
+ {
+ kdError(6000) << "slotFind: part is a " << part->className() << ", can't do a search into it" << endl;
+ return;
+ }
+
+ // use the part's (possibly frame) widget as parent widget, so that it gets
+ // properly destroyed when the (possible) frame dies
+ if ( !d->m_findDialog ) {
+ d->m_findDialog = new KHTMLFind( part, part->widget(), "khtmlfind" );
+ connect( d->m_findDialog, SIGNAL( done() ),
+ this, SLOT( slotFindDone() ) );
+ connect( d->m_findDialog, SIGNAL( destroyed() ),
+ this, SLOT( slotFindDialogDestroyed() ) );
+ }
+
+ d->m_findDialog->setPart( part );
+ d->m_findDialog->setText( part->d->m_lastFindState.text );
+ d->m_findDialog->setCaseSensitive( part->d->m_lastFindState.caseSensitive );
+ d->m_findDialog->setDirection( part->d->m_lastFindState.direction );
+
+ d->m_findDialog->show();
+
+ d->m_paFind->setEnabled( false );
+}
+
+void KHTMLPart::slotFindDone()
+{
+ assert( d->m_findDialog );
+
+ KHTMLPart *part = d->m_findDialog->part();
+
+ // this code actually belongs into some saveState() method in
+ // KHTMLFind, but as we're saving into the private data section of
+ // the part we have to do it here (no way to access it from the outside
+ // as it is defined only in khtml_part.cpp) (Simon)
+ part->d->m_lastFindState.text = d->m_findDialog->getText();
+ part->d->m_lastFindState.caseSensitive = d->m_findDialog->case_sensitive();
+ part->d->m_lastFindState.direction = d->m_findDialog->get_direction();
+
+ d->m_paFind->setEnabled( true );
+}
+
+void KHTMLPart::slotFindDialogDestroyed()
+{
+ assert( sender() == d->m_findDialog );
+
+ d->m_findDialog = 0;
+ d->m_paFind->setEnabled( true );
+}
+
+void KHTMLPart::slotPrintFrame()
+{
+ if ( d->m_frames.count() == 0 )
+ return;
+
+ KParts::ReadOnlyPart *frame = currentFrame();
+ if (!frame)
+ return;
+
+ KParts::BrowserExtension *ext = KParts::BrowserExtension::childObject( frame );
+
+ if ( !ext )
+ return;
+
+ QMetaObject *mo = ext->metaObject();
+
+ int idx = mo->findSlot( "print()", TRUE );
+ if ( idx >= 0 ) {
+ QUObject o[ 1 ];
+ ext->qt_invoke( idx, o );
+ }
+}
+
+void KHTMLPart::slotSelectAll()
+{
+ KParts::ReadOnlyPart *part = currentFrame();
+ if (part && part->inherits("KHTMLPart"))
+ static_cast<KHTMLPart *>(part)->selectAll();
+}
+
+void KHTMLPart::startAutoScroll()
+{
+ connect(&d->m_scrollTimer, SIGNAL( timeout() ), this, SLOT( slotAutoScroll() ));
+ d->m_scrollTimer.start(100, false);
+}
+
+void KHTMLPart::stopAutoScroll()
+{
+ disconnect(&d->m_scrollTimer, SIGNAL( timeout() ), this, SLOT( slotAutoScroll() ));
+ if (d->m_scrollTimer.isActive())
+ d->m_scrollTimer.stop();
+}
+
+
+void KHTMLPart::slotAutoScroll()
+{
+ if (d->m_view)
+ d->m_view->doAutoScroll();
+ else
+ stopAutoScroll(); // Safety
+}
+
+void KHTMLPart::selectAll()
+{
+ NodeImpl *first;
+ if (d->m_doc->isHTMLDocument())
+ first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
+ else
+ first = d->m_doc;
+ NodeImpl *next;
+
+ // Look for first text/cdata node that has a renderer
+ while ( first && !((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE) && first->renderer()) )
+ {
+ next = first->firstChild();
+ if ( !next ) next = first->nextSibling();
+ while( first && !next )
+ {
+ first = first->parentNode();
+ if ( first )
+ next = first->nextSibling();
+ }
+ first = next;
+ }
+
+ NodeImpl *last;
+ if (d->m_doc->isHTMLDocument())
+ last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
+ else
+ last = d->m_doc;
+ // Look for last text/cdata node that has a renderer
+ while ( last && !((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE) && last->renderer()) )
+ {
+ next = last->lastChild();
+ if ( !next ) next = last->previousSibling();
+ while ( last && !next )
+ {
+ last = last->parentNode();
+ if ( last )
+ next = last->previousSibling();
+ }
+ last = next;
+ }
+
+ if ( !first || !last )
+ return;
+ Q_ASSERT(first->renderer());
+ Q_ASSERT(last->renderer());
+ d->m_selectionStart = first;
+ d->m_startOffset = 0;
+ d->m_selectionEnd = last;
+ d->m_endOffset = last->nodeValue().length();
+ d->m_startBeforeEnd = true;
+
+ d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
+ d->m_selectionEnd.handle(), d->m_endOffset );
+
+ emitSelectionChanged();
+}
+
+bool KHTMLPart::checkLinkSecurity(const KURL &linkURL,const QString &message, const QString &button)
+{
+ // Security check on the link.
+ // KURL u( url ); Wrong!! Relative URL could be mis-interpreted!!! (DA)
+ QString linkProto = linkURL.protocol().lower();
+ QString proto = m_url.protocol().lower();
+
+ if ( !linkProto.isEmpty() && !proto.isEmpty() &&
+ ( linkProto == "cgi" || linkProto == "file" ) &&
+ proto != "file" && proto != "cgi" && proto != "man" && proto != "about")
+ {
+ Tokenizer *tokenizer = d->m_doc->tokenizer();
+ if (tokenizer)
+ tokenizer->setOnHold(true);
+
+ int response = KMessageBox::Cancel;
+ if (!message.isEmpty())
+ {
+ response = KMessageBox::warningContinueCancel( 0,
+ message.arg(linkURL.url()),
+ i18n( "Security Warning" ),
+ button);
+ }
+ else
+ {
+ KMessageBox::error( 0,
+ i18n( "<qt>This untrusted page contains a link<BR><B>%1</B><BR>to your local file system.").arg(linkURL.url()),
+ i18n( "Security Alert" ));
+ }
+
+ if (tokenizer)
+ tokenizer->setOnHold(false);
+ return (response==KMessageBox::Continue);
+ }
+ return true;
+}
+
+QVariant KHTMLPart::executeScript(QString filename, int baseLine, const DOM::Node &n, const QString &script)
+{
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "executeScript: filename=" << filename << " baseLine=" << baseLine << " script=" << script << endl;
+#endif
+ KJSProxy *proxy = jScript();
+
+ if (!proxy || proxy->paused())
+ return QVariant();
+ QVariant ret = proxy->evaluate(filename,baseLine,script, n );
+ DocumentImpl::updateDocumentsRendering();
+ return ret;
+}
+
+void KHTMLPart::slotPartRemoved( KParts::Part *part )
+{
+// kdDebug(6050) << "KHTMLPart::slotPartRemoved " << part << endl;
+ if ( part == d->m_activeFrame )
+ d->m_activeFrame = 0L;
+}
+
+void KHTMLPart::slotActiveFrameChanged( KParts::Part *part )
+{
+// kdDebug(6050) << "KHTMLPart::slotActiveFrameChanged part=" << part << endl;
+ if ( part == this )
+ {
+ kdError(6050) << "strange error! we activated ourselves" << endl;
+ assert( false );
+ return;
+ }
+// kdDebug(6050) << "KHTMLPart::slotActiveFrameChanged d->m_activeFrame=" << d->m_activeFrame << endl;
+ if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits( "QFrame" ) )
+ {
+ QFrame *frame = static_cast<QFrame *>( d->m_activeFrame->widget() );
+ if (frame->frameStyle() != QFrame::NoFrame)
+ {
+ frame->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken);
+ frame->repaint();
+ }
+ }
+
+ d->m_activeFrame = part;
+
+ if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits( "QFrame" ) )
+ {
+ QFrame *frame = static_cast<QFrame *>( d->m_activeFrame->widget() );
+ if (frame->frameStyle() != QFrame::NoFrame)
+ {
+ frame->setFrameStyle( QFrame::StyledPanel | QFrame::Plain);
+ frame->repaint();
+ }
+ kdDebug(6050) << "new active frame " << d->m_activeFrame << endl;
+ }
+
+ updateActions();
+
+ // (note: childObject returns 0 if the argument is 0)
+ d->m_extension->setExtensionProxy( KParts::BrowserExtension::childObject( d->m_activeFrame ) );
+}
+
+void KHTMLPart::setActiveNode(const DOM::Node &node)
+{
+ if (!d->m_doc || !d->m_view)
+ return;
+
+ // Set the document's active node
+ d->m_doc->setFocusNode(node.handle());
+
+ // Scroll the view if necessary to ensure that the new focus node is visible
+ QRect rect = node.handle()->getRect();
+ d->m_view->ensureVisible(rect.right(), rect.bottom());
+ d->m_view->ensureVisible(rect.left(), rect.top());
+}
+
+DOM::Node KHTMLPart::activeNode() const
+{
+ return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
+}
+
+DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code )
+{
+ KJSProxy *proxy = jScript();
+
+ if (!proxy)
+ return 0;
+
+ return proxy->createHTMLEventHandler( m_url.url(), code );
+}
+
+KHTMLPart *KHTMLPart::opener()
+{
+ return d->m_opener;
+}
+
+void KHTMLPart::setOpener(KHTMLPart *_opener)
+{
+ d->m_opener = _opener;
+}
+
+bool KHTMLPart::openedByJS()
+{
+ return d->m_openedByJS;
+}
+
+void KHTMLPart::setOpenedByJS(bool _openedByJS)
+{
+ d->m_openedByJS = _openedByJS;
+}
+
+void KHTMLPart::preloadStyleSheet(const QString &url, const QString &stylesheet)
+{
+ khtml::Cache::preloadStyleSheet(url, stylesheet);
+}
+
+void KHTMLPart::preloadScript(const QString &url, const QString &script)
+{
+ khtml::Cache::preloadScript(url, script);
+}
+
+QCString KHTMLPart::dcopObjectId() const
+{
+ QCString id;
+ id.sprintf("html-widget%d", d->m_dcop_counter);
+ return id;
+}
+
+long KHTMLPart::cacheId() const
+{
+ return d->m_cacheId;
+}
+
+bool KHTMLPart::restored() const
+{
+ return d->m_restored;
+}
+
+using namespace KParts;
+#include "khtml_part.moc"
+
diff --git a/WebCore/khtml/khtml_part.h b/WebCore/khtml/khtml_part.h
index ac73956..62594bf 100644
--- a/WebCore/khtml/khtml_part.h
+++ b/WebCore/khtml/khtml_part.h
@@ -23,9 +23,6 @@
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#ifdef APPLE_CHANGES
-#include "../../kwq/KWQKHTMLPart.h"
-#else /* APPLE_CHANGES not defined */
#ifndef __khtml_part_h__
#define __khtml_part_h__
@@ -44,6 +41,16 @@ class KHTMLView;
class KHTMLSettings;
class KJavaAppletContext;
+#ifdef APPLE_CHANGES
+#ifdef __OBJC__
+ at class IFURLHandle;
+ at class IFWebDataSource;
+#else
+typedef void IFURLHandle;
+typedef void IFWebDataSource;
+#endif
+#endif
+
namespace DOM
{
class HTMLDocument;
@@ -206,6 +213,7 @@ public:
*/
virtual bool closeURL();
+#ifndef APPLE_CHANGES
/**
* is called when a certain error situation (i.e. connection timed out) occured.
* default implementation either shows a KIO error dialog or loads a more verbose
@@ -213,6 +221,7 @@ public:
* @p job is the job that signaled the error situation
*/
virtual void showError(KIO::Job* job);
+#endif
/**
* Returns a reference to the DOM HTML document (for non-HTML documents, returns null)
@@ -350,11 +359,13 @@ public:
bool onlyLocalReferences() const;
#ifndef KDE_NO_COMPAT
+#ifndef APPLE_CHANGES
void enableJScript(bool e) { setJScriptEnabled(e); }
void enableJava(bool e) { setJavaEnabled(e); }
void enablePlugins(bool e) { setPluginsEnabled(e); }
void autoloadImages(bool e) { setAutoloadImages(e); }
void enableMetaRefresh(bool e) { setMetaRefreshEnabled(e); }
+#endif
bool setCharset( const QString &, bool ) { return true; }
KURL baseURL() const;
@@ -590,6 +601,7 @@ public:
*/
KParts::PartManager *partManager();
+#ifndef APPLE_CHANGES
/**
* Saves the KHTMLPart's complete state (including child frame
* objects) to the provided @ref QDataStream.
@@ -608,6 +620,7 @@ public:
* @ref browserExtension() .
**/
virtual void restoreState( QDataStream &stream );
+#endif
/**
* Returns the @p Node currently under the mouse
@@ -751,7 +764,9 @@ protected:
*/
void htmlError(int errorCode, const QString& text, const KURL& reqUrl);
+#ifndef APPLE_CHANGES
virtual void customEvent( QCustomEvent *event );
+#endif
/**
* Eventhandler of the khtml::MousePressEvent.
@@ -774,6 +789,7 @@ protected:
*/
virtual void khtmlDrawContentsEvent( khtml::DrawContentsEvent * );
+#ifndef APPLE_CHANGES
/**
* Internal reimplementation of KParts::Part::guiActivateEvent .
*/
@@ -783,10 +799,12 @@ protected:
* Internal empty reimplementation of @ref KParts::ReadOnlyPart::openFile .
*/
virtual bool openFile();
+#endif
virtual void urlSelected( const QString &url, int button, int state,
const QString &_target, KParts::URLArgs args = KParts::URLArgs());
+#ifndef APPLE_CHANGES
/**
* This method is called when a new embedded object (include html frames) is to be created.
* Reimplement it if you want to add support for certain embeddable objects without registering
@@ -799,6 +817,7 @@ protected:
QObject *parent, const char *name,
const QString &mimetype, QString &serviceName,
QStringList &serviceTypes, const QStringList ¶ms);
+#endif
public slots:
@@ -820,6 +839,8 @@ public slots:
QCString dcopObjectId() const;
+#ifndef APPLE_CHANGES
+
private slots:
/**
@@ -978,6 +999,8 @@ private slots:
*/
void slotClearSelection();
+#endif
+
private:
@@ -1046,7 +1069,13 @@ private:
DOM::EventListener *createHTMLEventListener( QString code );
DOM::HTMLDocumentImpl *docImpl() const;
+#ifdef APPLE_CHANGES
+public:
+#endif
DOM::DocumentImpl *xmlDocImpl() const;
+#ifdef APPLE_CHANGES
+private:
+#endif
khtml::ChildFrame *frame( const QObject *obj );
khtml::ChildFrame *recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args, bool callParent = true );
@@ -1067,8 +1096,38 @@ private:
KHTMLPartPrivate *d;
friend class KHTMLPartPrivate;
-};
+#ifdef APPLE_CHANGES
+public:
+ // In the original KDE, these come from superclasses.
+ void ref() { _ref++; }
+ void deref() { if(_ref) _ref--; if(!_ref) delete this; }
+ bool event(QEvent *event);
+
+ // Additions.
+
+ bool gotoBaseAnchor();
+
+ void setView(KHTMLView *view);
+
+ void slotData(IFURLHandle *, const char *bytes, int length);
+
+ void setBaseURL(const KURL &);
+
+ QString documentSource() const;
+
+ QString sheetUsed() const;
+ void setSheetUsed(const QString &);
+
+ void setTitle(const DOM::DOMString &);
+
+ void setDataSource(IFWebDataSource *);
+ IFWebDataSource *getDataSource();
+
+private:
+ unsigned int _ref;
+#endif
+
+};
#endif
-#endif /* APPLE_CHANGES not defined */
diff --git a/WebCore/kwq/KWQKHTMLPart.mm b/WebCore/kwq/KWQKHTMLPart.mm
index f5d535b..fcc91df 100644
--- a/WebCore/kwq/KWQKHTMLPart.mm
+++ b/WebCore/kwq/KWQKHTMLPart.mm
@@ -48,7 +48,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#include <kwqdebug.h>
#include <decoder.h>
@@ -73,13 +72,15 @@
#include <loader.h>
#include <kjs/interpreter.h>
#include <kjs/collector.h>
+#include <ecma/kjs_proxy.h>
#include <kjs_dom.h>
#include <dom_doc.h>
#include <qcursor.h>
#include <kurl.h>
#include <khtmlview.h>
-#include <KWQKHTMLPart.h>
+#include <khtml_part.h>
+#include <khtml_events.h>
#import <WCPluginWidget.h>
@@ -169,6 +170,10 @@ public:
#endif
QString m_sheetUsed;
+
+ QValueList<QString> plugins;
+
+ IFWebDataSource *m_dataSource;
KHTMLPartPrivate(KHTMLPart *part)
{
@@ -195,6 +200,8 @@ public:
m_documentSource = "";
m_decodingStarted = 0;
+
+ m_dataSource = 0;
}
~KHTMLPartPrivate()
@@ -238,17 +245,7 @@ static QString splitUrlTarget(const QString &url, QString *target=0)
return result;
}
-KHTMLPart::KHTMLPart()
-{
- init();
-}
-
-KHTMLPart::KHTMLPart(const KURL &url)
-{
- init();
-}
-
-void KHTMLPart::init()
+KHTMLPart::KHTMLPart( QWidget *, const char *, QObject *, const char *, GUIProfile )
{
d = new KHTMLPartPrivate(this);
_ref = 1;
@@ -323,6 +320,8 @@ bool KHTMLPart::metaRefreshEnabled() const
return TRUE;
}
+extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
+
KJSProxy *KHTMLPart::jScript()
{
if (!jScriptEnabled()) return 0;
@@ -692,8 +691,7 @@ bool KHTMLPart::gotoAnchor( const QString &name )
return true;
}
-
-KHTMLSettings *KHTMLPart::settings()
+const KHTMLSettings *KHTMLPart::settings() const
{
return d->m_settings;
}
@@ -708,16 +706,11 @@ KURL KHTMLPart::completeURL(const QString &url)
return KURL( d->m_doc->completeURL( url ) );
}
-void KHTMLPart::scheduleRedirection( int delay, const QString &url )
+void KHTMLPart::scheduleRedirection( int delay, const QString &url, bool )
{
_logNeverImplemented();
}
-bool KHTMLPart::setCharset( const QString &name, bool override = false )
-{
- _logNeverImplemented();
- return FALSE;
-}
bool KHTMLPart::setEncoding( const QString &name, bool override )
{
@@ -747,7 +740,7 @@ bool KHTMLPart::setEncoding( const QString &name, bool override )
#endif /* not APPLE_CHANGES */
}
-QString KHTMLPart::encoding()
+QString KHTMLPart::encoding() const
{
_logNeverImplemented();
return d->m_settings->encoding();
@@ -781,7 +774,7 @@ void KHTMLPart::setURLCursor( const QCursor &c )
// FIXME: this should be removed
static const QCursor *staticURLCursor = NULL;
-const QCursor& KHTMLPart::urlCursor() const
+QCursor KHTMLPart::urlCursor() const
{
_logNeverImplemented();
if (staticURLCursor == NULL) {
@@ -806,20 +799,6 @@ void KHTMLPart::findTextBegin()
_logNeverImplemented();
}
-bool KHTMLPart::findTextNext( const QRegExp &exp, bool forward )
-{
-// DUBIOUS, perhaps searching should be handled externally
- _logNeverImplemented();
- return FALSE;
-}
-
-bool KHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive )
-{
-// DUBIOUS, perhaps searching should be handled externally
- _logNeverImplemented();
- return FALSE;
-}
-
QString KHTMLPart::selectedText() const
{
// DUBIOUS, perhaps selection should be managed externally
@@ -847,12 +826,7 @@ void KHTMLPart::setSelection( const DOM::Range & )
_logNeverImplemented();
}
-void KHTMLPart::overURL( const QString &url, const QString &target)
-{
- _logNeverImplemented();
-}
-
-void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target)
+void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target, KParts::URLArgs )
{
_logNeverImplemented();
}
@@ -947,10 +921,10 @@ bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, con
// requestObject can be called multiple times for a single plug-in.
// The plugins array is an attempt to avoid multiple creations of the same plug-in.
// FIXME: Can't have multiple plug-ins with the same URL on a page
- if(!plugins.contains(url)) {
+ if(!d->plugins.contains(url)) {
WCPluginWidget *pluginWidget = new WCPluginWidget(completeURL(url).url(), serviceType, args, d->m_baseURL.url());
frame->setWidget(pluginWidget);
- plugins.append(url);
+ d->plugins.append(url);
}
return true;
}
@@ -1112,7 +1086,7 @@ QString KHTMLPart::jsDefaultStatusBarText() const
return QString();
}
-const QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
+QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
{
_logNeverImplemented();
@@ -1566,7 +1540,7 @@ void KHTMLPart::setOpenedByJS(bool _openedByJS)
_logNeverImplemented();
}
-QString KHTMLPart::documentSource()
+QString KHTMLPart::documentSource() const
{
return d->m_documentSource;
}
@@ -1591,28 +1565,11 @@ KURL KHTMLPart::baseURL() const
return d->m_baseURL;
}
-const KURL & KHTMLPart::url() const
-{
- return d->m_workingURL;
-}
-
void KHTMLPart::setView(KHTMLView *view)
{
d->m_view = view;
}
-QWidget *KHTMLPart::widget()
-{
- _logNotYetImplemented();
- return 0L;
-}
-
-
-void KHTMLPart::emitUnloadEvent()
-{
- _logNeverImplemented();
-}
-
void KHTMLPart::nodeActivated(const DOM::Node &aNode)
{
KWQDEBUG ("name %s = %s\n", (const char *)aNode.nodeName().string(), (const char *)aNode.nodeValue().string());
@@ -1625,7 +1582,7 @@ void KHTMLPart::stopAutoScroll()
void KHTMLPart::setTitle(const DOMString &title)
{
- [dataSource _setTitle:(NSString *)title.string().getCFMutableString()];
+ [getDataSource() _setTitle:(NSString *)title.string().getCFMutableString()];
}
QString KHTMLPart::sheetUsed() const
@@ -1642,3 +1599,13 @@ int KHTMLPart::zoomFactor(void) const
{
return 100;
}
+
+void KHTMLPart::setDataSource(IFWebDataSource *dataSource)
+{
+ d->m_dataSource = dataSource; // not retained
+}
+
+IFWebDataSource *KHTMLPart::getDataSource()
+{
+ return d->m_dataSource;
+}
diff --git a/WebCore/kwq/KWQKHTMLPartImpl.mm b/WebCore/kwq/KWQKHTMLPartImpl.mm
index f5d535b..fcc91df 100644
--- a/WebCore/kwq/KWQKHTMLPartImpl.mm
+++ b/WebCore/kwq/KWQKHTMLPartImpl.mm
@@ -48,7 +48,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#include <kwqdebug.h>
#include <decoder.h>
@@ -73,13 +72,15 @@
#include <loader.h>
#include <kjs/interpreter.h>
#include <kjs/collector.h>
+#include <ecma/kjs_proxy.h>
#include <kjs_dom.h>
#include <dom_doc.h>
#include <qcursor.h>
#include <kurl.h>
#include <khtmlview.h>
-#include <KWQKHTMLPart.h>
+#include <khtml_part.h>
+#include <khtml_events.h>
#import <WCPluginWidget.h>
@@ -169,6 +170,10 @@ public:
#endif
QString m_sheetUsed;
+
+ QValueList<QString> plugins;
+
+ IFWebDataSource *m_dataSource;
KHTMLPartPrivate(KHTMLPart *part)
{
@@ -195,6 +200,8 @@ public:
m_documentSource = "";
m_decodingStarted = 0;
+
+ m_dataSource = 0;
}
~KHTMLPartPrivate()
@@ -238,17 +245,7 @@ static QString splitUrlTarget(const QString &url, QString *target=0)
return result;
}
-KHTMLPart::KHTMLPart()
-{
- init();
-}
-
-KHTMLPart::KHTMLPart(const KURL &url)
-{
- init();
-}
-
-void KHTMLPart::init()
+KHTMLPart::KHTMLPart( QWidget *, const char *, QObject *, const char *, GUIProfile )
{
d = new KHTMLPartPrivate(this);
_ref = 1;
@@ -323,6 +320,8 @@ bool KHTMLPart::metaRefreshEnabled() const
return TRUE;
}
+extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
+
KJSProxy *KHTMLPart::jScript()
{
if (!jScriptEnabled()) return 0;
@@ -692,8 +691,7 @@ bool KHTMLPart::gotoAnchor( const QString &name )
return true;
}
-
-KHTMLSettings *KHTMLPart::settings()
+const KHTMLSettings *KHTMLPart::settings() const
{
return d->m_settings;
}
@@ -708,16 +706,11 @@ KURL KHTMLPart::completeURL(const QString &url)
return KURL( d->m_doc->completeURL( url ) );
}
-void KHTMLPart::scheduleRedirection( int delay, const QString &url )
+void KHTMLPart::scheduleRedirection( int delay, const QString &url, bool )
{
_logNeverImplemented();
}
-bool KHTMLPart::setCharset( const QString &name, bool override = false )
-{
- _logNeverImplemented();
- return FALSE;
-}
bool KHTMLPart::setEncoding( const QString &name, bool override )
{
@@ -747,7 +740,7 @@ bool KHTMLPart::setEncoding( const QString &name, bool override )
#endif /* not APPLE_CHANGES */
}
-QString KHTMLPart::encoding()
+QString KHTMLPart::encoding() const
{
_logNeverImplemented();
return d->m_settings->encoding();
@@ -781,7 +774,7 @@ void KHTMLPart::setURLCursor( const QCursor &c )
// FIXME: this should be removed
static const QCursor *staticURLCursor = NULL;
-const QCursor& KHTMLPart::urlCursor() const
+QCursor KHTMLPart::urlCursor() const
{
_logNeverImplemented();
if (staticURLCursor == NULL) {
@@ -806,20 +799,6 @@ void KHTMLPart::findTextBegin()
_logNeverImplemented();
}
-bool KHTMLPart::findTextNext( const QRegExp &exp, bool forward )
-{
-// DUBIOUS, perhaps searching should be handled externally
- _logNeverImplemented();
- return FALSE;
-}
-
-bool KHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive )
-{
-// DUBIOUS, perhaps searching should be handled externally
- _logNeverImplemented();
- return FALSE;
-}
-
QString KHTMLPart::selectedText() const
{
// DUBIOUS, perhaps selection should be managed externally
@@ -847,12 +826,7 @@ void KHTMLPart::setSelection( const DOM::Range & )
_logNeverImplemented();
}
-void KHTMLPart::overURL( const QString &url, const QString &target)
-{
- _logNeverImplemented();
-}
-
-void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target)
+void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target, KParts::URLArgs )
{
_logNeverImplemented();
}
@@ -947,10 +921,10 @@ bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, con
// requestObject can be called multiple times for a single plug-in.
// The plugins array is an attempt to avoid multiple creations of the same plug-in.
// FIXME: Can't have multiple plug-ins with the same URL on a page
- if(!plugins.contains(url)) {
+ if(!d->plugins.contains(url)) {
WCPluginWidget *pluginWidget = new WCPluginWidget(completeURL(url).url(), serviceType, args, d->m_baseURL.url());
frame->setWidget(pluginWidget);
- plugins.append(url);
+ d->plugins.append(url);
}
return true;
}
@@ -1112,7 +1086,7 @@ QString KHTMLPart::jsDefaultStatusBarText() const
return QString();
}
-const QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
+QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
{
_logNeverImplemented();
@@ -1566,7 +1540,7 @@ void KHTMLPart::setOpenedByJS(bool _openedByJS)
_logNeverImplemented();
}
-QString KHTMLPart::documentSource()
+QString KHTMLPart::documentSource() const
{
return d->m_documentSource;
}
@@ -1591,28 +1565,11 @@ KURL KHTMLPart::baseURL() const
return d->m_baseURL;
}
-const KURL & KHTMLPart::url() const
-{
- return d->m_workingURL;
-}
-
void KHTMLPart::setView(KHTMLView *view)
{
d->m_view = view;
}
-QWidget *KHTMLPart::widget()
-{
- _logNotYetImplemented();
- return 0L;
-}
-
-
-void KHTMLPart::emitUnloadEvent()
-{
- _logNeverImplemented();
-}
-
void KHTMLPart::nodeActivated(const DOM::Node &aNode)
{
KWQDEBUG ("name %s = %s\n", (const char *)aNode.nodeName().string(), (const char *)aNode.nodeValue().string());
@@ -1625,7 +1582,7 @@ void KHTMLPart::stopAutoScroll()
void KHTMLPart::setTitle(const DOMString &title)
{
- [dataSource _setTitle:(NSString *)title.string().getCFMutableString()];
+ [getDataSource() _setTitle:(NSString *)title.string().getCFMutableString()];
}
QString KHTMLPart::sheetUsed() const
@@ -1642,3 +1599,13 @@ int KHTMLPart::zoomFactor(void) const
{
return 100;
}
+
+void KHTMLPart::setDataSource(IFWebDataSource *dataSource)
+{
+ d->m_dataSource = dataSource; // not retained
+}
+
+IFWebDataSource *KHTMLPart::getDataSource()
+{
+ return d->m_dataSource;
+}
diff --git a/WebCore/kwq/KWQKHTMLSettings.h b/WebCore/kwq/KWQKHTMLSettings.h
index 008f576..b1430bf 100644
--- a/WebCore/kwq/KWQKHTMLSettings.h
+++ b/WebCore/kwq/KWQKHTMLSettings.h
@@ -67,7 +67,7 @@ public:
const QValueList<int> &fontSizes() const;
- bool changeCursor();
+ bool changeCursor() const;
bool isFormCompletionEnabled() const;
int maxFormCompletionItems() const;
diff --git a/WebCore/kwq/KWQKHTMLSettings.mm b/WebCore/kwq/KWQKHTMLSettings.mm
index c84defd..06af5aa 100644
--- a/WebCore/kwq/KWQKHTMLSettings.mm
+++ b/WebCore/kwq/KWQKHTMLSettings.mm
@@ -150,7 +150,7 @@ const QValueList<int> &KHTMLSettings::fontSizes() const
}
-bool KHTMLSettings::changeCursor()
+bool KHTMLSettings::changeCursor() const
{
_logNotYetImplemented();
return FALSE;
diff --git a/WebCore/kwq/KWQKloader.mm b/WebCore/kwq/KWQKloader.mm
index 25e6fbe..69845d1 100644
--- a/WebCore/kwq/KWQKloader.mm
+++ b/WebCore/kwq/KWQKloader.mm
@@ -1190,7 +1190,7 @@ void Loader::load(DocLoader* dl, CachedObject *object, bool incremental = true)
#if APPLE_CHANGES
id client;
- id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+ IFWebDataSource *dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
req->client = client;
#endif
diff --git a/WebCore/kwq/KWQLoader.mm b/WebCore/kwq/KWQLoader.mm
index 25e6fbe..69845d1 100644
--- a/WebCore/kwq/KWQLoader.mm
+++ b/WebCore/kwq/KWQLoader.mm
@@ -1190,7 +1190,7 @@ void Loader::load(DocLoader* dl, CachedObject *object, bool incremental = true)
#if APPLE_CHANGES
id client;
- id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+ IFWebDataSource *dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
req->client = client;
#endif
diff --git a/WebCore/kwq/KWQLoaderImpl.mm b/WebCore/kwq/KWQLoaderImpl.mm
index 25e6fbe..69845d1 100644
--- a/WebCore/kwq/KWQLoaderImpl.mm
+++ b/WebCore/kwq/KWQLoaderImpl.mm
@@ -1190,7 +1190,7 @@ void Loader::load(DocLoader* dl, CachedObject *object, bool incremental = true)
#if APPLE_CHANGES
id client;
- id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+ IFWebDataSource *dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
req->client = client;
#endif
diff --git a/WebCore/kwq/KWQView.mm b/WebCore/kwq/KWQView.mm
index 701ac6c..cef4d6b 100644
--- a/WebCore/kwq/KWQView.mm
+++ b/WebCore/kwq/KWQView.mm
@@ -170,16 +170,13 @@
- (void)layout
{
- if (((KHTMLView *)widget)->part()->xmlDocImpl() &&
- ((KHTMLView *)widget)->part()->xmlDocImpl()->renderer()){
- if (needsLayout){
+ if (needsLayout){
#ifndef xNDEBUG
- double start = CFAbsoluteTimeGetCurrent();
+ double start = CFAbsoluteTimeGetCurrent();
#endif
- ((KHTMLView *)widget)->layout();
- KWQDEBUGLEVEL (KWQ_LOG_TIMING, "layout time %e\n", CFAbsoluteTimeGetCurrent() - start);
- needsLayout = NO;
- }
+ ((KHTMLView *)widget)->layout();
+ KWQDEBUGLEVEL (KWQ_LOG_TIMING, "layout time %e\n", CFAbsoluteTimeGetCurrent() - start);
+ needsLayout = NO;
}
}
diff --git a/WebCore/kwq/khtml/khtml_settings.h b/WebCore/kwq/khtml/khtml_settings.h
index 008f576..b1430bf 100644
--- a/WebCore/kwq/khtml/khtml_settings.h
+++ b/WebCore/kwq/khtml/khtml_settings.h
@@ -67,7 +67,7 @@ public:
const QValueList<int> &fontSizes() const;
- bool changeCursor();
+ bool changeCursor() const;
bool isFormCompletionEnabled() const;
int maxFormCompletionItems() const;
diff --git a/WebCore/libwebcore.exp b/WebCore/libwebcore.exp
index 606f001..05b4d0f 100644
--- a/WebCore/libwebcore.exp
+++ b/WebCore/libwebcore.exp
@@ -9,11 +9,11 @@ ___11QMouseEventQ26QEvent4TypeRC6QPointii
___4KURLPCci
___6QPointii
___8QPainterP7QWidget
-___9KHTMLPart
+___9KHTMLPartP7QWidgetPCcP7QObjectPCcQ29KHTMLPart10GUIProfile
___9KHTMLViewP9KHTMLPartP7QWidgetPCc
_deref__9KHTMLPart
_deref__Q23DOM9DomShared
-_documentSource__9KHTMLPart
+_documentSource__C9KHTMLPart
_flushAll__Q25khtml5Cache
_getStatistics__Q25khtml5Cache
_getView__C7QWidget
diff --git a/WebCore/src/kdelibs/khtml/khtml_part.cpp b/WebCore/src/kdelibs/khtml/khtml_part.cpp
new file mode 100644
index 0000000..056e85e
--- /dev/null
+++ b/WebCore/src/kdelibs/khtml/khtml_part.cpp
@@ -0,0 +1,4282 @@
+// -*- c-basic-offset: 2 -*-
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 1998, 1999 Torben Weis <weis at kde.org>
+ * 1999 Lars Knoll <knoll at kde.org>
+ * 1999 Antti Koivisto <koivisto at kde.org>
+ * 2000 Simon Hausmann <hausmann at kde.org>
+ * 2000 Stefan Schimanski <1Stein at gmx.de>
+ * 2001 George Staikos <staikos at kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define SPEED_DEBUG
+#include "khtml_part.h"
+
+#include "khtml_pagecache.h"
+
+#include "dom/dom_string.h"
+#include "dom/dom_element.h"
+#include "html/html_documentimpl.h"
+#include "html/html_baseimpl.h"
+#include "html/html_miscimpl.h"
+#include "html/html_imageimpl.h"
+#include "rendering/render_text.h"
+#include "rendering/render_frames.h"
+#include "misc/htmlhashes.h"
+#include "misc/loader.h"
+#include "xml/dom2_eventsimpl.h"
+#include "xml/xml_tokenizer.h"
+#include "css/cssstyleselector.h"
+#include "css/csshelper.h"
+using namespace DOM;
+
+#include "khtmlview.h"
+#include <kparts/partmanager.h>
+#include "ecma/kjs_proxy.h"
+#include "khtml_settings.h"
+
+#include <sys/types.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include <kstandarddirs.h>
+#include <kio/job.h>
+#include <kio/global.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kcharsets.h>
+#include <kmessagebox.h>
+#include <kstdaction.h>
+#include <kfiledialog.h>
+#include <ktrader.h>
+#include <kdatastream.h>
+#include <ktempfile.h>
+#include <kglobalsettings.h>
+#include <kurldrag.h>
+#include <kapplication.h>
+#if !defined(QT_NO_DRAGANDDROP)
+#include <kmultipledrag.h>
+#endif
+
+#include <ksslcertchain.h>
+#include <ksslinfodlg.h>
+
+
+#include <qclipboard.h>
+#include <qfile.h>
+#include <qmetaobject.h>
+#include <private/qucomextra_p.h>
+
+#include "khtmlpart_p.h"
+
+namespace khtml {
+ class PartStyleSheetLoader : public CachedObjectClient
+ {
+ public:
+ PartStyleSheetLoader(KHTMLPart *part, DOM::DOMString url, DocLoader* dl)
+ {
+ m_part = part;
+ m_cachedSheet = Cache::requestStyleSheet(dl, url );
+ if (m_cachedSheet)
+ m_cachedSheet->ref( this );
+ }
+ virtual ~PartStyleSheetLoader()
+ {
+ if ( m_cachedSheet ) m_cachedSheet->deref(this);
+ }
+ virtual void setStyleSheet(const DOM::DOMString&, const DOM::DOMString &sheet)
+ {
+ if ( m_part )
+ m_part->setUserStyleSheet( sheet.string() );
+
+ delete this;
+ }
+ QGuardedPtr<KHTMLPart> m_part;
+ khtml::CachedCSSStyleSheet *m_cachedSheet;
+ };
+};
+
+
+FrameList::Iterator FrameList::find( const QString &name )
+{
+ Iterator it = begin();
+ Iterator e = end();
+
+ for (; it!=e; ++it )
+ if ( (*it).m_name==name )
+ break;
+
+ return it;
+}
+
+KHTMLPart::KHTMLPart( QWidget *parentWidget, const char *widgetname, QObject *parent, const char *name,
+ GUIProfile prof )
+: KParts::ReadOnlyPart( parent, name )
+{
+ d = 0;
+ KHTMLFactory::registerPart( this );
+ setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
+ init( new KHTMLView( this, parentWidget, widgetname ), prof );
+}
+
+KHTMLPart::KHTMLPart( KHTMLView *view, QObject *parent, const char *name, GUIProfile prof )
+: KParts::ReadOnlyPart( parent, name )
+{
+ d = 0;
+ KHTMLFactory::registerPart( this );
+ setInstance( KHTMLFactory::instance(), prof == BrowserViewGUI && !parentPart() );
+ assert( view );
+ init( view, prof );
+}
+
+void KHTMLPart::init( KHTMLView *view, GUIProfile prof )
+{
+ if ( prof == DefaultGUI )
+ setXMLFile( "khtml.rc" );
+ else if ( prof == BrowserViewGUI )
+ setXMLFile( "khtml_browser.rc" );
+
+ d = new KHTMLPartPrivate(parent());
+
+ d->m_view = view;
+ setWidget( d->m_view );
+
+ d->m_guiProfile = prof;
+ d->m_extension = new KHTMLPartBrowserExtension( this );
+ d->m_hostExtension = new KHTMLPartBrowserHostExtension( this );
+
+ d->m_bSecurityInQuestion = false;
+ d->m_paLoadImages = 0;
+ d->m_bMousePressed = false;
+ d->m_paViewDocument = new KAction( i18n( "View Document Source" ), 0, this, SLOT( slotViewDocumentSource() ), actionCollection(), "viewDocumentSource" );
+ d->m_paViewFrame = new KAction( i18n( "View Frame Source" ), 0, this, SLOT( slotViewFrameSource() ), actionCollection(), "viewFrameSource" );
+ d->m_paSaveBackground = new KAction( i18n( "Save &Background Image As..." ), 0, this, SLOT( slotSaveBackground() ), actionCollection(), "saveBackground" );
+ d->m_paSaveDocument = new KAction( i18n( "&Save As..." ), CTRL+Key_S, this, SLOT( slotSaveDocument() ), actionCollection(), "saveDocument" );
+ if ( parentPart() )
+ d->m_paSaveDocument->setShortcut( KShortcut() ); // avoid clashes
+ d->m_paSaveFrame = new KAction( i18n( "Save &Frame As..." ), 0, this, SLOT( slotSaveFrame() ), actionCollection(), "saveFrame" );
+ d->m_paSecurity = new KAction( i18n( "Security..." ), "decrypted", 0, this, SLOT( slotSecurity() ), actionCollection(), "security" );
+ d->m_paDebugRenderTree = new KAction( "print rendering tree to stdout", 0, this, SLOT( slotDebugRenderTree() ), actionCollection(), "debugRenderTree" );
+ d->m_paDebugDOMTree = new KAction( "print DOM tree to stdout", 0, this, SLOT( slotDebugDOMTree() ), actionCollection(), "debugDOMTree" );
+
+ QString foo1 = i18n("Show Images");
+ QString foo2 = i18n("Show Animated Images");
+ QString foo3 = i18n("Stop Animated Images");
+
+ d->m_paSetEncoding = new KSelectAction( i18n( "Set &Encoding" ), 0, this, SLOT( slotSetEncoding() ), actionCollection(), "setEncoding" );
+ QStringList encodings = KGlobal::charsets()->descriptiveEncodingNames();
+ encodings.prepend( i18n( "Auto" ) );
+ d->m_paSetEncoding->setItems( encodings );
+ d->m_paSetEncoding->setCurrentItem(0);
+
+ d->m_paUseStylesheet = new KSelectAction( i18n( "&Use Stylesheet"), 0, this, SLOT( slotUseStylesheet() ), actionCollection(), "useStylesheet" );
+
+ d->m_paIncZoomFactor = new KHTMLZoomFactorAction( this, true, i18n( "Increase Font Sizes" ), "viewmag+", this, SLOT( slotIncZoom() ), actionCollection(), "incFontSizes" );
+ d->m_paDecZoomFactor = new KHTMLZoomFactorAction( this, false, i18n( "Decrease Font Sizes" ), "viewmag-", this, SLOT( slotDecZoom() ), actionCollection(), "decFontSizes" );
+
+ d->m_paFind = KStdAction::find( this, SLOT( slotFind() ), actionCollection(), "find" );
+ if ( parentPart() )
+ d->m_paFind->setShortcut( KShortcut() ); // avoid clashes
+
+ d->m_paPrintFrame = new KAction( i18n( "Print Frame" ), "frameprint", 0, this, SLOT( slotPrintFrame() ), actionCollection(), "printFrame" );
+
+ d->m_paSelectAll = KStdAction::selectAll( this, SLOT( slotSelectAll() ), actionCollection(), "selectAll" );
+ if ( parentPart() )
+ d->m_paSelectAll->setShortcut( KShortcut() ); // avoid clashes
+
+ // set the default java(script) flags according to the current host.
+ d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled();
+ d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled();
+ d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled();
+
+ connect( this, SIGNAL( completed() ),
+ this, SLOT( updateActions() ) );
+ connect( this, SIGNAL( completed( bool ) ),
+ this, SLOT( updateActions() ) );
+ connect( this, SIGNAL( started( KIO::Job * ) ),
+ this, SLOT( updateActions() ) );
+
+ d->m_popupMenuXML = KXMLGUIFactory::readConfigFile( locate( "data", "khtml/khtml_popupmenu.rc", KHTMLFactory::instance() ) );
+
+ connect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
+ this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
+ connect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+ connect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+
+ findTextBegin(); //reset find variables
+
+ connect( &d->m_redirectionTimer, SIGNAL( timeout() ),
+ this, SLOT( slotRedirect() ) );
+
+ d->m_dcopobject = new KHTMLPartIface(this);
+}
+
+KHTMLPart::~KHTMLPart()
+{
+ //kdDebug(6050) << "KHTMLPart::~KHTMLPart " << this << endl;
+ if ( d->m_findDialog )
+ disconnect( d->m_findDialog, SIGNAL( destroyed() ),
+ this, SLOT( slotFindDialogDestroyed() ) );
+
+ if ( d->m_manager )
+ {
+ d->m_manager->setActivePart( 0 );
+ // Shouldn't we delete d->m_manager here ? (David)
+ // No need to, I would say. We specify "this" as parent qobject
+ // in ::partManager() (Simon)
+ }
+
+ stopAutoScroll();
+ d->m_redirectionTimer.stop();
+
+ if ( d->m_job )
+ d->m_job->kill();
+
+ if ( d->m_doc && d->m_doc->docLoader() )
+ khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
+
+ disconnect( khtml::Cache::loader(), SIGNAL( requestStarted( khtml::DocLoader*, khtml::CachedObject* ) ),
+ this, SLOT( slotLoaderRequestStarted( khtml::DocLoader*, khtml::CachedObject* ) ) );
+ disconnect( khtml::Cache::loader(), SIGNAL( requestDone( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+ disconnect( khtml::Cache::loader(), SIGNAL( requestFailed( khtml::DocLoader*, khtml::CachedObject *) ),
+ this, SLOT( slotLoaderRequestDone( khtml::DocLoader*, khtml::CachedObject *) ) );
+
+ clear();
+
+ if ( d->m_view )
+ {
+ d->m_view->hide();
+ d->m_view->viewport()->hide();
+ d->m_view->m_part = 0;
+ }
+
+ delete d; d = 0;
+ KHTMLFactory::deregisterPart( this );
+}
+
+bool KHTMLPart::restoreURL( const KURL &url )
+{
+ kdDebug( 6050 ) << "KHTMLPart::restoreURL " << url.url() << endl;
+
+ d->m_redirectionTimer.stop();
+
+ /*
+ * That's not a good idea as it will call closeURL() on all
+ * child frames, preventing them from further loading. This
+ * method gets called from restoreState() in case of a full frameset
+ * restoral, and restoreState() calls closeURL() before restoring
+ * anyway.
+ kdDebug( 6050 ) << "closing old URL" << endl;
+ closeURL();
+ */
+
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+ d->m_workingURL = url;
+
+ d->m_restored = true;
+
+ // set the java(script) flags according to the current host.
+ d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
+ d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
+ d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
+
+ m_url = url;
+
+ KHTMLPageCache::self()->fetchData( d->m_cacheId, this, SLOT(slotRestoreData(const QByteArray &)));
+
+ emit started( 0L );
+
+ return true;
+}
+
+
+bool KHTMLPart::openURL( const KURL &url )
+{
+ kdDebug( 6050 ) << "KHTMLPart(" << this << ")::openURL " << url.url() << endl;
+
+ d->m_redirectionTimer.stop();
+
+ // check to see if this is an "error://" URL. This is caused when an error
+ // occurs before this part was loaded (e.g. KonqRun), and is passed to
+ // khtmlpart so that it can display the error.
+ if ( url.protocol() == "error" && url.hasSubURL() ) {
+ closeURL();
+ /**
+ * The format of the error url is that two variables are passed in the query:
+ * error = int kio error code, errText = QString error text from kio
+ * and the URL where the error happened is passed as a sub URL.
+ */
+ KURL::List urls = KURL::split( url );
+ //kdDebug() << "Handling error URL. URL count:" << urls.count() << endl;
+
+ if ( urls.count() > 1 ) {
+ KURL mainURL = urls.first();
+ int error = mainURL.queryItem( "error" ).toInt();
+ // error=0 isn't a valid error code, so 0 means it's missing from the URL
+ if ( error == 0 ) error = KIO::ERR_UNKNOWN;
+ QString errorText = mainURL.queryItem( "errText" );
+ urls.pop_front();
+ d->m_workingURL = KURL::join( urls );
+ //kdDebug() << "Emitting fixed URL " << d->m_workingURL.prettyURL() << endl;
+ emit d->m_extension->setLocationBarURL( d->m_workingURL.prettyURL() );
+ htmlError( error, errorText, d->m_workingURL );
+ return true;
+ }
+ }
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ // in case we have a) no frameset (don't test m_frames.count(), iframes get in there)
+ // b) the url is identical with the currently
+ // displayed one (except for the htmlref!) , c) the url request is not a POST
+ // operation and d) the caller did not request to reload the page we try to
+ // be smart and instead of reloading the whole document we just jump to the
+ // request html anchor
+ bool isFrameSet = false;
+ if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
+ HTMLDocumentImpl* htmlDoc = static_cast<HTMLDocumentImpl*>(d->m_doc);
+ isFrameSet = htmlDoc->body() && (htmlDoc->body()->id() == ID_FRAMESET);
+ }
+ if ( !isFrameSet &&
+ urlcmp( url.url(), m_url.url(), true, true ) &&
+ url.hasRef() && !args.doPost() && !args.reload )
+ {
+ kdDebug( 6050 ) << "KHTMLPart::openURL, jumping to anchor. m_url = " << url.url() << endl;
+ m_url = url;
+ emit started( 0L );
+
+ if ( !gotoAnchor( url.encodedHtmlRef()) )
+ gotoAnchor( url.htmlRef() );
+
+ d->m_bComplete = true;
+ d->m_doc->setParsing(false);
+
+ kdDebug( 6050 ) << "completed..." << endl;
+ emit completed();
+ return true;
+ }
+
+ kdDebug( 6050 ) << "closing old URL" << endl;
+ closeURL();
+
+ args.metaData().insert("main_frame_request", parentPart() == 0 ? "TRUE" : "FALSE" );
+ args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE" : "FALSE" );
+ args.metaData().insert("ssl_activate_warnings", "TRUE" );
+ d->m_bReloading = args.reload;
+
+ if ( args.doPost() && (url.protocol().startsWith("http")) )
+ {
+ d->m_job = KIO::http_post( url, args.postData, false );
+ d->m_job->addMetaData("content-type", args.contentType() );
+ }
+ else
+ d->m_job = KIO::get( url, args.reload, false );
+
+ d->m_job->addMetaData(args.metaData());
+
+ connect( d->m_job, SIGNAL( result( KIO::Job * ) ),
+ SLOT( slotFinished( KIO::Job * ) ) );
+ connect( d->m_job, SIGNAL( data( KIO::Job*, const QByteArray &)),
+ SLOT( slotData( KIO::Job*, const QByteArray &)));
+
+ connect( d->m_job, SIGNAL(redirection(KIO::Job*, const KURL&) ),
+ SLOT( slotRedirection(KIO::Job*,const KURL&) ) );
+
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+ d->m_restored = false;
+
+ // delete old status bar msg's from kjs (if it _was_ activated on last URL)
+ if( d->m_bJScriptEnabled )
+ {
+ d->m_kjsStatusBarText = QString::null;
+ d->m_kjsDefaultStatusBarText = QString::null;
+ }
+
+ // set the javascript flags according to the current url
+ d->m_bJScriptEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
+ d->m_bJScriptDebugEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
+ d->m_bPluginsEnabled = KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host());
+
+ // 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
+ // data arrives) (Simon)
+ m_url = url;
+ if(m_url.protocol().startsWith( "http" ) && !m_url.host().isEmpty() &&
+ m_url.path().isEmpty()) {
+ m_url.setPath("/");
+ emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
+ }
+ // copy to m_workingURL after fixing m_url above
+ d->m_workingURL = m_url;
+
+ kdDebug( 6050 ) << "KHTMLPart::openURL now (before started) m_url = " << m_url.url() << endl;
+
+ connect( d->m_job, SIGNAL( speed( KIO::Job*, unsigned long ) ),
+ this, SLOT( slotJobSpeed( KIO::Job*, unsigned long ) ) );
+
+ connect( d->m_job, SIGNAL( percent( KIO::Job*, unsigned long ) ),
+ this, SLOT( slotJobPercent( KIO::Job*, unsigned long ) ) );
+
+ emit started( 0L );
+
+ return true;
+}
+
+bool KHTMLPart::closeURL()
+{
+ if ( d->m_job )
+ {
+ KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
+ d->m_job->kill();
+ d->m_job = 0;
+ }
+
+ if ( d->m_doc && d->m_doc->isHTMLDocument() ) {
+ HTMLDocumentImpl* hdoc = static_cast<HTMLDocumentImpl*>( d->m_doc );
+
+ if ( hdoc->body() && d->m_bLoadEventEmitted ) {
+ hdoc->body()->dispatchWindowEvent( EventImpl::UNLOAD_EVENT, false, false );
+ if ( d->m_doc )
+ d->m_doc->updateRendering();
+ d->m_bLoadEventEmitted = false;
+ }
+ }
+
+ d->m_bComplete = true; // to avoid emitting completed() in slotFinishedParsing() (David)
+ d->m_bLoadEventEmitted = true; // don't want that one either
+ d->m_bReloading = false;
+
+ KHTMLPageCache::self()->cancelFetch(this);
+ if ( d->m_doc && d->m_doc->parsing() )
+ {
+ kdDebug( 6050 ) << " was still parsing... calling end " << endl;
+ slotFinishedParsing();
+ d->m_doc->setParsing(false);
+ }
+
+ if ( !d->m_workingURL.isEmpty() )
+ {
+ // Aborted before starting to render
+ kdDebug( 6050 ) << "Aborted before starting to render, reverting location bar to " << m_url.prettyURL() << endl;
+ emit d->m_extension->setLocationBarURL( m_url.prettyURL() );
+ }
+
+ d->m_workingURL = KURL();
+
+ if ( d->m_doc && d->m_doc->docLoader() )
+ khtml::Cache::loader()->cancelRequests( d->m_doc->docLoader() );
+
+ // tell all subframes to stop as well
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() )
+ ( *it ).m_part->closeURL();
+
+ d->m_bPendingChildRedirection = false;
+
+ // Stop any started redirections as well!! (DA)
+ if ( d && d->m_redirectionTimer.isActive() )
+ d->m_redirectionTimer.stop();
+
+ // null node activated.
+ emit nodeActivated(Node());
+
+ return true;
+}
+
+DOM::HTMLDocument KHTMLPart::htmlDocument() const
+{
+ if (d->m_doc && d->m_doc->isHTMLDocument())
+ return static_cast<HTMLDocumentImpl*>(d->m_doc);
+ else
+ return static_cast<HTMLDocumentImpl*>(0);
+}
+
+DOM::Document KHTMLPart::document() const
+{
+ return d->m_doc;
+}
+
+
+KParts::BrowserExtension *KHTMLPart::browserExtension() const
+{
+ return d->m_extension;
+}
+
+KHTMLView *KHTMLPart::view() const
+{
+ return d->m_view;
+}
+
+void KHTMLPart::setJScriptEnabled( bool enable )
+{
+ if ( !enable && jScriptEnabled() && d->m_jscript ) {
+ d->m_jscript->clear();
+ }
+ d->m_bJScriptForce = enable;
+ d->m_bJScriptOverride = true;
+}
+
+bool KHTMLPart::jScriptEnabled() const
+{
+ if ( d->m_bJScriptOverride )
+ return d->m_bJScriptForce;
+ return d->m_bJScriptEnabled;
+}
+
+void KHTMLPart::setMetaRefreshEnabled( bool enable )
+{
+ d->m_metaRefreshEnabled = enable;
+}
+
+bool KHTMLPart::metaRefreshEnabled() const
+{
+ return d->m_metaRefreshEnabled;
+}
+
+// Define this to disable dlopening kjs_html, when directly linking to it.
+// You need to edit khtml/Makefile.am to add ./ecma/libkjs_html.la to LIBADD
+// and to edit khtml/ecma/Makefile.am to s/kjs_html/libkjs_html/, remove libkhtml from LIBADD,
+// remove LDFLAGS line, and replace kde_module with either lib (shared) or noinst (static)
+//#define DIRECT_LINKAGE_TO_ECMA
+
+#ifdef DIRECT_LINKAGE_TO_ECMA
+extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
+#endif
+
+KJSProxy *KHTMLPart::jScript()
+{
+ if (!jScriptEnabled()) return 0;
+
+ if ( !d->m_jscript )
+ {
+#ifndef DIRECT_LINKAGE_TO_ECMA
+ KLibrary *lib = KLibLoader::self()->library("kjs_html");
+ if ( !lib ) {
+ setJScriptEnabled( false );
+ return 0;
+ }
+ // look for plain C init function
+ void *sym = lib->symbol("kjs_html_init");
+ if ( !sym ) {
+ lib->unload();
+ setJScriptEnabled( false );
+ return 0;
+ }
+ typedef KJSProxy* (*initFunction)(KHTMLPart *);
+ initFunction initSym = (initFunction) sym;
+ d->m_jscript = (*initSym)(this);
+ d->m_kjs_lib = lib;
+#else
+ d->m_jscript = kjs_html_init(this);
+ // d->m_kjs_lib remains 0L.
+#endif
+ if (d->m_bJScriptDebugEnabled)
+ d->m_jscript->setDebugEnabled(true);
+ }
+
+ return d->m_jscript;
+}
+
+QVariant KHTMLPart::executeScript( const QString &script )
+{
+ return executeScript( DOM::Node(), script );
+}
+
+//Enable this to see all JS scripts being executed
+//#define KJS_VERBOSE
+
+QVariant KHTMLPart::executeScript( const DOM::Node &n, const QString &script )
+{
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "KHTMLPart::executeScript n=" << n.nodeName().string().latin1() << "(" << (n.isNull() ? 0 : n.nodeType()) << ") " << script << endl;
+#endif
+ KJSProxy *proxy = jScript();
+
+ if (!proxy || proxy->paused())
+ return QVariant();
+ d->m_runningScripts++;
+ QVariant ret = proxy->evaluate( QString::null, 0, script, n );
+ d->m_runningScripts--;
+ if (!d->m_runningScripts && d->m_doc && !d->m_doc->parsing() && d->m_submitForm )
+ submitFormAgain();
+ DocumentImpl::updateDocumentsRendering();
+
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "KHTMLPart::executeScript - done" << endl;
+#endif
+ return ret;
+}
+
+bool KHTMLPart::scheduleScript(const DOM::Node &n, const QString& script)
+{
+ //kdDebug(6050) << "KHTMLPart::scheduleScript "<< script << endl;
+
+ d->scheduledScript = script;
+ d->scheduledScriptNode = n;
+
+ return true;
+}
+
+QVariant KHTMLPart::executeScheduledScript()
+{
+ if( d->scheduledScript.isEmpty() )
+ return QVariant();
+
+ //kdDebug(6050) << "executing delayed " << d->scheduledScript << endl;
+
+ QVariant ret = executeScript( d->scheduledScriptNode, d->scheduledScript );
+ d->scheduledScript = QString();
+ d->scheduledScriptNode = DOM::Node();
+
+ return ret;
+}
+
+void KHTMLPart::setJavaEnabled( bool enable )
+{
+ d->m_bJavaForce = enable;
+ d->m_bJavaOverride = true;
+}
+
+bool KHTMLPart::javaEnabled() const
+{
+#ifndef Q_WS_QWS
+ if( d->m_bJavaOverride )
+ return d->m_bJavaForce;
+ return d->m_bJavaEnabled;
+#else
+ return false;
+#endif
+}
+
+KJavaAppletContext *KHTMLPart::javaContext()
+{
+#ifndef Q_WS_QWS
+ return d->m_javaContext;
+#else
+ return 0;
+#endif
+}
+
+KJavaAppletContext *KHTMLPart::createJavaContext()
+{
+#ifndef Q_WS_QWS
+ if ( !d->m_javaContext ) {
+ d->m_javaContext = new KJavaAppletContext();
+ connect( d->m_javaContext, SIGNAL(showStatus(const QString&)),
+ this, SIGNAL(setStatusBarText(const QString&)) );
+ connect( d->m_javaContext, SIGNAL(showDocument(const QString&, const QString&)),
+ this, SLOT(slotShowDocument(const QString&, const QString&)) );
+ }
+
+ return d->m_javaContext;
+#else
+ return 0;
+#endif
+}
+
+void KHTMLPart::setPluginsEnabled( bool enable )
+{
+ d->m_bPluginsForce = enable;
+ d->m_bPluginsOverride = true;
+}
+
+bool KHTMLPart::pluginsEnabled() const
+{
+ if ( d->m_bPluginsOverride )
+ return d->m_bPluginsForce;
+ return d->m_bPluginsEnabled;
+}
+
+void KHTMLPart::slotShowDocument( const QString &url, const QString &target )
+{
+ // this is mostly copied from KHTMLPart::slotChildURLRequest. The better approach
+ // would be to put those functions into a single one.
+ khtml::ChildFrame *child = 0;
+ KParts::URLArgs args;
+ args.frameName = target;
+
+ QString frameName = args.frameName.lower();
+ if ( !frameName.isEmpty() )
+ {
+ if ( frameName == QString::fromLatin1( "_top" ) )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_blank" ) )
+ {
+ emit d->m_extension->createNewWindow( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_parent" ) )
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+
+ emit d->m_extension->openURLRequest( url, newArgs );
+ return;
+ }
+ else if ( frameName != QString::fromLatin1( "_self" ) )
+ {
+ khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
+
+ if ( !_frame )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+
+ child = _frame;
+ }
+ }
+
+ // TODO: handle child target correctly! currently the script are always executed fur the parent
+ if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
+ executeScript( url.right( url.length() - 11) );
+ return;
+ }
+
+ if ( child ) {
+ requestObject( child, KURL(url), args );
+ } else if ( frameName==QString::fromLatin1("_self") ) // this is for embedded objects (via <object>) which want to replace the current document
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+ emit d->m_extension->openURLRequest( KURL(url), newArgs );
+ }
+}
+
+void KHTMLPart::slotDebugDOMTree()
+{
+ if ( d->m_doc && d->m_doc->firstChild() )
+ qDebug("%s", d->m_doc->firstChild()->toHTML().latin1());
+}
+
+void KHTMLPart::slotDebugRenderTree()
+{
+#ifndef NDEBUG
+ if ( d->m_doc )
+ d->m_doc->renderer()->printTree();
+#endif
+}
+
+void KHTMLPart::setAutoloadImages( bool enable )
+{
+ if ( d->m_doc && d->m_doc->docLoader()->autoloadImages() == enable )
+ return;
+
+ if ( d->m_doc )
+ d->m_doc->docLoader()->setAutoloadImages( enable );
+
+ unplugActionList( "loadImages" );
+
+ if ( enable ) {
+ delete d->m_paLoadImages;
+ d->m_paLoadImages = 0;
+ }
+ else if ( !d->m_paLoadImages )
+ d->m_paLoadImages = new KAction( i18n( "Display Images on Page" ), "images_display", 0, this, SLOT( slotLoadImages() ), actionCollection(), "loadImages" );
+
+ if ( d->m_paLoadImages ) {
+ QPtrList<KAction> lst;
+ lst.append( d->m_paLoadImages );
+ plugActionList( "loadImages", lst );
+ }
+}
+
+bool KHTMLPart::autoloadImages() const
+{
+ if ( d->m_doc )
+ return d->m_doc->docLoader()->autoloadImages();
+
+ return true;
+}
+
+void KHTMLPart::clear()
+{
+ kdDebug( 6090 ) << "KHTMLPart::clear() this = " << this << endl;
+ if ( d->m_bCleared )
+ return;
+ d->m_bCleared = true;
+
+ d->m_bClearing = true;
+
+ {
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for(; it != end; ++it )
+ {
+ // Stop HTMLRun jobs for frames
+ if ( (*it).m_run )
+ (*it).m_run->abort();
+ }
+ }
+
+ {
+ QValueList<khtml::ChildFrame>::ConstIterator it = d->m_objects.begin();
+ QValueList<khtml::ChildFrame>::ConstIterator end = d->m_objects.end();
+ for(; it != end; ++it )
+ {
+ // Stop HTMLRun jobs for objects
+ if ( (*it).m_run )
+ (*it).m_run->abort();
+ }
+ }
+
+
+ findTextBegin(); // resets d->m_findNode and d->m_findPos
+
+ d->m_mousePressNode = DOM::Node();
+
+
+ if ( d->m_doc )
+ {
+ kdDebug( 6090 ) << "KHTMLPart::clear(): detaching the document " << d->m_doc << endl;
+ d->m_doc->detach();
+ }
+
+ // Moving past doc so that onUnload works.
+ if ( d->m_jscript )
+ d->m_jscript->clear();
+
+ if ( d->m_view )
+ d->m_view->clear();
+
+ // do not dereference the document before the jscript and view are cleared, as some destructors
+ // might still try to access the document.
+ if ( d->m_doc )
+ {
+ kdDebug( 6090 ) << "KHTMLPart::clear(): dereferencing the document " << d->m_doc << endl;
+ d->m_doc->deref();
+ }
+ d->m_doc = 0;
+
+ delete d->m_decoder;
+
+ d->m_decoder = 0;
+
+ {
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for(; it != end; ++it )
+ {
+ if ( (*it).m_part )
+ {
+ partManager()->removePart( (*it).m_part );
+ delete (KParts::ReadOnlyPart *)(*it).m_part;
+ }
+ }
+ }
+
+ d->m_frames.clear();
+ d->m_objects.clear();
+
+#ifndef Q_WS_QWS
+ delete d->m_javaContext;
+ d->m_javaContext = 0;
+#endif
+
+ d->m_delayRedirect = 0;
+ d->m_redirectURL = QString::null;
+ d->m_bHTTPRefresh = false;
+ d->m_bClearing = false;
+ d->m_frameNameId = 1;
+ d->m_bFirstData = true;
+
+ d->m_bMousePressed = false;
+
+ d->m_selectionStart = DOM::Node();
+ d->m_selectionEnd = DOM::Node();
+ d->m_startOffset = 0;
+ d->m_endOffset = 0;
+#ifndef QT_NO_CLIPBOARD
+ connect( kapp->clipboard(), SIGNAL( selectionChanged()), SLOT( slotClearSelection()));
+#endif
+
+ d->m_totalObjectCount = 0;
+ d->m_loadedObjects = 0;
+ d->m_jobPercent = 0;
+
+ if ( !d->m_haveEncoding )
+ d->m_encoding = QString::null;
+#ifdef SPEED_DEBUG
+ d->m_parsetime.restart();
+#endif
+}
+
+bool KHTMLPart::openFile()
+{
+ return true;
+}
+
+DOM::HTMLDocumentImpl *KHTMLPart::docImpl() const
+{
+ if ( d && d->m_doc && d->m_doc->isHTMLDocument() )
+ return static_cast<HTMLDocumentImpl*>(d->m_doc);
+ return 0;
+}
+
+DOM::DocumentImpl *KHTMLPart::xmlDocImpl() const
+{
+ if ( d )
+ return d->m_doc;
+ return 0;
+}
+
+/*bool KHTMLPart::isSSLInUse() const
+{
+ return d->m_ssl_in_use;
+}*/
+
+void KHTMLPart::slotData( KIO::Job* kio_job, const QByteArray &data )
+{
+ assert ( d->m_job == kio_job );
+
+ //kdDebug( 6050 ) << "slotData: " << data.size() << endl;
+ // The first data ?
+ if ( !d->m_workingURL.isEmpty() )
+ {
+ //kdDebug( 6050 ) << "begin!" << endl;
+
+ begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
+
+ d->m_doc->docLoader()->setReloading(d->m_bReloading);
+ d->m_workingURL = KURL();
+
+ d->m_cacheId = KHTMLPageCache::self()->createCacheEntry();
+
+ // When the first data arrives, the metadata has just been made available
+ d->m_bSecurityInQuestion = false;
+ d->m_ssl_in_use = (d->m_job->queryMetaData("ssl_in_use") == "TRUE");
+ kdDebug(6050) << "SSL in use? " << d->m_job->queryMetaData("ssl_in_use") << endl;
+
+ {
+ KHTMLPart *p = parentPart();
+ if (p && p->d->m_ssl_in_use != d->m_ssl_in_use) {
+ while (p->parentPart()) p = p->parentPart();
+
+ p->d->m_paSecurity->setIcon( "halfencrypted" );
+ p->d->m_bSecurityInQuestion = true;
+ kdDebug(6050) << "parent setIcon half done." << endl;
+ }
+ }
+
+ d->m_paSecurity->setIcon( d->m_ssl_in_use ? "encrypted" : "decrypted" );
+ kdDebug(6050) << "setIcon " << ( d->m_ssl_in_use ? "encrypted" : "decrypted" ) << " done." << endl;
+
+ // Shouldn't all of this be done only if ssl_in_use == true ? (DF)
+
+ d->m_ssl_peer_certificate = d->m_job->queryMetaData("ssl_peer_certificate");
+ d->m_ssl_peer_chain = d->m_job->queryMetaData("ssl_peer_chain");
+ d->m_ssl_peer_ip = d->m_job->queryMetaData("ssl_peer_ip");
+ d->m_ssl_cipher = d->m_job->queryMetaData("ssl_cipher");
+ d->m_ssl_cipher_desc = d->m_job->queryMetaData("ssl_cipher_desc");
+ d->m_ssl_cipher_version = d->m_job->queryMetaData("ssl_cipher_version");
+ d->m_ssl_cipher_used_bits = d->m_job->queryMetaData("ssl_cipher_used_bits");
+ d->m_ssl_cipher_bits = d->m_job->queryMetaData("ssl_cipher_bits");
+ d->m_ssl_cert_state = d->m_job->queryMetaData("ssl_cert_state");
+
+ // Check for charset meta-data
+ QString qData = d->m_job->queryMetaData("charset");
+ if ( !qData.isEmpty() && !d->m_haveEncoding ) // only use information if the user didn't override the settings
+ d->m_encoding = qData;
+
+ // Support for http-refresh
+ qData = d->m_job->queryMetaData("http-refresh");
+ if( !qData.isEmpty() && d->m_metaRefreshEnabled )
+ {
+ kdDebug(6050) << "HTTP Refresh Request: " << qData << endl;
+ int delay;
+ int pos = qData.find( ';' );
+ if ( pos == -1 )
+ pos = qData.find( ',' );
+
+ if( pos == -1 )
+ {
+ delay = qData.stripWhiteSpace().toInt();
+ scheduleRedirection( qData.toInt(), m_url.url());
+ }
+ else
+ {
+ int end_pos = qData.length();
+ delay = qData.left(pos).stripWhiteSpace().toInt();
+ while ( qData[++pos] == ' ' );
+ if ( qData.find( "url", pos, false ) == pos )
+ {
+ pos += 3;
+ while (qData[pos] == ' ' || qData[pos] == '=' )
+ pos++;
+ if ( qData[pos] == '"' )
+ {
+ pos++;
+ int index = end_pos-1;
+ while( index > pos )
+ {
+ if ( qData[index] == '"' )
+ break;
+ index--;
+ }
+ if ( index > pos )
+ end_pos = index;
+ }
+ }
+ scheduleRedirection( delay, d->m_doc->completeURL( qData.mid( pos, end_pos ) ));
+ }
+ d->m_bHTTPRefresh = true;
+ }
+
+ // Support for http last-modified
+ d->m_lastModified = d->m_job->queryMetaData("modified");
+ //kdDebug() << "KHTMLPart::slotData metadata modified: " << d->m_lastModified << endl;
+ }
+
+ KHTMLPageCache::self()->addData(d->m_cacheId, data);
+ write( data.data(), data.size() );
+}
+
+void KHTMLPart::slotRestoreData(const QByteArray &data )
+{
+ // The first data ?
+ if ( !d->m_workingURL.isEmpty() )
+ {
+ long saveCacheId = d->m_cacheId;
+ begin( d->m_workingURL, d->m_extension->urlArgs().xOffset, d->m_extension->urlArgs().yOffset );
+ d->m_cacheId = saveCacheId;
+ d->m_workingURL = KURL();
+ }
+
+ //kdDebug( 6050 ) << "slotRestoreData: " << data.size() << endl;
+ write( data.data(), data.size() );
+
+ if (data.size() == 0)
+ {
+ //kdDebug( 6050 ) << "slotRestoreData: <<end of data>>" << endl;
+ // End of data.
+ if (d->m_doc && d->m_doc->parsing())
+ end(); //will emit completed()
+ }
+}
+
+void KHTMLPart::showError( KIO::Job* job )
+{
+ kdDebug() << "KHTMLPart::showError d->m_bParsing=" << (d->m_doc && d->m_doc->parsing()) << " d->m_bComplete=" << d->m_bComplete
+ << " d->m_bCleared=" << d->m_bCleared << endl;
+
+ if (job->error() == KIO::ERR_NO_CONTENT)
+ return;
+
+ if ( (d->m_doc && d->m_doc->parsing()) || d->m_workingURL.isEmpty() ) // if we got any data already
+ job->showErrorDialog( /*d->m_view*/ );
+ else
+ {
+ htmlError( job->error(), job->errorText(), d->m_workingURL );
+ }
+}
+
+// This is a protected method, placed here because of it's relevance to showError
+void KHTMLPart::htmlError( int errorCode, const QString& text, const KURL& reqUrl )
+{
+ kdDebug(6050) << "KHTMLPart::htmlError errorCode=" << errorCode << " text=" << text << endl;
+ // make sure we're not executing any embedded JS
+ bool bJSFO = d->m_bJScriptForce;
+ bool bJSOO = d->m_bJScriptOverride;
+ d->m_bJScriptForce = false;
+ d->m_bJScriptOverride = true;
+ begin();
+ QString errText = QString::fromLatin1( "<HTML><HEAD><TITLE>" );
+ errText += i18n( "Error while loading %1" ).arg( reqUrl.prettyURL() );
+ errText += QString::fromLatin1( "</TITLE></HEAD><BODY><P>" );
+ errText += i18n( "An error occured while loading <B>%1</B>:" ).arg( reqUrl.prettyURL() );
+ errText += QString::fromLatin1( "</P><P>" );
+ QString kioErrString = KIO::buildErrorString( errorCode, text );
+ // In case the error string has '\n' in it, replace with <BR/>
+ kioErrString.replace( QRegExp("\n"), "<BR/>" );
+ errText += kioErrString;
+ errText += QString::fromLatin1( "</PRE></P></BODY></HTML>" );
+ write(errText);
+ end();
+
+ d->m_bJScriptForce = bJSFO;
+ d->m_bJScriptOverride = bJSOO;
+
+ // make the working url the current url, so that reload works and
+ // emit the progress signals to advance one step in the history
+ // (so that 'back' works)
+ m_url = reqUrl; // same as d->m_workingURL
+ d->m_workingURL = KURL();
+ emit started( 0 );
+ emit completed();
+ return;
+ // following disabled until 3.1
+
+ QString errorName, techName, description;
+ QStringList causes, solutions;
+
+ QByteArray raw = KIO::rawErrorDetail( errorCode, text, &reqUrl );
+ QDataStream stream(raw, IO_ReadOnly);
+
+ stream >> errorName >> techName >> description >> causes >> solutions;
+
+ QString url, protocol, datetime;
+ url = reqUrl.prettyURL();
+ protocol = reqUrl.protocol();
+ datetime = KGlobal::locale()->formatDateTime( QDateTime::currentDateTime(),
+ false );
+
+ QString doc = QString::fromLatin1( "<html><head><title>" );
+ doc += i18n( "Error: " );
+ doc += errorName;
+ doc += QString::fromLatin1( " - %1</title></head><body><h1>" ).arg( url );
+ doc += i18n( "The requested operation could not be completed" );
+ doc += QString::fromLatin1( "</h1><h2>" );
+ doc += errorName;
+ doc += QString::fromLatin1( "</h2>" );
+ if ( techName != QString::null ) {
+ doc += QString::fromLatin1( "<h2>" );
+ doc += i18n( "Technical Reason: " );
+ doc += techName;
+ doc += QString::fromLatin1( "</h2>" );
+ }
+ doc += QString::fromLatin1( "<h3>" );
+ doc += i18n( "Details of the Request:" );
+ doc += QString::fromLatin1( "</h3><ul><li>" );
+ doc += i18n( "URL: %1" ).arg( url );
+ doc += QString::fromLatin1( "</li><li>" );
+ if ( protocol != QString::null ) {
+ // uncomment for 3.1... i18n change
+ // doc += i18n( "Protocol: %1" ).arg( protocol ).arg( protocol );
+ doc += QString::fromLatin1( "</li><li>" );
+ }
+ doc += i18n( "Date and Time: %1" ).arg( datetime );
+ doc += QString::fromLatin1( "</li><li>" );
+ doc += i18n( "Additional Information: %1" ).arg( text );
+ doc += QString::fromLatin1( "</li></ul><h3>" );
+ doc += i18n( "Description:" );
+ doc += QString::fromLatin1( "</h3><p>" );
+ doc += description;
+ doc += QString::fromLatin1( "</p>" );
+ if ( causes.count() ) {
+ doc += QString::fromLatin1( "<h3>" );
+ doc += i18n( "Possible Causes:" );
+ doc += QString::fromLatin1( "</h3><ul><li>" );
+ doc += causes.join( "</li><li>" );
+ doc += QString::fromLatin1( "</li></ul>" );
+ }
+ if ( solutions.count() ) {
+ doc += QString::fromLatin1( "<h3>" );
+ doc += i18n( "Possible Solutions:" );
+ doc += QString::fromLatin1( "</h3><ul><li>" );
+ doc += solutions.join( "</li><li>" );
+ doc += QString::fromLatin1( "</li></ul>" );
+ }
+ doc += QString::fromLatin1( "</body></html>" );
+
+ write( doc );
+ end();
+}
+
+void KHTMLPart::slotFinished( KIO::Job * job )
+{
+ if (job->error())
+ {
+ KHTMLPageCache::self()->cancelEntry(d->m_cacheId);
+ d->m_job = 0L;
+ emit canceled( job->errorString() );
+ // TODO: what else ?
+ checkCompleted();
+ showError( job );
+ return;
+ }
+ //kdDebug( 6050 ) << "slotFinished" << endl;
+
+ KHTMLPageCache::self()->endData(d->m_cacheId);
+
+ if ( d->m_doc && d->m_doc->docLoader()->expireDate() && m_url.protocol().lower().startsWith("http"))
+ KIO::http_update_cache(m_url, false, d->m_doc->docLoader()->expireDate());
+
+ d->m_workingURL = KURL();
+ d->m_job = 0L;
+
+ if (d->m_doc->parsing())
+ end(); //will emit completed()
+}
+
+void KHTMLPart::begin( const KURL &url, int xOffset, int yOffset )
+{
+ clear();
+ d->m_bCleared = false;
+ d->m_cacheId = 0;
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+
+ if(url.isValid()) {
+ QString urlString = url.url();
+ KHTMLFactory::vLinks()->insert( urlString );
+ QString urlString2 = url.prettyURL();
+ if ( urlString != urlString2 ) {
+ KHTMLFactory::vLinks()->insert( urlString2 );
+ }
+ }
+
+ // ###
+ //stopParser();
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ args.xOffset = xOffset;
+ args.yOffset = yOffset;
+ d->m_extension->setURLArgs( args );
+
+ d->m_referrer = url.url();
+ m_url = url;
+ KURL baseurl;
+
+ if ( !m_url.isEmpty() )
+ {
+ KURL::List lst = KURL::split( m_url );
+ if ( !lst.isEmpty() )
+ baseurl = *lst.begin();
+
+ KURL title( baseurl );
+ title.setRef( QString::null );
+ title.setQuery( QString::null );
+ emit setWindowCaption( title.url() );
+ }
+ else
+ emit setWindowCaption( i18n( "no title", "* Unknown *" ) );
+
+ // ### not sure if XHTML documents served as text/xml should use DocumentImpl or HTMLDocumentImpl
+ if (args.serviceType == "text/xml")
+ d->m_doc = DOMImplementationImpl::instance()->createDocument( d->m_view );
+ else
+ d->m_doc = DOMImplementationImpl::instance()->createHTMLDocument( d->m_view );
+
+ d->m_doc->ref();
+ if (!d->m_doc->attached())
+ d->m_doc->attach( );
+ d->m_doc->setURL( m_url.url() );
+ // We prefer m_baseURL over m_url because m_url changes when we are
+ // about to load a new page.
+ d->m_doc->setBaseURL( baseurl.url() );
+ d->m_doc->docLoader()->setShowAnimations( KHTMLFactory::defaultHTMLSettings()->showAnimations() );
+
+ // Inherit domain from parent
+ KHTMLPart* parent = parentPart();
+ if (d->m_doc->isHTMLDocument() && parent && parent->d->m_doc && parent->d->m_doc->isHTMLDocument()) {
+ DOMString domain = static_cast<HTMLDocumentImpl*>(parent->d->m_doc)->domain();
+ kdDebug() << "KHTMLPart::begin setting frame domain to " << domain.string() << endl;
+ static_cast<HTMLDocumentImpl*>(d->m_doc)->setDomain( domain, true );
+ }
+
+ d->m_paUseStylesheet->setItems(QStringList());
+ d->m_paUseStylesheet->setEnabled( false );
+
+ setAutoloadImages( KHTMLFactory::defaultHTMLSettings()->autoLoadImages() );
+ QString userStyleSheet = KHTMLFactory::defaultHTMLSettings()->userStyleSheet();
+ if ( !userStyleSheet.isEmpty() )
+ setUserStyleSheet( KURL( userStyleSheet ) );
+
+ d->m_doc->setRestoreState(args.docState);
+ d->m_doc->open();
+ // clear widget
+ d->m_view->resizeContents( 0, 0 );
+ connect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
+
+ emit d->m_extension->enableAction( "print", true );
+
+ d->m_doc->setParsing(true);
+}
+
+void KHTMLPart::write( const char *str, int len )
+{
+ if ( !d->m_decoder ) {
+ d->m_decoder = new khtml::Decoder();
+ if(d->m_encoding != QString::null)
+ d->m_decoder->setEncoding(d->m_encoding.latin1(), d->m_haveEncoding);
+ else
+ d->m_decoder->setEncoding(settings()->encoding().latin1(), d->m_haveEncoding);
+ }
+ if ( len == 0 )
+ return;
+
+ if ( len == -1 )
+ len = strlen( str );
+
+ QString decoded = d->m_decoder->decode( str, len );
+
+ if(decoded.isEmpty()) return;
+
+ if(d->m_bFirstData) {
+ // determine the parse mode
+ d->m_doc->determineParseMode( decoded );
+ d->m_bFirstData = false;
+
+ //kdDebug(6050) << "KHTMLPart::write haveEnc = " << d->m_haveEncoding << endl;
+ // ### this is still quite hacky, but should work a lot better than the old solution
+ if(d->m_decoder->visuallyOrdered()) d->m_doc->setVisuallyOrdered();
+ d->m_doc->recalcStyle( NodeImpl::Force );
+ }
+
+ if (jScript())
+ jScript()->appendSourceFile(m_url.url(),decoded);
+ Tokenizer* t = d->m_doc->tokenizer();
+ if(t)
+ t->write( decoded, true );
+}
+
+void KHTMLPart::write( const QString &str )
+{
+ if ( str.isNull() )
+ return;
+
+ if(d->m_bFirstData) {
+ // determine the parse mode
+ d->m_doc->setParseMode( DocumentImpl::Strict );
+ d->m_bFirstData = false;
+ }
+ if (jScript())
+ jScript()->appendSourceFile(m_url.url(),str);
+ Tokenizer* t = d->m_doc->tokenizer();
+ if(t)
+ t->write( str, true );
+}
+
+void KHTMLPart::end()
+{
+ // make sure nothing's left in there...
+ if(d->m_decoder)
+ write(d->m_decoder->flush());
+ if (d->m_doc)
+ d->m_doc->finishParsing();
+}
+
+void KHTMLPart::paint(QPainter *p, const QRect &rc, int yOff, bool *more)
+{
+ if (!d->m_view) return;
+ d->m_view->paint(p, rc, yOff, more);
+}
+
+void KHTMLPart::stopAnimations()
+{
+ if ( d->m_doc )
+ d->m_doc->docLoader()->setShowAnimations( KHTMLSettings::KAnimationDisabled );
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
+ KParts::ReadOnlyPart* p = ( *it ).m_part;
+ static_cast<KHTMLPart*>( p )->stopAnimations();
+ }
+}
+
+void KHTMLPart::slotFinishedParsing()
+{
+ d->m_doc->setParsing(false);
+ checkEmitLoadEvent();
+ disconnect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
+
+ if (!d->m_view)
+ return; // We are probably being destructed.
+ // check if the scrollbars are really needed for the content
+ // if not, remove them, relayout, and repaint
+
+ d->m_view->restoreScrollBar();
+
+ if ( !m_url.encodedHtmlRef().isEmpty() )
+ if ( !gotoAnchor( m_url.encodedHtmlRef()) )
+ gotoAnchor( m_url.htmlRef() );
+
+ checkCompleted();
+}
+
+void KHTMLPart::slotLoaderRequestStarted( khtml::DocLoader* dl, khtml::CachedObject *obj )
+{
+ if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
+ KHTMLPart* p = this;
+ while ( p ) {
+ KHTMLPart* op = p;
+ p->d->m_totalObjectCount++;
+ p = p->parentPart();
+ if ( !p && d->m_loadedObjects <= d->m_totalObjectCount )
+ QTimer::singleShot( 200, op, SLOT( slotProgressUpdate() ) );
+ }
+ }
+}
+
+void KHTMLPart::slotLoaderRequestDone( khtml::DocLoader* dl, khtml::CachedObject *obj )
+{
+ if ( obj && obj->type() == khtml::CachedObject::Image && d->m_doc && d->m_doc->docLoader() == dl ) {
+ KHTMLPart* p = this;
+ while ( p ) {
+ KHTMLPart* op = p;
+ p->d->m_loadedObjects++;
+ p = p->parentPart();
+ if ( !p && d->m_loadedObjects <= d->m_totalObjectCount && d->m_jobPercent >= 100 )
+ QTimer::singleShot( 200, op, SLOT( slotProgressUpdate() ) );
+ }
+ }
+
+ checkCompleted();
+}
+
+void KHTMLPart::slotProgressUpdate()
+{
+ int percent;
+ if ( d->m_loadedObjects < d->m_totalObjectCount )
+ percent = d->m_jobPercent / 4 + ( d->m_loadedObjects*300 ) / ( 4*d->m_totalObjectCount );
+ else
+ percent = d->m_jobPercent;
+
+ if ( d->m_loadedObjects < d->m_totalObjectCount && percent >= 75 )
+ emit d->m_extension->infoMessage( i18n( "%1 of 1 Image loaded", "%1 of %n Images loaded", d->m_totalObjectCount ).arg( d->m_loadedObjects ) );
+
+ emit d->m_extension->loadingProgress( percent );
+}
+
+void KHTMLPart::slotJobSpeed( KIO::Job* /*job*/, unsigned long speed )
+{
+ emit d->m_extension->speedProgress( speed );
+}
+
+void KHTMLPart::slotJobPercent( KIO::Job* /*job*/, unsigned long percent )
+{
+ d->m_jobPercent = percent;
+
+ if ( !parentPart() )
+ QTimer::singleShot( 0, this, SLOT( slotProgressUpdate() ) );
+}
+
+void KHTMLPart::checkCompleted()
+{
+// kdDebug( 6050 ) << "KHTMLPart::checkCompleted() parsing: " << d->m_doc->parsing() << endl;
+// kdDebug( 6050 ) << " complete: " << d->m_bComplete << endl;
+
+ // restore the cursor position
+ if (d->m_doc && !d->m_doc->parsing() && !d->m_focusNodeRestored)
+ {
+ if (d->m_focusNodeNumber >= 0)
+ d->m_doc->setFocusNode(d->m_doc->nodeWithAbsIndex(d->m_focusNodeNumber));
+ else
+ d->m_doc->setFocusNode(0);
+ d->m_focusNodeRestored = true;
+ }
+
+ // Any frame that hasn't completed yet ?
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !(*it).m_bCompleted )
+ return;
+
+ // Are we still parsing - or have we done the completed stuff already ?
+ if ( d->m_bComplete || (d->m_doc && d->m_doc->parsing()) )
+ return;
+
+ // Still waiting for images/scripts from the loader ?
+ int requests = 0;
+ if ( d->m_doc && d->m_doc->docLoader() )
+ requests = khtml::Cache::loader()->numRequests( d->m_doc->docLoader() );
+
+ if ( requests > 0 )
+ return;
+
+ // OK, completed.
+ // Now do what should be done when we are really completed.
+ d->m_bComplete = true;
+
+ checkEmitLoadEvent(); // if we didn't do it before
+
+ // check that the view has not been moved by the user
+ if ( m_url.encodedHtmlRef().isEmpty() && d->m_view->contentsY() == 0 )
+ d->m_view->setContentsPos( d->m_extension->urlArgs().xOffset,
+ d->m_extension->urlArgs().yOffset );
+
+ d->m_view->complete();
+
+ if ( !d->m_redirectURL.isEmpty() )
+ {
+ // Do not start redirection for frames here! That action is
+ // deferred until the parent emits a completed signal.
+ if ( parentPart() == 0 )
+ d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
+
+ emit completed( true );
+ }
+ else
+ {
+ if ( d->m_bPendingChildRedirection )
+ emit completed ( true );
+ else
+ emit completed();
+ }
+
+ // find the alternate stylesheets
+ QStringList sheets;
+ if (d->m_doc)
+ sheets = d->m_doc->availableStyleSheets();
+ d->m_paUseStylesheet->setItems( sheets );
+ d->m_paUseStylesheet->setEnabled( !sheets.isEmpty() );
+ if (!sheets.isEmpty())
+ d->m_paUseStylesheet->setCurrentItem(kMax(sheets.findIndex(d->m_sheetUsed), 0));
+
+ if (!parentPart())
+ emit setStatusBarText(i18n("Done."));
+
+#ifdef SPEED_DEBUG
+ kdDebug(6050) << "DONE: " <<d->m_parsetime.elapsed() << endl;
+#endif
+}
+
+void KHTMLPart::checkEmitLoadEvent()
+{
+ if ( d->m_bLoadEventEmitted || !d->m_doc || d->m_doc->parsing() ) return;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !(*it).m_bCompleted ) // still got a frame running -> too early
+ return;
+
+ d->m_bLoadEventEmitted = true;
+ if (d->m_doc)
+ d->m_doc->close();
+}
+
+const KHTMLSettings *KHTMLPart::settings() const
+{
+ return d->m_settings;
+}
+
+#ifndef KDE_NO_COMPAT
+KURL KHTMLPart::baseURL() const
+{
+ if ( !d->m_doc ) return KURL();
+
+ return d->m_doc->baseURL();
+}
+
+QString KHTMLPart::baseTarget() const
+{
+ if ( !d->m_doc ) return QString::null;
+
+ return d->m_doc->baseTarget();
+}
+#endif
+
+KURL KHTMLPart::completeURL( const QString &url )
+{
+ if ( !d->m_doc ) return url;
+
+ if (d->m_decoder)
+ return KURL(d->m_doc->completeURL(url), d->m_decoder->codec()->mibEnum());
+
+ return KURL( d->m_doc->completeURL( url ) );
+}
+
+// ### implement lockhistory being optional (sometimes javascript wants
+// to do redirection that end up in the history!)
+void KHTMLPart::scheduleRedirection( int delay, const QString &url, bool /* doLockHistory*/ )
+{
+ //kdDebug(6050) << "KHTMLPart::scheduleRedirection delay=" << delay << " url=" << url << endl;
+ if( d->m_redirectURL.isEmpty() || delay < d->m_delayRedirect )
+ {
+ d->m_delayRedirect = delay;
+ d->m_redirectURL = url;
+ if ( d->m_bComplete ) {
+ d->m_redirectionTimer.stop();
+ d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
+ }
+ }
+}
+
+void KHTMLPart::slotRedirect()
+{
+ QString u = d->m_redirectURL;
+ d->m_delayRedirect = 0;
+ d->m_redirectURL = QString::null;
+ if ( u.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
+ {
+ QString script = KURL::decode_string( u.right( u.length() - 11 ) );
+ //kdDebug( 6050 ) << "KHTMLPart::slotRedirect script=" << script << endl;
+ QVariant res = executeScript( script );
+ if ( res.type() == QVariant::String ) {
+ begin( url() );
+ write( res.asString() );
+ end();
+ }
+ return;
+ }
+ KParts::URLArgs args;
+ if ( urlcmp( u, m_url.url(), true, true ) )
+ args.reload = true;
+
+ args.setLockHistory( true );
+ urlSelected( u, 0, 0, QString::null, args );
+}
+
+void KHTMLPart::slotRedirection(KIO::Job*, const KURL& url)
+{
+ // the slave told us that we got redirected
+ // kdDebug( 6050 ) << "redirection by KIO to " << url.url() << endl;
+ emit d->m_extension->setLocationBarURL( url.prettyURL() );
+ d->m_workingURL = url;
+}
+
+bool KHTMLPart::setEncoding( const QString &name, bool override )
+{
+ d->m_encoding = name;
+ d->m_haveEncoding = override;
+
+ if( !m_url.isEmpty() ) {
+ // reload document
+ closeURL();
+ KURL url = m_url;
+ m_url = 0;
+ openURL(url);
+ }
+
+ return true;
+}
+
+QString KHTMLPart::encoding() const
+{
+ if(d->m_haveEncoding && !d->m_encoding.isEmpty())
+ return d->m_encoding;
+
+ if(d->m_decoder && d->m_decoder->encoding())
+ return QString(d->m_decoder->encoding());
+
+ return(settings()->encoding());
+}
+
+void KHTMLPart::setUserStyleSheet(const KURL &url)
+{
+ if ( d->m_doc && d->m_doc->docLoader() )
+ (void) new khtml::PartStyleSheetLoader(this, url.url(), d->m_doc->docLoader());
+}
+
+void KHTMLPart::setUserStyleSheet(const QString &styleSheet)
+{
+ if ( d->m_doc )
+ d->m_doc->setUserStyleSheet( styleSheet );
+}
+
+bool KHTMLPart::gotoAnchor( const QString &name )
+{
+ if (!d->m_doc)
+ return false;
+
+ HTMLCollectionImpl *anchors =
+ new HTMLCollectionImpl( d->m_doc, HTMLCollectionImpl::DOC_ANCHORS);
+ anchors->ref();
+ NodeImpl *n = anchors->namedItem(name);
+ anchors->deref();
+
+ if(!n) {
+ kdDebug(6050) << "KHTMLPart::gotoAnchor node '" << name << "' not found" << endl;
+ return false;
+ }
+
+ int x = 0, y = 0;
+ HTMLElementImpl *a = static_cast<HTMLElementImpl *>(n);
+ a->getUpperLeftCorner(x, y);
+ d->m_view->setContentsPos(x-50, y-50);
+
+ return true;
+}
+
+void KHTMLPart::setStandardFont( const QString &name )
+{
+ d->m_settings->setStdFontName(name);
+}
+
+void KHTMLPart::setFixedFont( const QString &name )
+{
+ d->m_settings->setFixedFontName(name);
+}
+
+void KHTMLPart::setURLCursor( const QCursor &c )
+{
+ d->m_linkCursor = c;
+}
+
+QCursor KHTMLPart::urlCursor() const
+{
+ return d->m_linkCursor;
+}
+
+bool KHTMLPart::onlyLocalReferences() const
+{
+ return d->m_onlyLocalReferences;
+}
+
+void KHTMLPart::setOnlyLocalReferences(bool enable)
+{
+ d->m_onlyLocalReferences = enable;
+}
+
+void KHTMLPart::findTextBegin()
+{
+ d->m_findPos = -1;
+ d->m_findNode = 0;
+}
+
+bool KHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive, bool isRegExp )
+{
+ if ( !d->m_doc )
+ return false;
+
+ if(!d->m_findNode) {
+ if (d->m_doc->isHTMLDocument())
+ d->m_findNode = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
+ else
+ d->m_findNode = d->m_doc;
+ }
+
+ if ( !d->m_findNode )
+ {
+ kdDebug() << "KHTMLPart::findTextNext no findNode -> return false" << endl;
+ return false;
+ }
+ if ( d->m_findNode->id() == ID_FRAMESET )
+ {
+ kdDebug() << "KHTMLPart::findTextNext FRAMESET -> return false" << endl;
+ return false;
+ }
+
+ while(1)
+ {
+ if( (d->m_findNode->nodeType() == Node::TEXT_NODE || d->m_findNode->nodeType() == Node::CDATA_SECTION_NODE) && d->m_findNode->renderer() )
+ {
+ DOMString nodeText = d->m_findNode->nodeValue();
+ DOMStringImpl *t = nodeText.implementation();
+ QConstString s(t->s, t->l);
+
+ int matchLen = 0;
+ if ( isRegExp ) {
+ QRegExp matcher( str );
+ matcher.setCaseSensitive( caseSensitive );
+ d->m_findPos = matcher.search(s.string(), d->m_findPos+1);
+ if ( d->m_findPos != -1 )
+ matchLen = matcher.matchedLength();
+ }
+ else {
+ d->m_findPos = s.string().find(str, d->m_findPos+1, caseSensitive);
+ matchLen = str.length();
+ }
+
+ if(d->m_findPos != -1)
+ {
+ int x = 0, y = 0;
+ static_cast<khtml::RenderText *>(d->m_findNode->renderer())
+ ->posOfChar(d->m_findPos, x, y);
+ d->m_view->setContentsPos(x-50, y-50);
+
+ d->m_selectionStart = d->m_findNode;
+ d->m_startOffset = d->m_findPos;
+ d->m_selectionEnd = d->m_findNode;
+ d->m_endOffset = d->m_findPos + matchLen;
+ d->m_startBeforeEnd = true;
+
+ d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
+ d->m_selectionEnd.handle(), d->m_endOffset );
+ emitSelectionChanged();
+ return true;
+ }
+ }
+ d->m_findPos = -1;
+
+ NodeImpl *next;
+
+ if ( forward )
+ {
+ next = d->m_findNode->firstChild();
+
+ if(!next) next = d->m_findNode->nextSibling();
+ while(d->m_findNode && !next) {
+ d->m_findNode = d->m_findNode->parentNode();
+ if( d->m_findNode ) {
+ next = d->m_findNode->nextSibling();
+ }
+ }
+ }
+ else
+ {
+ next = d->m_findNode->lastChild();
+
+ if (!next ) next = d->m_findNode->previousSibling();
+ while ( d->m_findNode && !next )
+ {
+ d->m_findNode = d->m_findNode->parentNode();
+ if( d->m_findNode )
+ {
+ next = d->m_findNode->previousSibling();
+ }
+ }
+ }
+
+ d->m_findNode = next;
+ if(!d->m_findNode) return false;
+ }
+}
+
+QString KHTMLPart::selectedText() const
+{
+ QString text;
+ DOM::Node n = d->m_selectionStart;
+ while(!n.isNull()) {
+ if(n.nodeType() == DOM::Node::TEXT_NODE) {
+ QString str = n.nodeValue().string();
+ if(n == d->m_selectionStart && n == d->m_selectionEnd)
+ text = str.mid(d->m_startOffset, d->m_endOffset - d->m_startOffset);
+ else if(n == d->m_selectionStart)
+ text = str.mid(d->m_startOffset);
+ else if(n == d->m_selectionEnd)
+ text += str.left(d->m_endOffset);
+ else
+ text += str;
+ }
+ else {
+ // This is our simple HTML -> ASCII transformation:
+ unsigned short id = n.elementId();
+ switch(id) {
+ case ID_TD:
+ case ID_TH:
+ case ID_BR:
+ case ID_HR:
+ case ID_OL:
+ case ID_UL:
+ case ID_LI:
+ case ID_DD:
+ case ID_DL:
+ case ID_DT:
+ case ID_PRE:
+ case ID_BLOCKQUOTE:
+ text += "\n";
+ break;
+ case ID_P:
+ case ID_TR:
+ case ID_H1:
+ case ID_H2:
+ case ID_H3:
+ case ID_H4:
+ case ID_H5:
+ case ID_H6:
+ text += "\n\n";
+ break;
+ }
+ }
+ if(n == d->m_selectionEnd) break;
+ DOM::Node next = n.firstChild();
+ if(next.isNull()) next = n.nextSibling();
+ while( next.isNull() && !n.parentNode().isNull() ) {
+ n = n.parentNode();
+ next = n.nextSibling();
+ }
+
+ n = next;
+ }
+ return text;
+}
+
+bool KHTMLPart::hasSelection() const
+{
+ return ( !d->m_selectionStart.isNull() &&
+ !d->m_selectionEnd.isNull() );
+}
+
+DOM::Range KHTMLPart::selection() const
+{
+ DOM::Range r = document().createRange();DOM::Range();
+ r.setStart( d->m_selectionStart, d->m_startOffset );
+ r.setEnd( d->m_selectionEnd, d->m_endOffset );
+ return r;
+}
+
+
+void KHTMLPart::setSelection( const DOM::Range &r )
+{
+ d->m_selectionStart = r.startContainer();
+ d->m_startOffset = r.startOffset();
+ d->m_selectionEnd = r.endContainer();
+ d->m_endOffset = r.endOffset();
+ d->m_doc->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
+ d->m_selectionEnd.handle(),d->m_endOffset);
+}
+
+void KHTMLPart::slotClearSelection()
+{
+ d->m_selectionStart = 0;
+ d->m_startOffset = 0;
+ d->m_selectionEnd = 0;
+ d->m_endOffset = 0;
+ if ( d->m_doc ) d->m_doc->clearSelection();
+ emitSelectionChanged();
+}
+
+void KHTMLPart::overURL( const QString &url, const QString &target, bool shiftPressed )
+{
+ if ( !d->m_kjsStatusBarText.isEmpty() && !shiftPressed ) {
+ emit onURL( url );
+ emit setStatusBarText( d->m_kjsStatusBarText );
+ d->m_kjsStatusBarText = QString::null;
+ return;
+ }
+
+ emit onURL( url );
+
+ if ( url.isEmpty() )
+ {
+ emit setStatusBarText(url);
+ return;
+ }
+
+ if (url.find( QString::fromLatin1( "javascript:" ),0, false ) != -1 )
+ {
+ emit setStatusBarText( url.mid( url.find( "javascript:", 0, false ) ) );
+ return;
+ }
+
+ KURL u = completeURL(url);
+
+ // special case for <a href="">
+ if ( url.isEmpty() )
+ u.setFileName( url );
+
+ QString com;
+
+ KMimeType::Ptr typ = KMimeType::findByURL( u );
+
+ if ( typ )
+ com = typ->comment( u, false );
+
+ if ( u.isMalformed() )
+ {
+ emit setStatusBarText(u.prettyURL());
+ return;
+ }
+
+ if ( u.isLocalFile() )
+ {
+ // TODO : use KIO::stat() and create a KFileItem out of its result,
+ // to use KFileItem::statusBarText()
+ QCString path = QFile::encodeName( u.path() );
+
+ struct stat buff;
+ bool ok = !stat( path.data(), &buff );
+
+ struct stat lbuff;
+ if (ok) ok = !lstat( path.data(), &lbuff );
+
+ QString text = u.url();
+ QString text2 = text;
+
+ if (ok && S_ISLNK( lbuff.st_mode ) )
+ {
+ QString tmp;
+ if ( com.isNull() )
+ tmp = i18n( "Symbolic Link");
+ else
+ tmp = i18n("%1 (Link)").arg(com);
+ char buff_two[1024];
+ text += " -> ";
+ int n = readlink ( path.data(), buff_two, 1022);
+ if (n == -1)
+ {
+ text2 += " ";
+ text2 += tmp;
+ emit setStatusBarText(text2);
+ return;
+ }
+ buff_two[n] = 0;
+
+ text += buff_two;
+ text += " ";
+ text += tmp;
+ }
+ else if ( ok && S_ISREG( buff.st_mode ) )
+ {
+ if (buff.st_size < 1024)
+ text = i18n("%2 (%1 bytes)").arg((long) buff.st_size).arg(text2); // always put the URL last, in case it contains '%'
+ else
+ {
+ float d = (float) buff.st_size/1024.0;
+ text = i18n("%1 (%2 K)").arg(text2).arg(KGlobal::locale()->formatNumber(d, 2)); // was %.2f
+ }
+ text += " ";
+ text += com;
+ }
+ else if ( ok && S_ISDIR( buff.st_mode ) )
+ {
+ text += " ";
+ text += com;
+ }
+ else
+ {
+ text += " ";
+ text += com;
+ }
+ emit setStatusBarText(text);
+ }
+ else
+ {
+ QString extra;
+ if (target == QString::fromLatin1("_blank"))
+ {
+ extra = i18n(" (In new window)");
+ }
+ else if (!target.isEmpty() &&
+ (target != QString::fromLatin1("_top")) &&
+ (target != QString::fromLatin1("_self")) &&
+ (target != QString::fromLatin1("_parent")))
+ {
+ extra = i18n(" (In other frame)");
+ }
+
+ if (u.protocol() == QString::fromLatin1("mailto")) {
+ QString mailtoMsg/* = QString::fromLatin1("<img src=%1>").arg(locate("icon", QString::fromLatin1("locolor/16x16/actions/mail_send.png")))*/;
+ mailtoMsg += i18n("Email to: ") + KURL::decode_string(u.path());
+ QStringList queries = QStringList::split('&', u.query().mid(1));
+ for (QStringList::Iterator it = queries.begin(); it != queries.end(); ++it)
+ if ((*it).startsWith(QString::fromLatin1("subject=")))
+ mailtoMsg += i18n(" - Subject: ") + KURL::decode_string((*it).mid(8));
+ else if ((*it).startsWith(QString::fromLatin1("cc=")))
+ mailtoMsg += i18n(" - CC: ") + KURL::decode_string((*it).mid(3));
+ else if ((*it).startsWith(QString::fromLatin1("bcc=")))
+ mailtoMsg += i18n(" - BCC: ") + KURL::decode_string((*it).mid(4));
+ emit setStatusBarText(mailtoMsg);
+ return;
+ }
+ // Is this check neccessary at all? (Frerich)
+#if 0
+ else if (u.protocol() == QString::fromLatin1("http")) {
+ DOM::Node hrefNode = nodeUnderMouse().parentNode();
+ while (hrefNode.nodeName().string() != QString::fromLatin1("A") && !hrefNode.isNull())
+ hrefNode = hrefNode.parentNode();
+
+ if (!hrefNode.isNull()) {
+ DOM::Node hreflangNode = hrefNode.attributes().getNamedItem("HREFLANG");
+ if (!hreflangNode.isNull()) {
+ QString countryCode = hreflangNode.nodeValue().string().lower();
+ // Map the language code to an appropriate country code.
+ if (countryCode == QString::fromLatin1("en"))
+ countryCode = QString::fromLatin1("gb");
+ QString flagImg = QString::fromLatin1("<img src=%1>").arg(
+ locate("locale", QString::fromLatin1("l10n/")
+ + countryCode
+ + QString::fromLatin1("/flag.png")));
+ emit setStatusBarText(flagImg + u.prettyURL() + extra);
+ }
+ }
+ }
+#endif
+ emit setStatusBarText(u.prettyURL() + extra);
+ }
+}
+
+void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target,
+ KParts::URLArgs args )
+{
+ bool hasTarget = false;
+
+ QString target = _target;
+ if ( target.isEmpty() && d->m_doc )
+ target = d->m_doc->baseTarget();
+ if ( !target.isEmpty() )
+ hasTarget = true;
+
+ if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
+ {
+ executeScript( url.right( url.length() - 11) );
+ return;
+ }
+
+ KURL cURL = completeURL(url);
+ // special case for <a href="">
+ if ( url.isEmpty() )
+ cURL.setFileName( url );
+
+ if ( !cURL.isValid() )
+ // ### ERROR HANDLING
+ return;
+
+ //kdDebug( 6000 ) << "urlSelected: complete URL:" << cURL.url() << " target = " << target << endl;
+
+ if ( button == LeftButton && ( state & ShiftButton ) )
+ {
+ KIO::MetaData metaData;
+ metaData["referrer"] = d->m_referrer;
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As..." ), cURL, metaData );
+ return;
+ }
+
+ if (!checkLinkSecurity(cURL,
+ i18n( "<qt>The link <B>%1</B><BR>leads from this untrusted page to your local filesystem.<BR>Do you want to follow the link?" ),
+ i18n( "Follow" )))
+ return;
+
+ args.frameName = target;
+
+ // For http-refresh, force the io-slave to re-get the page
+ // as needed instead of loading from cache. NOTE: I would
+ // have done a "verify" instead, but I am not sure that servers
+ // will include the correct response (specfically "Refresh:") on
+ // a "HEAD" request which is what a "verify" setting results in.(DA)
+ if ( d->m_bHTTPRefresh )
+ {
+ d->m_bHTTPRefresh = false;
+ args.metaData()["cache"]="reload"; //"verify";
+ }
+
+ args.metaData().insert("main_frame_request",
+ parentPart() == 0 ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_activate_warnings", "TRUE");
+
+ if ( hasTarget )
+ {
+ // unknown frame names should open in a new window.
+ khtml::ChildFrame *frame = recursiveFrameRequest( cURL, args, false );
+ if ( frame )
+ {
+ args.metaData()["referrer"] = d->m_referrer;
+ requestObject( frame, cURL, args );
+ return;
+ }
+ }
+
+ if ( !d->m_bComplete && !hasTarget )
+ closeURL();
+
+ if (!d->m_referrer.isEmpty())
+ args.metaData()["referrer"] = d->m_referrer;
+
+ if ( button == MidButton && (state & ShiftButton) )
+ {
+ KParts::WindowArgs winArgs;
+ winArgs.lowerWindow = true;
+ KParts::ReadOnlyPart *newPart = 0;
+ emit d->m_extension->createNewWindow( cURL, args, winArgs, newPart );
+ return;
+ }
+ emit d->m_extension->openURLRequest( cURL, args );
+}
+
+void KHTMLPart::slotViewDocumentSource()
+{
+ KURL url(m_url);
+ if (!(url.isLocalFile()) && KHTMLPageCache::self()->isValid(d->m_cacheId))
+ {
+ KTempFile sourceFile(QString::null, QString::fromLatin1(".html"));
+ if (sourceFile.status() == 0)
+ {
+ KHTMLPageCache::self()->saveData(d->m_cacheId, sourceFile.dataStream());
+ url = KURL();
+ url.setPath(sourceFile.name());
+ }
+ }
+
+ // emit d->m_extension->openURLRequest( m_url, KParts::URLArgs( false, 0, 0, QString::fromLatin1( "text/plain" ) ) );
+ (void) KRun::runURL( url, QString::fromLatin1("text/plain") );
+}
+
+void KHTMLPart::slotViewFrameSource()
+{
+ KParts::ReadOnlyPart *frame = currentFrame();
+ if ( !frame )
+ return;
+
+ KURL url = frame->url();
+ if (!(url.isLocalFile()) && frame->inherits("KHTMLPart"))
+ {
+ long cacheId = static_cast<KHTMLPart *>(frame)->d->m_cacheId;
+
+ if (KHTMLPageCache::self()->isValid(cacheId))
+ {
+ KTempFile sourceFile(QString::null, QString::fromLatin1(".html"));
+ if (sourceFile.status() == 0)
+ {
+ KHTMLPageCache::self()->saveData(cacheId, sourceFile.dataStream());
+ url = KURL();
+ url.setPath(sourceFile.name());
+ }
+ }
+ }
+
+ (void) KRun::runURL( url, QString::fromLatin1("text/plain") );
+}
+
+KURL KHTMLPart::backgroundURL() const
+{
+ // ### what about XML documents? get from CSS?
+ if (!d->m_doc || !d->m_doc->isHTMLDocument())
+ return KURL();
+
+ QString relURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
+
+ return KURL( m_url, relURL );
+}
+
+void KHTMLPart::slotSaveBackground()
+{
+ KIO::MetaData metaData;
+ metaData["referrer"] = d->m_referrer;
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n("Save background image as"), backgroundURL(), metaData );
+}
+
+void KHTMLPart::slotSaveDocument()
+{
+ KURL srcURL( m_url );
+
+ if ( srcURL.fileName(false).isEmpty() )
+ srcURL.setFileName( "index.html" );
+
+ KIO::MetaData metaData;
+ // Referre unknown?
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, i18n("*.html *.htm|HTML files"), d->m_cacheId );
+}
+
+void KHTMLPart::slotSecurity()
+{
+// kdDebug( 6050 ) << "Meta Data:" << endl
+// << d->m_ssl_peer_cert_subject
+// << endl
+// << d->m_ssl_peer_cert_issuer
+// << endl
+// << d->m_ssl_cipher
+// << endl
+// << d->m_ssl_cipher_desc
+// << endl
+// << d->m_ssl_cipher_version
+// << endl
+// << d->m_ssl_good_from
+// << endl
+// << d->m_ssl_good_until
+// << endl
+// << d->m_ssl_cert_state
+// << endl;
+
+ KSSLInfoDlg *kid = new KSSLInfoDlg(d->m_ssl_in_use, widget(), "kssl_info_dlg", true );
+
+ if (d->m_bSecurityInQuestion)
+ kid->setSecurityInQuestion(true);
+
+ if (d->m_ssl_in_use) {
+ KSSLCertificate *x = KSSLCertificate::fromString(d->m_ssl_peer_certificate.local8Bit());
+ if (x) {
+ // Set the chain back onto the certificate
+ QStringList cl = QStringList::split(QString("\n"), d->m_ssl_peer_chain);
+ QPtrList<KSSLCertificate> ncl;
+
+ ncl.setAutoDelete(true);
+ for (QStringList::Iterator it = cl.begin(); it != cl.end(); ++it) {
+ KSSLCertificate *y = KSSLCertificate::fromString((*it).local8Bit());
+ if (y) ncl.append(y);
+ }
+
+ if (ncl.count() > 0)
+ x->chain().setChain(ncl);
+
+ kid->setup(x,
+ d->m_ssl_peer_ip,
+ m_url.url(),
+ d->m_ssl_cipher,
+ d->m_ssl_cipher_desc,
+ d->m_ssl_cipher_version,
+ d->m_ssl_cipher_used_bits.toInt(),
+ d->m_ssl_cipher_bits.toInt(),
+ (KSSLCertificate::KSSLValidation) d->m_ssl_cert_state.toInt()
+ );
+ kid->exec();
+ delete x;
+ } else kid->exec();
+ } else kid->exec();
+}
+
+void KHTMLPart::slotSaveFrame()
+{
+ if ( !d->m_activeFrame )
+ return; // should never be the case, but one never knows :-)
+
+ KURL srcURL( static_cast<KParts::ReadOnlyPart *>( d->m_activeFrame )->url() );
+
+ if ( srcURL.fileName(false).isEmpty() )
+ srcURL.setFileName( "index.html" );
+
+ KIO::MetaData metaData;
+ // Referrer unknown?
+ KHTMLPopupGUIClient::saveURL( d->m_view, i18n( "Save As" ), srcURL, metaData, i18n("*.html *.htm|HTML files") );
+}
+
+void KHTMLPart::slotSetEncoding()
+{
+ // first Item is always auto
+ if(d->m_paSetEncoding->currentItem() == 0)
+ setEncoding(QString::null, false);
+ else {
+ // strip of the language to get the raw encoding again.
+ QString enc = KGlobal::charsets()->encodingForName(d->m_paSetEncoding->currentText());
+ setEncoding(enc, true);
+ }
+}
+
+void KHTMLPart::slotUseStylesheet()
+{
+ if (d->m_doc && d->m_paUseStylesheet->currentText() != d->m_sheetUsed) {
+ d->m_sheetUsed = d->m_paUseStylesheet->currentText();
+ d->m_doc->updateStyleSelector();
+ }
+}
+
+void KHTMLPart::updateActions()
+{
+ bool frames = false;
+
+ QValueList<khtml::ChildFrame>::ConstIterator it = d->m_frames.begin();
+ QValueList<khtml::ChildFrame>::ConstIterator end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( (*it).m_type == khtml::ChildFrame::Frame )
+ {
+ frames = true;
+ break;
+ }
+
+ d->m_paViewFrame->setEnabled( frames );
+ d->m_paSaveFrame->setEnabled( frames );
+
+ if ( frames )
+ d->m_paFind->setText( i18n( "&Find in Frame..." ) );
+ else
+ d->m_paFind->setText( i18n( "&Find..." ) );
+
+ KParts::Part *frame = 0;
+
+ if ( frames )
+ frame = currentFrame();
+
+ bool enableFindAndSelectAll = true;
+
+ if ( frame )
+ enableFindAndSelectAll = frame->inherits( "KHTMLPart" );
+
+ d->m_paFind->setEnabled( enableFindAndSelectAll );
+ d->m_paSelectAll->setEnabled( enableFindAndSelectAll );
+
+ bool enablePrintFrame = false;
+
+ if ( frame )
+ {
+ QObject *ext = KParts::BrowserExtension::childObject( frame );
+ if ( ext )
+ enablePrintFrame = ext->metaObject()->slotNames().contains( "print()" );
+ }
+
+ d->m_paPrintFrame->setEnabled( enablePrintFrame );
+
+ QString bgURL;
+
+ // ### frames
+ if ( d->m_doc && d->m_doc->isHTMLDocument() && static_cast<HTMLDocumentImpl*>(d->m_doc)->body() && !d->m_bClearing )
+ bgURL = static_cast<HTMLDocumentImpl*>(d->m_doc)->body()->getAttribute( ATTR_BACKGROUND ).string();
+
+ d->m_paSaveBackground->setEnabled( !bgURL.isEmpty() );
+}
+
+bool KHTMLPart::requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
+ const QStringList ¶ms, bool isIFrame )
+{
+// kdDebug( 6050 ) << "childRequest( ..., " << url << ", " << frameName << " )" << endl;
+ FrameIt it = d->m_frames.find( frameName );
+ if ( it == d->m_frames.end() )
+ {
+ khtml::ChildFrame child;
+// kdDebug( 6050 ) << "inserting new frame into frame map " << frameName << endl;
+ child.m_name = frameName;
+ it = d->m_frames.append( child );
+ }
+
+ (*it).m_type = isIFrame ? khtml::ChildFrame::IFrame : khtml::ChildFrame::Frame;
+ (*it).m_frame = frame;
+ (*it).m_params = params;
+
+ // Support for <frame src="javascript:string">
+ if ( url.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 )
+ {
+ QVariant res = executeScript( DOM::Node(frame->element()), url.right( url.length() - 11) );
+ KURL myurl;
+ myurl.setProtocol("javascript");
+ if ( res.type() == QVariant::String )
+ myurl.setPath(res.asString());
+ return processObjectRequest(&(*it), myurl, QString("text/html") );
+ }
+ return requestObject( &(*it), completeURL( url ));
+}
+
+QString KHTMLPart::requestFrameName()
+{
+ return QString::fromLatin1("<!--frame %1-->").arg(d->m_frameNameId++);
+}
+
+bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
+ const QStringList ¶ms )
+{
+ if (url.isEmpty())
+ return false;
+ khtml::ChildFrame child;
+ QValueList<khtml::ChildFrame>::Iterator it = d->m_objects.append( child );
+ (*it).m_frame = frame;
+ (*it).m_type = khtml::ChildFrame::Object;
+ (*it).m_params = params;
+
+ KParts::URLArgs args;
+ args.serviceType = serviceType;
+ return requestObject( &(*it), completeURL( url ), args );
+}
+
+bool KHTMLPart::requestObject( khtml::ChildFrame *child, const KURL &url, const KParts::URLArgs &_args )
+{
+ if (!checkLinkSecurity(url))
+ return false;
+ if ( child->m_bPreloaded )
+ {
+ // kdDebug(6005) << "KHTMLPart::requestObject preload" << endl;
+ if ( child->m_frame && child->m_part )
+ child->m_frame->setWidget( child->m_part->widget() );
+
+ child->m_bPreloaded = false;
+ return true;
+ }
+
+ KParts::URLArgs args( _args );
+
+ if ( child->m_run )
+ child->m_run->abort();
+
+ if ( child->m_part && !args.reload && urlcmp( child->m_part->url().url(), url.url(), true, true ) )
+ args.serviceType = child->m_serviceType;
+
+ child->m_args = args;
+ child->m_args.reload = d->m_bReloading;
+ child->m_serviceName = QString::null;
+ if (!d->m_referrer.isEmpty() && !child->m_args.metaData().contains( "referrer" ))
+ child->m_args.metaData()["referrer"] = d->m_referrer;
+
+ child->m_args.metaData().insert("main_frame_request",
+ parentPart() == 0 ? "TRUE":"FALSE");
+ child->m_args.metaData().insert("ssl_was_in_use",
+ d->m_ssl_in_use ? "TRUE":"FALSE");
+ child->m_args.metaData().insert("ssl_activate_warnings", "TRUE");
+
+ // We want a KHTMLPart if the HTML says <frame src=""> or <frame src="about:blank">
+ if ((url.isEmpty() || url.url() == "about:blank") && args.serviceType.isEmpty())
+ args.serviceType = QString::fromLatin1( "text/html" );
+
+ if ( args.serviceType.isEmpty() ) {
+ child->m_run = new KHTMLRun( this, child, url, child->m_args,
+ child->m_type != khtml::ChildFrame::Frame );
+ return false;
+ } else {
+ return processObjectRequest( child, url, args.serviceType );
+ }
+}
+
+bool KHTMLPart::processObjectRequest( khtml::ChildFrame *child, const KURL &_url, const QString &mimetype )
+{
+ //kdDebug( 6050 ) << "KHTMLPart::processObjectRequest trying to create part for " << mimetype << endl;
+
+ // IMPORTANT: create a copy of the url here, because it is just a reference, which was likely to be given
+ // by an emitting frame part (emit openURLRequest( blahurl, ... ) . A few lines below we delete the part
+ // though -> the reference becomes invalid -> crash is likely
+ KURL url( _url );
+
+ // khtmlrun called us this way to indicate a loading error
+ if ( d->m_onlyLocalReferences || ( url.isEmpty() && mimetype.isEmpty() ) )
+ {
+ checkEmitLoadEvent();
+ child->m_bCompleted = true;
+ return true;
+ }
+
+ if (child->m_bNotify)
+ {
+ child->m_bNotify = false;
+ if ( !child->m_args.lockHistory() )
+ emit d->m_extension->openURLNotify();
+ }
+
+ if ( !child->m_services.contains( mimetype ) )
+ {
+ KParts::ReadOnlyPart *part = createPart( d->m_view->viewport(), child->m_name.ascii(), this, child->m_name.ascii(), mimetype, child->m_serviceName, child->m_services, child->m_params );
+
+ if ( !part )
+ {
+ if ( child->m_frame )
+ if (child->m_frame->partLoadingErrorNotify( child, url, mimetype ))
+ return true; // we succeeded after all (a fallback was used)
+
+ checkEmitLoadEvent();
+ return false;
+ }
+
+ //CRITICAL STUFF
+ if ( child->m_part )
+ {
+ partManager()->removePart( (KParts::ReadOnlyPart *)child->m_part );
+ delete (KParts::ReadOnlyPart *)child->m_part;
+ }
+
+ child->m_serviceType = mimetype;
+ if ( child->m_frame )
+ child->m_frame->setWidget( part->widget() );
+
+ if ( child->m_type != khtml::ChildFrame::Object )
+ partManager()->addPart( part, false );
+// else
+// kdDebug(6005) << "AH! NO FRAME!!!!!" << endl;
+
+ child->m_part = part;
+ assert( ((void*) child->m_part) != 0);
+
+ if ( child->m_type != khtml::ChildFrame::Object )
+ {
+ connect( part, SIGNAL( started( KIO::Job *) ),
+ this, SLOT( slotChildStarted( KIO::Job *) ) );
+ connect( part, SIGNAL( completed() ),
+ this, SLOT( slotChildCompleted() ) );
+ connect( part, SIGNAL( completed(bool) ),
+ this, SLOT( slotChildCompleted(bool) ) );
+ connect( part, SIGNAL( setStatusBarText( const QString & ) ),
+ this, SIGNAL( setStatusBarText( const QString & ) ) );
+ connect( this, SIGNAL( completed() ),
+ part, SLOT( slotParentCompleted() ) );
+ connect( this, SIGNAL( completed(bool) ),
+ part, SLOT( slotParentCompleted() ) );
+ }
+
+ child->m_extension = KParts::BrowserExtension::childObject( part );
+
+ if ( child->m_extension )
+ {
+ connect( child->m_extension, SIGNAL( openURLNotify() ),
+ d->m_extension, SIGNAL( openURLNotify() ) );
+
+ connect( child->m_extension, SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ),
+ this, SLOT( slotChildURLRequest( const KURL &, const KParts::URLArgs & ) ) );
+
+ connect( child->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ),
+ d->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ) );
+ connect( child->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs &, const KParts::WindowArgs &, KParts::ReadOnlyPart *& ) ),
+ d->m_extension, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & , const KParts::WindowArgs &, KParts::ReadOnlyPart *&) ) );
+
+ connect( child->m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ),
+ d->m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ) );
+ connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ),
+ d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ) );
+ connect( child->m_extension, SIGNAL( popupMenu( const QPoint &, const KURL &, const QString &, mode_t ) ),
+ d->m_extension, SIGNAL( popupMenu( const QPoint &, const KURL &, const QString &, mode_t ) ) );
+ connect( child->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ),
+ d->m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KURL &, const QString &, mode_t ) ) );
+
+ connect( child->m_extension, SIGNAL( infoMessage( const QString & ) ),
+ d->m_extension, SIGNAL( infoMessage( const QString & ) ) );
+
+ child->m_extension->setBrowserInterface( d->m_extension->browserInterface() );
+ }
+ }
+
+ checkEmitLoadEvent();
+ // Some JS code in the load event may have destroyed the part
+ // In that case, abort
+ if ( !child->m_part )
+ return false;
+
+ if ( child->m_bPreloaded )
+ {
+ if ( child->m_frame && child->m_part )
+ child->m_frame->setWidget( child->m_part->widget() );
+
+ child->m_bPreloaded = false;
+ return true;
+ }
+
+ child->m_args.reload = d->m_bReloading;
+
+ // make sure the part has a way to find out about the mimetype.
+ // we actually set it in child->m_args in requestObject already,
+ // but it's useless if we had to use a KHTMLRun instance, as the
+ // point the run object is to find out exactly the mimetype.
+ child->m_args.serviceType = mimetype;
+
+ child->m_bCompleted = false;
+ if ( child->m_extension )
+ child->m_extension->setURLArgs( child->m_args );
+
+ if(url.protocol() == "javascript" || url.url() == "about:blank") {
+ if (!child->m_part->inherits("KHTMLPart"))
+ return false;
+
+ KHTMLPart* p = static_cast<KHTMLPart*>(static_cast<KParts::ReadOnlyPart *>(child->m_part));
+
+ p->begin();
+ if (d->m_doc && p->d->m_doc)
+ p->d->m_doc->setBaseURL(d->m_doc->baseURL());
+ if (!url.url().startsWith("about:")) {
+ p->write(url.path());
+ } else {
+ p->m_url = url;
+ }
+ p->end();
+ return true;
+ }
+ else if ( !url.isEmpty() )
+ {
+ //kdDebug( 6050 ) << "opening " << url.url() << " in frame " << child->m_part << endl;
+ return child->m_part->openURL( url );
+ }
+ else
+ return true;
+}
+
+KParts::ReadOnlyPart *KHTMLPart::createPart( QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name, const QString &mimetype,
+ QString &serviceName, QStringList &serviceTypes,
+ const QStringList ¶ms )
+{
+ QString constr;
+ if ( !serviceName.isEmpty() )
+ constr.append( QString::fromLatin1( "Name == '%1'" ).arg( serviceName ) );
+
+ KTrader::OfferList offers = KTrader::self()->query( mimetype, "KParts/ReadOnlyPart", constr, QString::null );
+
+ if ( offers.isEmpty() )
+ return 0L;
+
+ KService::Ptr service = *offers.begin();
+
+ KLibFactory *factory = KLibLoader::self()->factory( QFile::encodeName(service->library()) );
+
+ if ( !factory )
+ return 0L;
+
+ KParts::ReadOnlyPart *res = 0L;
+
+ const char *className = "KParts::ReadOnlyPart";
+ if ( service->serviceTypes().contains( "Browser/View" ) )
+ className = "Browser/View";
+
+ if ( factory->inherits( "KParts::Factory" ) )
+ res = static_cast<KParts::ReadOnlyPart *>(static_cast<KParts::Factory *>( factory )->createPart( parentWidget, widgetName, parent, name, className, params ));
+ else
+ res = static_cast<KParts::ReadOnlyPart *>(factory->create( parentWidget, widgetName, className ));
+
+ if ( !res )
+ return res;
+
+ serviceTypes = service->serviceTypes();
+ serviceName = service->name();
+
+ return res;
+}
+
+KParts::PartManager *KHTMLPart::partManager()
+{
+ if ( !d->m_manager )
+ {
+ d->m_manager = new KParts::PartManager( d->m_view->topLevelWidget(), this, "khtml part manager" );
+ d->m_manager->setAllowNestedParts( true );
+ connect( d->m_manager, SIGNAL( activePartChanged( KParts::Part * ) ),
+ this, SLOT( slotActiveFrameChanged( KParts::Part * ) ) );
+ connect( d->m_manager, SIGNAL( partRemoved( KParts::Part * ) ),
+ this, SLOT( slotPartRemoved( KParts::Part * ) ) );
+ }
+
+ return d->m_manager;
+}
+
+void KHTMLPart::submitFormAgain()
+{
+ if( d->m_doc && !d->m_doc->parsing() && d->m_submitForm)
+ 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 );
+
+ delete d->m_submitForm;
+ d->m_submitForm = 0;
+ disconnect(this, SIGNAL(completed()), this, SLOT(submitFormAgain()));
+}
+
+void KHTMLPart::submitForm( const char *action, const QString &url, const QByteArray &formData, const QString &_target, const QString& contentType, const QString& boundary )
+{
+ kdDebug(6000) << this << ": KHTMLPart::submitForm target=" << _target << " url=" << url << endl;
+ KURL u = completeURL( url );
+
+ if ( !u.isValid() )
+ {
+ // ### ERROR HANDLING!
+ return;
+ }
+
+ // Form security checks
+ //
+
+ /* This is separate for a reason. It has to be _before_ all script, etc,
+ * AND I don't want to break anything that uses checkLinkSecurity() in
+ * other places.
+ */
+
+ // This causes crashes... needs to be fixed.
+ if (u.protocol() != "https") {
+ if (d->m_ssl_in_use) { // Going from SSL -> nonSSL
+ int rc = KMessageBox::warningContinueCancel(NULL, i18n("Warning: This is a secure form but it is attempting to send your data back unencrypted."
+ "\nA third party may be able to intercept and view this information."
+ "\nAre you sure you wish to continue?"),
+ i18n("SSL"));
+ if (rc == KMessageBox::Cancel)
+ return;
+ } else { // Going from nonSSL -> nonSSL
+ KSSLSettings kss(true);
+ if (kss.warnOnUnencrypted()) {
+ int rc = KMessageBox::warningContinueCancel(NULL,
+ i18n("Warning: Your data is about to be transmitted across the network unencrypted."
+ "\nAre you sure you wish to continue?"),
+ i18n("KDE"),
+ QString::null,
+ "WarnOnUnencryptedForm");
+ // Move this setting into KSSL instead
+ KConfig *config = kapp->config();
+ QString grpNotifMsgs = QString::fromLatin1("Notification Messages");
+ KConfigGroupSaver saver( config, grpNotifMsgs );
+
+ if (!config->readBoolEntry("WarnOnUnencryptedForm", true)) {
+ config->deleteEntry("WarnOnUnencryptedForm");
+ config->sync();
+ kss.setWarnOnUnencrypted(false);
+ kss.save();
+ }
+ if (rc == KMessageBox::Cancel)
+ return;
+ }
+ }
+ }
+
+ // End form security checks
+ //
+
+ QString urlstring = u.url();
+
+ if ( urlstring.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
+ urlstring = KURL::decode_string(urlstring);
+ executeScript( urlstring.right( urlstring.length() - 11) );
+ return;
+ }
+
+ if (!checkLinkSecurity(u,
+ i18n( "<qt>The form will be submitted to <BR><B>%1</B><BR>on your local filesystem.<BR>Do you want to submit the form?" ),
+ i18n( "Submit" )))
+ return;
+
+ KParts::URLArgs args;
+
+ if (!d->m_referrer.isEmpty())
+ args.metaData()["referrer"] = d->m_referrer;
+
+ args.metaData().insert("main_frame_request",
+ parentPart() == 0 ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_was_in_use", d->m_ssl_in_use ? "TRUE":"FALSE");
+ args.metaData().insert("ssl_activate_warnings", "TRUE");
+ args.frameName = _target.isEmpty() ? d->m_doc->baseTarget() : _target ;
+
+ if ( strcmp( action, "get" ) == 0 ) {
+ u.setQuery( QString::fromLatin1( formData.data(), formData.size() ) );
+ args.setDoPost( false );
+ }
+ else {
+ args.postData = formData;
+ args.setDoPost( true );
+
+ // construct some user headers if necessary
+ if (contentType.isNull() || contentType == "application/x-www-form-urlencoded")
+ args.setContentType( "Content-Type: application/x-www-form-urlencoded" );
+ else // contentType must be "multipart/form-data"
+ args.setContentType( "Content-Type: " + contentType + "; boundary=" + boundary );
+ }
+
+ if ( d->m_doc->parsing() || d->m_runningScripts > 0 ) {
+ if( d->m_submitForm ) {
+ kdDebug(6000) << "KHTMLPart::submitForm ABORTING!" << endl;
+ return;
+ }
+ d->m_submitForm = new KHTMLPartPrivate::SubmitForm;
+ d->m_submitForm->submitAction = action;
+ d->m_submitForm->submitUrl = url;
+ d->m_submitForm->submitFormData = formData;
+ d->m_submitForm->target = _target;
+ d->m_submitForm->submitContentType = contentType;
+ d->m_submitForm->submitBoundary = boundary;
+ connect(this, SIGNAL(completed()), this, SLOT(submitFormAgain()));
+ }
+ else
+ {
+ emit d->m_extension->openURLRequest( u, args );
+ }
+}
+
+void KHTMLPart::popupMenu( const QString &linkUrl )
+{
+ KURL popupURL;
+ KURL linkKURL;
+ if ( linkUrl.isEmpty() ) // click on background
+ popupURL = this->url();
+ else { // click on link
+ popupURL = completeURL( linkUrl );
+ linkKURL = popupURL;
+ }
+
+ KXMLGUIClient *client = new KHTMLPopupGUIClient( this, d->m_popupMenuXML, linkKURL );
+
+ emit d->m_extension->popupMenu( client, QCursor::pos(), popupURL,
+ QString::fromLatin1( "text/html" ), S_IFREG /*always a file*/ );
+
+ delete client;
+
+ emit popupMenu(linkUrl, QCursor::pos());
+}
+
+void KHTMLPart::slotParentCompleted()
+{
+ if ( !d->m_redirectURL.isEmpty() && !d->m_redirectionTimer.isActive() )
+ {
+ // kdDebug(6050) << this << ": Child redirection -> " << d->m_redirectURL << endl;
+ d->m_redirectionTimer.start( 1000 * d->m_delayRedirect, true );
+ }
+}
+
+void KHTMLPart::slotChildStarted( KIO::Job *job )
+{
+ khtml::ChildFrame *child = frame( sender() );
+
+ assert( child );
+
+ child->m_bCompleted = false;
+
+ if ( d->m_bComplete )
+ {
+#if 0
+ // WABA: Looks like this belongs somewhere else
+ if ( !parentPart() ) // "toplevel" html document? if yes, then notify the hosting browser about the document (url) changes
+ {
+ emit d->m_extension->openURLNotify();
+ }
+#endif
+ d->m_bComplete = false;
+ emit started( job );
+ }
+}
+
+void KHTMLPart::slotChildCompleted()
+{
+ slotChildCompleted( false );
+}
+
+void KHTMLPart::slotChildCompleted( bool complete )
+{
+ khtml::ChildFrame *child = frame( sender() );
+
+ assert( child );
+
+ child->m_bCompleted = true;
+ child->m_args = KParts::URLArgs();
+
+ if ( parentPart() == 0 )
+ d->m_bPendingChildRedirection = (d->m_bPendingChildRedirection || complete);
+
+ checkCompleted();
+}
+
+void KHTMLPart::slotChildURLRequest( const KURL &url, const KParts::URLArgs &args )
+{
+ khtml::ChildFrame *child = frame( sender()->parent() );
+
+ QString frameName = args.frameName.lower();
+ if ( !frameName.isEmpty() )
+ {
+ if ( frameName == QString::fromLatin1( "_top" ) )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_blank" ) )
+ {
+ emit d->m_extension->createNewWindow( url, args );
+ return;
+ }
+ else if ( frameName == QString::fromLatin1( "_parent" ) )
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+
+ emit d->m_extension->openURLRequest( url, newArgs );
+ return;
+ }
+ else if ( frameName != QString::fromLatin1( "_self" ) )
+ {
+ khtml::ChildFrame *_frame = recursiveFrameRequest( url, args );
+
+ if ( !_frame )
+ {
+ emit d->m_extension->openURLRequest( url, args );
+ return;
+ }
+
+ child = _frame;
+ }
+ }
+
+ // TODO: handle child target correctly! currently the script are always executed fur the parent
+ QString urlStr = url.url();
+ if ( urlStr.find( QString::fromLatin1( "javascript:" ), 0, false ) == 0 ) {
+ executeScript( urlStr.right( urlStr.length() - 11) );
+ return;
+ }
+
+ if ( child ) {
+ // Inform someone that we are about to show something else.
+ child->m_bNotify = true;
+ requestObject( child, url, args );
+ } else if ( frameName==QString::fromLatin1("_self") ) // this is for embedded objects (via <object>) which want to replace the current document
+ {
+ KParts::URLArgs newArgs( args );
+ newArgs.frameName = QString::null;
+ emit d->m_extension->openURLRequest( url, newArgs );
+ }
+}
+
+khtml::ChildFrame *KHTMLPart::frame( const QObject *obj )
+{
+ assert( obj->inherits( "KParts::ReadOnlyPart" ) );
+ const KParts::ReadOnlyPart *part = static_cast<const KParts::ReadOnlyPart *>( obj );
+
+ FrameIt it = d->m_frames.begin();
+ FrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( (KParts::ReadOnlyPart *)(*it).m_part == part )
+ return &(*it);
+
+ return 0L;
+}
+
+KHTMLPart *KHTMLPart::findFrame( const QString &f )
+{
+#if 0
+ kdDebug() << "KHTMLPart::findFrame '" << f << "'" << endl;
+ FrameIt it2 = d->m_frames.begin();
+ FrameIt end = d->m_frames.end();
+ for (; it2 != end; ++it2 )
+ kdDebug() << " - having frame '" << (*it2).m_name << "'" << endl;
+#endif
+ // ### http://www.w3.org/TR/html4/appendix/notes.html#notes-frames
+ ConstFrameIt it = d->m_frames.find( f );
+ if ( it == d->m_frames.end() )
+ {
+ //kdDebug() << "KHTMLPart::findFrame frame " << f << " not found" << endl;
+ return 0L;
+ }
+ else {
+ KParts::ReadOnlyPart *p = (*it).m_part;
+ if ( p && p->inherits( "KHTMLPart" ))
+ {
+ //kdDebug() << "KHTMLPart::findFrame frame " << f << " is a KHTMLPart, ok" << endl;
+ return (KHTMLPart*)p;
+ }
+ else
+ {
+#if 0
+ if (p)
+ kdWarning() << "KHTMLPart::findFrame frame " << f << " found but isn't a KHTMLPart ! " << p->className() << endl;
+ else
+ kdWarning() << "KHTMLPart::findFrame frame " << f << " found but m_part=0L" << endl;
+#endif
+ return 0L;
+ }
+ }
+}
+
+KParts::ReadOnlyPart *KHTMLPart::currentFrame() const
+{
+ KParts::ReadOnlyPart* part = (KParts::ReadOnlyPart*)(this);
+ // Find active part in our frame manager, in case we are a frameset
+ // and keep doing that (in case of nested framesets).
+ // Just realized we could also do this recursively, calling part->currentFrame()...
+ while ( part && part->inherits("KHTMLPart") &&
+ static_cast<KHTMLPart *>(part)->d->m_frames.count() > 0 ) {
+ KHTMLPart* frameset = static_cast<KHTMLPart *>(part);
+ part = static_cast<KParts::ReadOnlyPart *>(frameset->partManager()->activePart());
+ if ( !part ) return frameset;
+ }
+ return part;
+}
+
+bool KHTMLPart::frameExists( const QString &frameName )
+{
+ ConstFrameIt it = d->m_frames.find( frameName );
+ if ( it == d->m_frames.end() )
+ return false;
+
+ // WABA: We only return true if the child actually has a frame
+ // set. Otherwise we might find our preloaded-selve.
+ // This happens when we restore the frameset.
+ return (!(*it).m_frame.isNull());
+}
+
+KHTMLPart *KHTMLPart::parentPart()
+{
+ if ( !parent() || !parent()->inherits( "KHTMLPart" ) )
+ return 0L;
+
+ return (KHTMLPart *)parent();
+}
+
+khtml::ChildFrame *KHTMLPart::recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args,
+ bool callParent )
+{
+ FrameIt it = d->m_frames.find( args.frameName );
+
+ if ( it != d->m_frames.end() )
+ return &(*it);
+
+ it = d->m_frames.begin();
+ FrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( (*it).m_part && (*it).m_part->inherits( "KHTMLPart" ) )
+ {
+ KHTMLPart *childPart = (KHTMLPart *)(KParts::ReadOnlyPart *)(*it).m_part;
+
+ khtml::ChildFrame *res = childPart->recursiveFrameRequest( url, args, false );
+ if ( !res )
+ continue;
+
+ childPart->requestObject( res, url, args );
+ return 0L;
+ }
+
+ if ( parentPart() && callParent )
+ {
+ khtml::ChildFrame *res = parentPart()->recursiveFrameRequest( url, args );
+
+ if ( res )
+ parentPart()->requestObject( res, url, args );
+
+ return 0L;
+ }
+
+ return 0L;
+}
+
+void KHTMLPart::saveState( QDataStream &stream )
+{
+ kdDebug( 6050 ) << "KHTMLPart::saveState saving URL " << m_url.url() << endl;
+
+ stream << m_url << (Q_INT32)d->m_view->contentsX() << (Q_INT32)d->m_view->contentsY()
+ << (Q_INT32) d->m_view->contentsWidth() << (Q_INT32) d->m_view->contentsHeight() << (Q_INT32) d->m_view->marginWidth() << (Q_INT32) d->m_view->marginHeight();
+
+ // save link cursor position
+ int focusNodeNumber;
+ if (!d->m_focusNodeRestored)
+ focusNodeNumber = d->m_focusNodeNumber;
+ else if (d->m_doc->focusNode())
+ focusNodeNumber = d->m_doc->nodeAbsIndex(d->m_doc->focusNode());
+ else
+ focusNodeNumber = -1;
+ stream << focusNodeNumber;
+
+ // Save the doc's cache id.
+ stream << d->m_cacheId;
+
+ // Save the state of the document (Most notably the state of any forms)
+ QStringList docState;
+ if (d->m_doc)
+ {
+ docState = d->m_doc->docState();
+ }
+ stream << d->m_encoding << d->m_sheetUsed << docState;
+
+ stream << d->m_zoomFactor;
+
+ // Save ssl data
+ stream << d->m_ssl_in_use
+ << d->m_ssl_peer_certificate
+ << d->m_ssl_peer_chain
+ << d->m_ssl_peer_ip
+ << d->m_ssl_cipher
+ << d->m_ssl_cipher_desc
+ << d->m_ssl_cipher_version
+ << d->m_ssl_cipher_used_bits
+ << d->m_ssl_cipher_bits
+ << d->m_ssl_cert_state;
+
+ // Save frame data
+ stream << (Q_UINT32)d->m_frames.count();
+
+ QStringList frameNameLst, frameServiceTypeLst, frameServiceNameLst;
+ KURL::List frameURLLst;
+ QValueList<QByteArray> frameStateBufferLst;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ {
+ frameNameLst << (*it).m_name;
+ frameServiceTypeLst << (*it).m_serviceType;
+ frameServiceNameLst << (*it).m_serviceName;
+ if ( (*it).m_part )
+ frameURLLst << (*it).m_part->url();
+ else
+ frameURLLst << KURL();
+
+ QByteArray state;
+ QDataStream frameStream( state, IO_WriteOnly );
+
+ if ( (*it).m_part && (*it).m_extension )
+ (*it).m_extension->saveState( frameStream );
+
+ frameStateBufferLst << state;
+ }
+
+ stream << frameNameLst << frameServiceTypeLst << frameServiceNameLst << frameURLLst << frameStateBufferLst;
+}
+
+void KHTMLPart::restoreState( QDataStream &stream )
+{
+ KURL u;
+ Q_INT32 xOffset, yOffset, wContents, hContents, mWidth, mHeight;
+ Q_UINT32 frameCount;
+ QStringList frameNames, frameServiceTypes, docState, frameServiceNames;
+ KURL::List frameURLs;
+ QValueList<QByteArray> frameStateBuffers;
+ QValueList<int> fSizes;
+ QString encoding, sheetUsed;
+ long old_cacheId = d->m_cacheId;
+
+ stream >> u >> xOffset >> yOffset >> wContents >> hContents >> mWidth >> mHeight;
+
+ d->m_view->setMarginWidth( mWidth );
+ d->m_view->setMarginHeight( mHeight );
+
+ // restore link cursor position
+ // nth node is active. value is set in checkCompleted()
+ stream >> d->m_focusNodeNumber;
+ d->m_focusNodeRestored = false;
+ kdDebug(6050)<<"new focus Node number is:"<<d->m_focusNodeNumber<<endl;
+
+ stream >> d->m_cacheId;
+
+ stream >> encoding >> sheetUsed >> docState;
+ d->m_encoding = encoding;
+ d->m_sheetUsed = sheetUsed;
+
+ int zoomFactor;
+ stream >> zoomFactor;
+ setZoomFactor(zoomFactor);
+
+ // Restore ssl data
+ stream >> d->m_ssl_in_use
+ >> d->m_ssl_peer_certificate
+ >> d->m_ssl_peer_chain
+ >> d->m_ssl_peer_ip
+ >> d->m_ssl_cipher
+ >> d->m_ssl_cipher_desc
+ >> d->m_ssl_cipher_version
+ >> d->m_ssl_cipher_used_bits
+ >> d->m_ssl_cipher_bits
+ >> d->m_ssl_cert_state;
+
+ d->m_paSecurity->setIcon( d->m_ssl_in_use ? "encrypted" : "decrypted" );
+
+ stream >> frameCount >> frameNames >> frameServiceTypes >> frameServiceNames
+ >> frameURLs >> frameStateBuffers;
+
+ d->m_bComplete = false;
+ d->m_bLoadEventEmitted = false;
+
+// kdDebug( 6050 ) << "restoreStakte() docState.count() = " << docState.count() << endl;
+// kdDebug( 6050 ) << "m_url " << m_url.url() << " <-> " << u.url() << endl;
+// kdDebug( 6050 ) << "m_frames.count() " << d->m_frames.count() << " <-> " << frameCount << endl;
+
+ if (d->m_cacheId == old_cacheId)
+ {
+ // Partial restore
+ d->m_redirectionTimer.stop();
+
+ FrameIt fIt = d->m_frames.begin();
+ FrameIt fEnd = d->m_frames.end();
+
+ for (; fIt != fEnd; ++fIt )
+ (*fIt).m_bCompleted = false;
+
+ fIt = d->m_frames.begin();
+
+ QStringList::ConstIterator fNameIt = frameNames.begin();
+ QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
+ QStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
+ KURL::List::ConstIterator fURLIt = frameURLs.begin();
+ QValueList<QByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
+
+ for (; fIt != fEnd; ++fIt, ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
+ {
+ khtml::ChildFrame *child = &(*fIt);
+
+// kdDebug( 6050 ) << *fNameIt << " ---- " << *fServiceTypeIt << endl;
+
+ if ( child->m_name != *fNameIt || child->m_serviceType != *fServiceTypeIt )
+ {
+ child->m_bPreloaded = true;
+ child->m_name = *fNameIt;
+ child->m_serviceName = *fServiceNameIt;
+ processObjectRequest( child, *fURLIt, *fServiceTypeIt );
+ }
+
+ if ( child->m_part )
+ {
+ child->m_bCompleted = false;
+ if ( child->m_extension )
+ {
+ QDataStream frameStream( *fBufferIt, IO_ReadOnly );
+ child->m_extension->restoreState( frameStream );
+ }
+ else
+ child->m_part->openURL( *fURLIt );
+ }
+ }
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ args.xOffset = xOffset;
+ args.yOffset = yOffset;
+ args.docState = docState; // WABA: How are we going to restore this??
+ d->m_extension->setURLArgs( args );
+
+ d->m_view->resizeContents( wContents, hContents);
+ d->m_view->setContentsPos( xOffset, yOffset );
+ }
+ else
+ {
+ // Full restore.
+ closeURL();
+ // We must force a clear because we want to be sure to delete all
+ // frames.
+ d->m_bCleared = false;
+ clear();
+ d->m_encoding = encoding;
+ d->m_sheetUsed = sheetUsed;
+
+ QStringList::ConstIterator fNameIt = frameNames.begin();
+ QStringList::ConstIterator fNameEnd = frameNames.end();
+
+ QStringList::ConstIterator fServiceTypeIt = frameServiceTypes.begin();
+ QStringList::ConstIterator fServiceNameIt = frameServiceNames.begin();
+ KURL::List::ConstIterator fURLIt = frameURLs.begin();
+ QValueList<QByteArray>::ConstIterator fBufferIt = frameStateBuffers.begin();
+
+ for (; fNameIt != fNameEnd; ++fNameIt, ++fServiceTypeIt, ++fServiceNameIt, ++fURLIt, ++fBufferIt )
+ {
+ khtml::ChildFrame newChild;
+ newChild.m_bPreloaded = true;
+ newChild.m_name = *fNameIt;
+ newChild.m_serviceName = *fServiceNameIt;
+
+// kdDebug( 6050 ) << *fNameIt << " ---- " << *fServiceTypeIt << endl;
+
+ FrameIt childFrame = d->m_frames.append( newChild );
+
+ processObjectRequest( &(*childFrame), *fURLIt, *fServiceTypeIt );
+
+ (*childFrame).m_bPreloaded = true;
+
+ if ( (*childFrame).m_part )
+ {
+ if ( (*childFrame).m_extension )
+ {
+ QDataStream frameStream( *fBufferIt, IO_ReadOnly );
+ (*childFrame).m_extension->restoreState( frameStream );
+ }
+ else
+ (*childFrame).m_part->openURL( *fURLIt );
+ }
+ }
+
+ KParts::URLArgs args( d->m_extension->urlArgs() );
+ args.xOffset = xOffset;
+ args.yOffset = yOffset;
+ args.docState = docState;
+ d->m_extension->setURLArgs( args );
+// kdDebug( 6050 ) << "in restoreState : calling openURL for " << u.url() << endl;
+ if (!KHTMLPageCache::self()->isValid(d->m_cacheId))
+ openURL( u );
+ else
+ restoreURL( u );
+ }
+
+ d->m_restored = true;
+
+}
+
+void KHTMLPart::show()
+{
+ if ( d->m_view )
+ d->m_view->show();
+}
+
+void KHTMLPart::hide()
+{
+ if ( d->m_view )
+ d->m_view->hide();
+}
+
+DOM::Node KHTMLPart::nodeUnderMouse() const
+{
+ return d->m_view->nodeUnderMouse();
+}
+
+void KHTMLPart::emitSelectionChanged()
+{
+ emit d->m_extension->enableAction( "copy", hasSelection() );
+ emit d->m_extension->selectionInfo( selectedText() );
+ emit selectionChanged();
+}
+
+int KHTMLPart::zoomFactor() const
+{
+ return d->m_zoomFactor;
+}
+
+// ### make the list configurable ?
+static const int zoomSizes[] = { 20, 40, 60, 80, 90, 95, 100, 105, 110, 120, 140, 160, 180, 200, 250, 300 };
+static const int zoomSizeCount = (sizeof(zoomSizes) / sizeof(int));
+static const int minZoom = 20;
+static const int maxZoom = 300;
+
+void KHTMLPart::slotIncZoom()
+{
+ int zoomFactor = d->m_zoomFactor;
+
+ if (zoomFactor < maxZoom) {
+ // find the entry nearest to the given zoomsizes
+ for (int i = 0; i < zoomSizeCount; ++i)
+ if (zoomSizes[i] > zoomFactor) {
+ zoomFactor = zoomSizes[i];
+ break;
+ }
+ setZoomFactor(zoomFactor);
+ }
+}
+
+void KHTMLPart::slotDecZoom()
+{
+ int zoomFactor = d->m_zoomFactor;
+ if (zoomFactor > minZoom) {
+ // find the entry nearest to the given zoomsizes
+ for (int i = zoomSizeCount-1; i >= 0; --i)
+ if (zoomSizes[i] < zoomFactor) {
+ zoomFactor = zoomSizes[i];
+ break;
+ }
+ setZoomFactor(zoomFactor);
+ }
+}
+
+void KHTMLPart::setZoomFactor (int percent)
+{
+ if (percent < minZoom) percent = minZoom;
+ if (percent > maxZoom) percent = maxZoom;
+ if (d->m_zoomFactor == percent) return;
+ d->m_zoomFactor = percent;
+
+ if(d->m_doc) {
+ QApplication::setOverrideCursor( waitCursor );
+ if (d->m_doc->styleSelector())
+ d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
+ d->m_doc->recalcStyle( NodeImpl::Force );
+ QApplication::restoreOverrideCursor();
+ }
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
+ KParts::ReadOnlyPart* p = ( *it ).m_part;
+ static_cast<KHTMLPart*>( p )->setZoomFactor(d->m_zoomFactor);
+ }
+
+ d->m_paDecZoomFactor->setEnabled( d->m_zoomFactor > minZoom );
+ d->m_paIncZoomFactor->setEnabled( d->m_zoomFactor < maxZoom );
+}
+
+void KHTMLPart::setJSStatusBarText( const QString &text )
+{
+ d->m_kjsStatusBarText = text;
+ emit setStatusBarText( d->m_kjsStatusBarText );
+}
+
+void KHTMLPart::setJSDefaultStatusBarText( const QString &text )
+{
+ d->m_kjsDefaultStatusBarText = text;
+ emit setStatusBarText( d->m_kjsDefaultStatusBarText );
+}
+
+QString KHTMLPart::jsStatusBarText() const
+{
+ return d->m_kjsStatusBarText;
+}
+
+QString KHTMLPart::jsDefaultStatusBarText() const
+{
+ return d->m_kjsDefaultStatusBarText;
+}
+
+QString KHTMLPart::referrer() const
+{
+ return d->m_referrer;
+}
+
+QString KHTMLPart::lastModified() const
+{
+ return d->m_lastModified;
+}
+
+void KHTMLPart::slotLoadImages()
+{
+ if (d->m_doc )
+ d->m_doc->docLoader()->setAutoloadImages( !d->m_doc->docLoader()->autoloadImages() );
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ if ( !( *it ).m_part.isNull() && ( *it ).m_part->inherits( "KHTMLPart" ) ) {
+ KParts::ReadOnlyPart* p = ( *it ).m_part;
+ static_cast<KHTMLPart*>( p )->slotLoadImages();
+ }
+}
+
+void KHTMLPart::reparseConfiguration()
+{
+ KHTMLSettings *settings = KHTMLFactory::defaultHTMLSettings();
+ settings->init();
+
+ setAutoloadImages( settings->autoLoadImages() );
+ if (d->m_doc)
+ d->m_doc->docLoader()->setShowAnimations( settings->showAnimations() );
+
+ d->m_bJScriptEnabled = settings->isJavaScriptEnabled(m_url.host());
+ d->m_bJScriptDebugEnabled = settings->isJavaScriptDebugEnabled();
+ d->m_bJavaEnabled = settings->isJavaEnabled(m_url.host());
+ d->m_bPluginsEnabled = settings->isPluginsEnabled(m_url.host());
+ delete d->m_settings;
+ d->m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
+
+ QApplication::setOverrideCursor( waitCursor );
+ if(d->m_doc) d->m_doc->recalcStyle( NodeImpl::Force );
+ QApplication::restoreOverrideCursor();
+}
+
+QStringList KHTMLPart::frameNames() const
+{
+ QStringList res;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ res += (*it).m_name;
+
+ return res;
+}
+
+QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
+{
+ QPtrList<KParts::ReadOnlyPart> res;
+
+ ConstFrameIt it = d->m_frames.begin();
+ ConstFrameIt end = d->m_frames.end();
+ for (; it != end; ++it )
+ res.append( (*it).m_part );
+
+ return res;
+}
+
+bool KHTMLPart::openURLInFrame( const KURL &url, const KParts::URLArgs &urlArgs )
+{
+ FrameIt it = d->m_frames.find( urlArgs.frameName );
+
+ if ( it == d->m_frames.end() )
+ return false;
+
+ // Inform someone that we are about to show something else.
+ if ( !urlArgs.lockHistory() )
+ emit d->m_extension->openURLNotify();
+
+ requestObject( &(*it), url, urlArgs );
+
+ return true;
+}
+
+void KHTMLPart::setDNDEnabled( bool b )
+{
+ d->m_bDnd = b;
+}
+
+bool KHTMLPart::dndEnabled() const
+{
+ return d->m_bDnd;
+}
+
+void KHTMLPart::customEvent( QCustomEvent *event )
+{
+ if ( khtml::MousePressEvent::test( event ) )
+ {
+ khtmlMousePressEvent( static_cast<khtml::MousePressEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::MouseDoubleClickEvent::test( event ) )
+ {
+ khtmlMouseDoubleClickEvent( static_cast<khtml::MouseDoubleClickEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::MouseMoveEvent::test( event ) )
+ {
+ khtmlMouseMoveEvent( static_cast<khtml::MouseMoveEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::MouseReleaseEvent::test( event ) )
+ {
+ khtmlMouseReleaseEvent( static_cast<khtml::MouseReleaseEvent *>( event ) );
+ return;
+ }
+
+ if ( khtml::DrawContentsEvent::test( event ) )
+ {
+ khtmlDrawContentsEvent( static_cast<khtml::DrawContentsEvent *>( event ) );
+ return;
+ }
+
+ KParts::ReadOnlyPart::customEvent( event );
+}
+
+void KHTMLPart::khtmlMousePressEvent( khtml::MousePressEvent *event )
+{
+ DOM::DOMString url = event->url();
+ QMouseEvent *_mouse = event->qmouseEvent();
+ DOM::Node innerNode = event->innerNode();
+ d->m_mousePressNode = innerNode;
+
+ d->m_dragStartPos = _mouse->pos();
+
+ if ( !event->url().isNull() ) {
+ d->m_strSelectedURL = event->url().string();
+ d->m_strSelectedURLTarget = event->target().string();
+ }
+ else
+ d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
+
+ if ( _mouse->button() == LeftButton ||
+ _mouse->button() == MidButton )
+ {
+ d->m_bMousePressed = true;
+
+#ifndef KHTML_NO_SELECTION
+ if ( _mouse->button() == LeftButton )
+ {
+ if ( !innerNode.isNull() && innerNode.handle()->renderer()) {
+ int offset = 0;
+ DOM::NodeImpl* node = 0;
+ innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
+ event->absX()-innerNode.handle()->renderer()->xPos(),
+ event->absY()-innerNode.handle()->renderer()->yPos(), node, offset);
+
+ d->m_selectionStart = node;
+ d->m_startOffset = offset;
+// kdDebug(6005) << "KHTMLPart::khtmlMousePressEvent selectionStart=" << d->m_selectionStart.handle()->renderer()
+// << " offset=" << d->m_startOffset << endl;
+ d->m_selectionEnd = d->m_selectionStart;
+ d->m_endOffset = d->m_startOffset;
+ d->m_doc->clearSelection();
+ }
+ else
+ {
+ d->m_selectionStart = DOM::Node();
+ d->m_selectionEnd = DOM::Node();
+ }
+ emitSelectionChanged();
+ startAutoScroll();
+ }
+#else
+ d->m_dragLastPos = _mouse->globalPos();
+#endif
+ }
+
+ if ( _mouse->button() == RightButton )
+ {
+ popupMenu( d->m_strSelectedURL );
+ d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
+ }
+}
+
+void KHTMLPart::khtmlMouseDoubleClickEvent( khtml::MouseDoubleClickEvent * )
+{
+}
+
+void KHTMLPart::khtmlMouseMoveEvent( khtml::MouseMoveEvent *event )
+{
+ QMouseEvent *_mouse = event->qmouseEvent();
+ DOM::Node innerNode = event->innerNode();
+
+#ifndef QT_NO_DRAGANDDROP
+ if( d->m_bMousePressed && (!d->m_strSelectedURL.isEmpty() || (!innerNode.isNull() && innerNode.elementId() == ID_IMG) ) &&
+ ( d->m_dragStartPos - _mouse->pos() ).manhattanLength() > KGlobalSettings::dndEventDelay() &&
+ d->m_bDnd && d->m_mousePressNode == innerNode ) {
+
+ QPixmap p;
+ QDragObject *drag = 0;
+ if( !d->m_strSelectedURL.isEmpty() ) {
+ KURL u( completeURL( d->m_strSelectedURL) );
+ KURLDrag* urlDrag = KURLDrag::newDrag( u, d->m_view->viewport() );
+ if ( !d->m_referrer.isEmpty() )
+ urlDrag->metaData()["referrer"] = d->m_referrer;
+ drag = urlDrag;
+ p = KMimeType::pixmapForURL(u, 0, KIcon::Desktop, KIcon::SizeMedium);
+ } else {
+ HTMLImageElementImpl *i = static_cast<HTMLImageElementImpl *>(innerNode.handle());
+ if( i ) {
+ KMultipleDrag *mdrag = new KMultipleDrag( d->m_view->viewport() );
+ mdrag->addDragObject( new QImageDrag( i->currentImage(), 0L ) );
+ KURL u( completeURL( khtml::parseURL(i->getAttribute(ATTR_SRC)).string() ) );
+ KURLDrag* urlDrag = KURLDrag::newDrag( u, 0L );
+ if ( !d->m_referrer.isEmpty() )
+ urlDrag->metaData()["referrer"] = d->m_referrer;
+ mdrag->addDragObject( urlDrag );
+ drag = mdrag;
+ p = KMimeType::mimeType("image/png")->pixmap(KIcon::Desktop);
+ }
+ }
+
+ if ( !p.isNull() )
+ drag->setPixmap(p);
+
+ stopAutoScroll();
+ if(drag)
+ drag->drag();
+
+ // when we finish our drag, we need to undo our mouse press
+ d->m_bMousePressed = false;
+ d->m_strSelectedURL = d->m_strSelectedURLTarget = QString::null;
+ return;
+ }
+#endif
+
+ DOM::DOMString url = event->url();
+ DOM::DOMString target = event->target();
+
+ // Not clicked -> mouse over stuff
+ if ( !d->m_bMousePressed )
+ {
+ // The mouse is over something
+ if ( url.length() )
+ {
+ bool shiftPressed = ( _mouse->state() & ShiftButton );
+
+ // Image map
+ if ( !innerNode.isNull() && innerNode.elementId() == ID_IMG )
+ {
+ HTMLImageElementImpl *i = static_cast<HTMLImageElementImpl *>(innerNode.handle());
+ if ( i && i->isServerMap() )
+ {
+ khtml::RenderObject *r = i->renderer();
+ if(r)
+ {
+ int absx, absy, vx, vy;
+ r->absolutePosition(absx, absy);
+ view()->contentsToViewport( absx, absy, vx, vy );
+
+ int x(_mouse->x() - vx), y(_mouse->y() - vy);
+
+ d->m_overURL = url.string() + QString("?%1,%2").arg(x).arg(y);
+ d->m_overURLTarget = target.string();
+ overURL( d->m_overURL, target.string(), shiftPressed );
+ return;
+ }
+ }
+ }
+
+ // normal link
+ if ( d->m_overURL.isEmpty() || d->m_overURL != url || d->m_overURLTarget != target )
+ {
+ d->m_overURL = url.string();
+ d->m_overURLTarget = target.string();
+ overURL( d->m_overURL, target.string(), shiftPressed );
+ }
+ }
+ else // Not over a link...
+ {
+ if( !d->m_overURL.isEmpty() ) // and we were over a link -> reset to "default statusbar text"
+ {
+ d->m_overURL = d->m_overURLTarget = QString::null;
+ emit onURL( QString::null );
+ // Default statusbar text can be set from javascript. Otherwise it's empty.
+ emit setStatusBarText( d->m_kjsDefaultStatusBarText );
+ }
+ }
+ }
+ else {
+#ifndef KHTML_NO_SELECTION
+ // selection stuff
+ if( d->m_bMousePressed && innerNode.handle() && innerNode.handle()->renderer() &&
+ ( _mouse->state() == LeftButton )) {
+ int offset;
+ //kdDebug(6000) << "KHTMLPart::khtmlMouseMoveEvent x=" << event->x() << " y=" << event->y()
+ // << " nodeAbsX=" << event->nodeAbsX() << " nodeAbsY=" << event->nodeAbsY()
+ // << endl;
+ DOM::NodeImpl* node=0;
+ innerNode.handle()->renderer()->checkSelectionPoint( event->x(), event->y(),
+ event->absX()-innerNode.handle()->renderer()->xPos(),
+ event->absY()-innerNode.handle()->renderer()->yPos(), node, offset);
+ d->m_selectionEnd = node;
+ d->m_endOffset = offset;
+// if (d->m_selectionEnd.handle() && d->m_selectionEnd.handle()->renderer())
+// kdDebug( 6000 ) << "setting end of selection to " << d->m_selectionEnd.handle()->renderer() << "/"
+// << d->m_endOffset << endl;
+
+ // we have to get to know if end is before start or not...
+ DOM::Node n = d->m_selectionStart;
+ d->m_startBeforeEnd = false;
+ while(!n.isNull()) {
+ if(n == d->m_selectionEnd) {
+ d->m_startBeforeEnd = true;
+ break;
+ }
+ DOM::Node next = n.firstChild();
+ if(next.isNull()) next = n.nextSibling();
+ while( next.isNull() && !n.parentNode().isNull() ) {
+ n = n.parentNode();
+ next = n.nextSibling();
+ }
+ n = next;
+ //d->m_view->viewport()->repaint(false);
+ }
+
+ if ( !d->m_selectionStart.isNull() && !d->m_selectionEnd.isNull() )
+ {
+ if (d->m_selectionEnd == d->m_selectionStart && d->m_endOffset < d->m_startOffset)
+ d->m_doc
+ ->setSelection(d->m_selectionStart.handle(),d->m_endOffset,
+ d->m_selectionEnd.handle(),d->m_startOffset);
+ else if (d->m_startBeforeEnd)
+ d->m_doc
+ ->setSelection(d->m_selectionStart.handle(),d->m_startOffset,
+ d->m_selectionEnd.handle(),d->m_endOffset);
+ else
+ d->m_doc
+ ->setSelection(d->m_selectionEnd.handle(),d->m_endOffset,
+ d->m_selectionStart.handle(),d->m_startOffset);
+ }
+#else
+ if ( d->m_doc && d->m_view ) {
+ QPoint diff( _mouse->globalPos() - d->m_dragLastPos );
+
+ if ( abs( diff.x() ) > 64 || abs( diff.y() ) > 64 ) {
+ d->m_view->scrollBy( -diff.x(), -diff.y() );
+ d->m_dragLastPos = _mouse->globalPos();
+ }
+#endif
+ }
+ }
+
+}
+
+void KHTMLPart::khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event )
+{
+ DOM::Node innerNode = event->innerNode();
+ d->m_mousePressNode = DOM::Node();
+
+ if ( d->m_bMousePressed )
+ stopAutoScroll();
+
+ // Used to prevent mouseMoveEvent from initiating a drag before
+ // the mouse is pressed again.
+ d->m_bMousePressed = false;
+
+#ifndef QT_NO_CLIPBOARD
+ QMouseEvent *_mouse = event->qmouseEvent();
+ if ((d->m_guiProfile == BrowserViewGUI) && (_mouse->button() == MidButton) && (event->url().isNull()))
+ {
+ QClipboard *cb = QApplication::clipboard();
+ cb->setSelectionMode( true );
+ QCString plain("plain");
+ QString url = cb->text(plain).stripWhiteSpace();
+ KURL u(url);
+ if ( u.isMalformed() ) {
+ // some half-baked guesses for incomplete urls
+ // (the same code is in libkonq/konq_dirpart.cc)
+ if ( url.startsWith( "ftp." ) )
+ {
+ url.prepend( "ftp://" );
+ u = url;
+ }
+ else
+ {
+ url.prepend( "http://" );
+ u = url;
+ }
+ }
+ if (u.isValid())
+ {
+ QString savedReferrer = d->m_referrer;
+ d->m_referrer = QString::null; // Disable referrer.
+ urlSelected(url, 0,0, "_top");
+ d->m_referrer = savedReferrer; // Restore original referrer.
+ }
+ }
+#endif
+
+#ifndef KHTML_NO_SELECTION
+ // delete selection in case start and end position are at the same point
+ if(d->m_selectionStart == d->m_selectionEnd && d->m_startOffset == d->m_endOffset) {
+ d->m_selectionStart = 0;
+ d->m_selectionEnd = 0;
+ d->m_startOffset = 0;
+ d->m_endOffset = 0;
+ emitSelectionChanged();
+ } else {
+ // we have to get to know if end is before start or not...
+ DOM::Node n = d->m_selectionStart;
+ d->m_startBeforeEnd = false;
+ if( d->m_selectionStart == d->m_selectionEnd ) {
+ if( d->m_startOffset < d->m_endOffset )
+ d->m_startBeforeEnd = true;
+ } else {
+ while(!n.isNull()) {
+ if(n == d->m_selectionEnd) {
+ d->m_startBeforeEnd = true;
+ break;
+ }
+ DOM::Node next = n.firstChild();
+ if(next.isNull()) next = n.nextSibling();
+ while( next.isNull() && !n.parentNode().isNull() ) {
+ n = n.parentNode();
+ next = n.nextSibling();
+ }
+ n = next;
+ }
+ }
+ if(!d->m_startBeforeEnd)
+ {
+ DOM::Node tmpNode = d->m_selectionStart;
+ int tmpOffset = d->m_startOffset;
+ d->m_selectionStart = d->m_selectionEnd;
+ d->m_startOffset = d->m_endOffset;
+ d->m_selectionEnd = tmpNode;
+ d->m_endOffset = tmpOffset;
+ d->m_startBeforeEnd = true;
+ }
+ // get selected text and paste to the clipboard
+#ifndef QT_NO_CLIPBOARD
+ QString text = selectedText();
+ text.replace(QRegExp(QChar(0xa0)), " ");
+ QClipboard *cb = QApplication::clipboard();
+ cb->setSelectionMode( true );
+ disconnect( kapp->clipboard(), SIGNAL( selectionChanged()), this, SLOT( slotClearSelection()));
+ cb->setText(text);
+ connect( kapp->clipboard(), SIGNAL( selectionChanged()), SLOT( slotClearSelection()));
+ cb->setSelectionMode( false );
+#endif
+ //kdDebug( 6000 ) << "selectedText = " << text << endl;
+ emitSelectionChanged();
+ }
+#endif
+
+}
+
+void KHTMLPart::khtmlDrawContentsEvent( khtml::DrawContentsEvent * )
+{
+}
+
+void KHTMLPart::guiActivateEvent( KParts::GUIActivateEvent *event )
+{
+ if ( event->activated() )
+ {
+ emitSelectionChanged();
+ emit d->m_extension->enableAction( "print", d->m_doc != 0 );
+
+ if ( !d->m_settings->autoLoadImages() && d->m_paLoadImages )
+ {
+ QPtrList<KAction> lst;
+ lst.append( d->m_paLoadImages );
+ plugActionList( "loadImages", lst );
+ }
+ }
+}
+
+void KHTMLPart::slotFind()
+{
+ KHTMLPart *part = static_cast<KHTMLPart *>( currentFrame() );
+ if (!part)
+ return;
+
+ if (!part->inherits("KHTMLPart") )
+ {
+ kdError(6000) << "slotFind: part is a " << part->className() << ", can't do a search into it" << endl;
+ return;
+ }
+
+ // use the part's (possibly frame) widget as parent widget, so that it gets
+ // properly destroyed when the (possible) frame dies
+ if ( !d->m_findDialog ) {
+ d->m_findDialog = new KHTMLFind( part, part->widget(), "khtmlfind" );
+ connect( d->m_findDialog, SIGNAL( done() ),
+ this, SLOT( slotFindDone() ) );
+ connect( d->m_findDialog, SIGNAL( destroyed() ),
+ this, SLOT( slotFindDialogDestroyed() ) );
+ }
+
+ d->m_findDialog->setPart( part );
+ d->m_findDialog->setText( part->d->m_lastFindState.text );
+ d->m_findDialog->setCaseSensitive( part->d->m_lastFindState.caseSensitive );
+ d->m_findDialog->setDirection( part->d->m_lastFindState.direction );
+
+ d->m_findDialog->show();
+
+ d->m_paFind->setEnabled( false );
+}
+
+void KHTMLPart::slotFindDone()
+{
+ assert( d->m_findDialog );
+
+ KHTMLPart *part = d->m_findDialog->part();
+
+ // this code actually belongs into some saveState() method in
+ // KHTMLFind, but as we're saving into the private data section of
+ // the part we have to do it here (no way to access it from the outside
+ // as it is defined only in khtml_part.cpp) (Simon)
+ part->d->m_lastFindState.text = d->m_findDialog->getText();
+ part->d->m_lastFindState.caseSensitive = d->m_findDialog->case_sensitive();
+ part->d->m_lastFindState.direction = d->m_findDialog->get_direction();
+
+ d->m_paFind->setEnabled( true );
+}
+
+void KHTMLPart::slotFindDialogDestroyed()
+{
+ assert( sender() == d->m_findDialog );
+
+ d->m_findDialog = 0;
+ d->m_paFind->setEnabled( true );
+}
+
+void KHTMLPart::slotPrintFrame()
+{
+ if ( d->m_frames.count() == 0 )
+ return;
+
+ KParts::ReadOnlyPart *frame = currentFrame();
+ if (!frame)
+ return;
+
+ KParts::BrowserExtension *ext = KParts::BrowserExtension::childObject( frame );
+
+ if ( !ext )
+ return;
+
+ QMetaObject *mo = ext->metaObject();
+
+ int idx = mo->findSlot( "print()", TRUE );
+ if ( idx >= 0 ) {
+ QUObject o[ 1 ];
+ ext->qt_invoke( idx, o );
+ }
+}
+
+void KHTMLPart::slotSelectAll()
+{
+ KParts::ReadOnlyPart *part = currentFrame();
+ if (part && part->inherits("KHTMLPart"))
+ static_cast<KHTMLPart *>(part)->selectAll();
+}
+
+void KHTMLPart::startAutoScroll()
+{
+ connect(&d->m_scrollTimer, SIGNAL( timeout() ), this, SLOT( slotAutoScroll() ));
+ d->m_scrollTimer.start(100, false);
+}
+
+void KHTMLPart::stopAutoScroll()
+{
+ disconnect(&d->m_scrollTimer, SIGNAL( timeout() ), this, SLOT( slotAutoScroll() ));
+ if (d->m_scrollTimer.isActive())
+ d->m_scrollTimer.stop();
+}
+
+
+void KHTMLPart::slotAutoScroll()
+{
+ if (d->m_view)
+ d->m_view->doAutoScroll();
+ else
+ stopAutoScroll(); // Safety
+}
+
+void KHTMLPart::selectAll()
+{
+ NodeImpl *first;
+ if (d->m_doc->isHTMLDocument())
+ first = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
+ else
+ first = d->m_doc;
+ NodeImpl *next;
+
+ // Look for first text/cdata node that has a renderer
+ while ( first && !((first->nodeType() == Node::TEXT_NODE || first->nodeType() == Node::CDATA_SECTION_NODE) && first->renderer()) )
+ {
+ next = first->firstChild();
+ if ( !next ) next = first->nextSibling();
+ while( first && !next )
+ {
+ first = first->parentNode();
+ if ( first )
+ next = first->nextSibling();
+ }
+ first = next;
+ }
+
+ NodeImpl *last;
+ if (d->m_doc->isHTMLDocument())
+ last = static_cast<HTMLDocumentImpl*>(d->m_doc)->body();
+ else
+ last = d->m_doc;
+ // Look for last text/cdata node that has a renderer
+ while ( last && !((last->nodeType() == Node::TEXT_NODE || last->nodeType() == Node::CDATA_SECTION_NODE) && last->renderer()) )
+ {
+ next = last->lastChild();
+ if ( !next ) next = last->previousSibling();
+ while ( last && !next )
+ {
+ last = last->parentNode();
+ if ( last )
+ next = last->previousSibling();
+ }
+ last = next;
+ }
+
+ if ( !first || !last )
+ return;
+ Q_ASSERT(first->renderer());
+ Q_ASSERT(last->renderer());
+ d->m_selectionStart = first;
+ d->m_startOffset = 0;
+ d->m_selectionEnd = last;
+ d->m_endOffset = last->nodeValue().length();
+ d->m_startBeforeEnd = true;
+
+ d->m_doc->setSelection( d->m_selectionStart.handle(), d->m_startOffset,
+ d->m_selectionEnd.handle(), d->m_endOffset );
+
+ emitSelectionChanged();
+}
+
+bool KHTMLPart::checkLinkSecurity(const KURL &linkURL,const QString &message, const QString &button)
+{
+ // Security check on the link.
+ // KURL u( url ); Wrong!! Relative URL could be mis-interpreted!!! (DA)
+ QString linkProto = linkURL.protocol().lower();
+ QString proto = m_url.protocol().lower();
+
+ if ( !linkProto.isEmpty() && !proto.isEmpty() &&
+ ( linkProto == "cgi" || linkProto == "file" ) &&
+ proto != "file" && proto != "cgi" && proto != "man" && proto != "about")
+ {
+ Tokenizer *tokenizer = d->m_doc->tokenizer();
+ if (tokenizer)
+ tokenizer->setOnHold(true);
+
+ int response = KMessageBox::Cancel;
+ if (!message.isEmpty())
+ {
+ response = KMessageBox::warningContinueCancel( 0,
+ message.arg(linkURL.url()),
+ i18n( "Security Warning" ),
+ button);
+ }
+ else
+ {
+ KMessageBox::error( 0,
+ i18n( "<qt>This untrusted page contains a link<BR><B>%1</B><BR>to your local file system.").arg(linkURL.url()),
+ i18n( "Security Alert" ));
+ }
+
+ if (tokenizer)
+ tokenizer->setOnHold(false);
+ return (response==KMessageBox::Continue);
+ }
+ return true;
+}
+
+QVariant KHTMLPart::executeScript(QString filename, int baseLine, const DOM::Node &n, const QString &script)
+{
+#ifdef KJS_VERBOSE
+ kdDebug(6070) << "executeScript: filename=" << filename << " baseLine=" << baseLine << " script=" << script << endl;
+#endif
+ KJSProxy *proxy = jScript();
+
+ if (!proxy || proxy->paused())
+ return QVariant();
+ QVariant ret = proxy->evaluate(filename,baseLine,script, n );
+ DocumentImpl::updateDocumentsRendering();
+ return ret;
+}
+
+void KHTMLPart::slotPartRemoved( KParts::Part *part )
+{
+// kdDebug(6050) << "KHTMLPart::slotPartRemoved " << part << endl;
+ if ( part == d->m_activeFrame )
+ d->m_activeFrame = 0L;
+}
+
+void KHTMLPart::slotActiveFrameChanged( KParts::Part *part )
+{
+// kdDebug(6050) << "KHTMLPart::slotActiveFrameChanged part=" << part << endl;
+ if ( part == this )
+ {
+ kdError(6050) << "strange error! we activated ourselves" << endl;
+ assert( false );
+ return;
+ }
+// kdDebug(6050) << "KHTMLPart::slotActiveFrameChanged d->m_activeFrame=" << d->m_activeFrame << endl;
+ if ( d->m_activeFrame && d->m_activeFrame->widget() && d->m_activeFrame->widget()->inherits( "QFrame" ) )
+ {
+ QFrame *frame = static_cast<QFrame *>( d->m_activeFrame->widget() );
+ if (frame->frameStyle() != QFrame::NoFrame)
+ {
+ frame->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken);
+ frame->repaint();
+ }
+ }
+
+ d->m_activeFrame = part;
+
+ if ( d->m_activeFrame && d->m_activeFrame->widget()->inherits( "QFrame" ) )
+ {
+ QFrame *frame = static_cast<QFrame *>( d->m_activeFrame->widget() );
+ if (frame->frameStyle() != QFrame::NoFrame)
+ {
+ frame->setFrameStyle( QFrame::StyledPanel | QFrame::Plain);
+ frame->repaint();
+ }
+ kdDebug(6050) << "new active frame " << d->m_activeFrame << endl;
+ }
+
+ updateActions();
+
+ // (note: childObject returns 0 if the argument is 0)
+ d->m_extension->setExtensionProxy( KParts::BrowserExtension::childObject( d->m_activeFrame ) );
+}
+
+void KHTMLPart::setActiveNode(const DOM::Node &node)
+{
+ if (!d->m_doc || !d->m_view)
+ return;
+
+ // Set the document's active node
+ d->m_doc->setFocusNode(node.handle());
+
+ // Scroll the view if necessary to ensure that the new focus node is visible
+ QRect rect = node.handle()->getRect();
+ d->m_view->ensureVisible(rect.right(), rect.bottom());
+ d->m_view->ensureVisible(rect.left(), rect.top());
+}
+
+DOM::Node KHTMLPart::activeNode() const
+{
+ return DOM::Node(d->m_doc?d->m_doc->focusNode():0);
+}
+
+DOM::EventListener *KHTMLPart::createHTMLEventListener( QString code )
+{
+ KJSProxy *proxy = jScript();
+
+ if (!proxy)
+ return 0;
+
+ return proxy->createHTMLEventHandler( m_url.url(), code );
+}
+
+KHTMLPart *KHTMLPart::opener()
+{
+ return d->m_opener;
+}
+
+void KHTMLPart::setOpener(KHTMLPart *_opener)
+{
+ d->m_opener = _opener;
+}
+
+bool KHTMLPart::openedByJS()
+{
+ return d->m_openedByJS;
+}
+
+void KHTMLPart::setOpenedByJS(bool _openedByJS)
+{
+ d->m_openedByJS = _openedByJS;
+}
+
+void KHTMLPart::preloadStyleSheet(const QString &url, const QString &stylesheet)
+{
+ khtml::Cache::preloadStyleSheet(url, stylesheet);
+}
+
+void KHTMLPart::preloadScript(const QString &url, const QString &script)
+{
+ khtml::Cache::preloadScript(url, script);
+}
+
+QCString KHTMLPart::dcopObjectId() const
+{
+ QCString id;
+ id.sprintf("html-widget%d", d->m_dcop_counter);
+ return id;
+}
+
+long KHTMLPart::cacheId() const
+{
+ return d->m_cacheId;
+}
+
+bool KHTMLPart::restored() const
+{
+ return d->m_restored;
+}
+
+using namespace KParts;
+#include "khtml_part.moc"
+
diff --git a/WebCore/src/kdelibs/khtml/khtml_part.h b/WebCore/src/kdelibs/khtml/khtml_part.h
index ac73956..62594bf 100644
--- a/WebCore/src/kdelibs/khtml/khtml_part.h
+++ b/WebCore/src/kdelibs/khtml/khtml_part.h
@@ -23,9 +23,6 @@
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#ifdef APPLE_CHANGES
-#include "../../kwq/KWQKHTMLPart.h"
-#else /* APPLE_CHANGES not defined */
#ifndef __khtml_part_h__
#define __khtml_part_h__
@@ -44,6 +41,16 @@ class KHTMLView;
class KHTMLSettings;
class KJavaAppletContext;
+#ifdef APPLE_CHANGES
+#ifdef __OBJC__
+ at class IFURLHandle;
+ at class IFWebDataSource;
+#else
+typedef void IFURLHandle;
+typedef void IFWebDataSource;
+#endif
+#endif
+
namespace DOM
{
class HTMLDocument;
@@ -206,6 +213,7 @@ public:
*/
virtual bool closeURL();
+#ifndef APPLE_CHANGES
/**
* is called when a certain error situation (i.e. connection timed out) occured.
* default implementation either shows a KIO error dialog or loads a more verbose
@@ -213,6 +221,7 @@ public:
* @p job is the job that signaled the error situation
*/
virtual void showError(KIO::Job* job);
+#endif
/**
* Returns a reference to the DOM HTML document (for non-HTML documents, returns null)
@@ -350,11 +359,13 @@ public:
bool onlyLocalReferences() const;
#ifndef KDE_NO_COMPAT
+#ifndef APPLE_CHANGES
void enableJScript(bool e) { setJScriptEnabled(e); }
void enableJava(bool e) { setJavaEnabled(e); }
void enablePlugins(bool e) { setPluginsEnabled(e); }
void autoloadImages(bool e) { setAutoloadImages(e); }
void enableMetaRefresh(bool e) { setMetaRefreshEnabled(e); }
+#endif
bool setCharset( const QString &, bool ) { return true; }
KURL baseURL() const;
@@ -590,6 +601,7 @@ public:
*/
KParts::PartManager *partManager();
+#ifndef APPLE_CHANGES
/**
* Saves the KHTMLPart's complete state (including child frame
* objects) to the provided @ref QDataStream.
@@ -608,6 +620,7 @@ public:
* @ref browserExtension() .
**/
virtual void restoreState( QDataStream &stream );
+#endif
/**
* Returns the @p Node currently under the mouse
@@ -751,7 +764,9 @@ protected:
*/
void htmlError(int errorCode, const QString& text, const KURL& reqUrl);
+#ifndef APPLE_CHANGES
virtual void customEvent( QCustomEvent *event );
+#endif
/**
* Eventhandler of the khtml::MousePressEvent.
@@ -774,6 +789,7 @@ protected:
*/
virtual void khtmlDrawContentsEvent( khtml::DrawContentsEvent * );
+#ifndef APPLE_CHANGES
/**
* Internal reimplementation of KParts::Part::guiActivateEvent .
*/
@@ -783,10 +799,12 @@ protected:
* Internal empty reimplementation of @ref KParts::ReadOnlyPart::openFile .
*/
virtual bool openFile();
+#endif
virtual void urlSelected( const QString &url, int button, int state,
const QString &_target, KParts::URLArgs args = KParts::URLArgs());
+#ifndef APPLE_CHANGES
/**
* This method is called when a new embedded object (include html frames) is to be created.
* Reimplement it if you want to add support for certain embeddable objects without registering
@@ -799,6 +817,7 @@ protected:
QObject *parent, const char *name,
const QString &mimetype, QString &serviceName,
QStringList &serviceTypes, const QStringList ¶ms);
+#endif
public slots:
@@ -820,6 +839,8 @@ public slots:
QCString dcopObjectId() const;
+#ifndef APPLE_CHANGES
+
private slots:
/**
@@ -978,6 +999,8 @@ private slots:
*/
void slotClearSelection();
+#endif
+
private:
@@ -1046,7 +1069,13 @@ private:
DOM::EventListener *createHTMLEventListener( QString code );
DOM::HTMLDocumentImpl *docImpl() const;
+#ifdef APPLE_CHANGES
+public:
+#endif
DOM::DocumentImpl *xmlDocImpl() const;
+#ifdef APPLE_CHANGES
+private:
+#endif
khtml::ChildFrame *frame( const QObject *obj );
khtml::ChildFrame *recursiveFrameRequest( const KURL &url, const KParts::URLArgs &args, bool callParent = true );
@@ -1067,8 +1096,38 @@ private:
KHTMLPartPrivate *d;
friend class KHTMLPartPrivate;
-};
+#ifdef APPLE_CHANGES
+public:
+ // In the original KDE, these come from superclasses.
+ void ref() { _ref++; }
+ void deref() { if(_ref) _ref--; if(!_ref) delete this; }
+ bool event(QEvent *event);
+
+ // Additions.
+
+ bool gotoBaseAnchor();
+
+ void setView(KHTMLView *view);
+
+ void slotData(IFURLHandle *, const char *bytes, int length);
+
+ void setBaseURL(const KURL &);
+
+ QString documentSource() const;
+
+ QString sheetUsed() const;
+ void setSheetUsed(const QString &);
+
+ void setTitle(const DOM::DOMString &);
+
+ void setDataSource(IFWebDataSource *);
+ IFWebDataSource *getDataSource();
+
+private:
+ unsigned int _ref;
+#endif
+
+};
#endif
-#endif /* APPLE_CHANGES not defined */
diff --git a/WebCore/src/kwq/KWQKHTMLPart.h b/WebCore/src/kwq/KWQKHTMLPart.h
deleted file mode 100644
index 32b1410..0000000
--- a/WebCore/src/kwq/KWQKHTMLPart.h
+++ /dev/null
@@ -1,652 +0,0 @@
-/*
- * Copyright (C) 2001 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef __khtml_part_h__
-#define __khtml_part_h__
-
-#include <dom/html_document.h>
-#include <dom/dom2_range.h>
-
-#include <qregexp.h>
-
-#include <kparts/part.h>
-#include <kparts/browserextension.h>
-
-#include <khtml_events.h>
-
-#include <kjs_proxy.h>
-
-#include <rendering/render_frames.h>
-
-class KHTMLSettings;
-class KJavaAppletContext;
-class KJSProxy;
-class KHTMLPartPrivate;
-
-#ifdef APPLE_CHANGES
-#ifdef __OBJC__
- at class IFURLHandle;
- at class IFWebDataSource;
-#else
-typedef void IFURLHandle;
-typedef void IFWebDataSource;
-#endif
-#endif
-
-namespace DOM
-{
- class HTMLDocument;
- class HTMLDocumentImpl;
- class DocumentImpl;
- class Node;
-};
-
-namespace khtml
-{
- class ChildFrame {
- };
-};
-
-namespace KJS
-{
- class WindowFunc;
-}
-
-extern "C" {
- KJSProxy *kjs_html_init(KHTMLPart *khtmlpart);
-}
-
-class KHTMLPart : public KParts::ReadOnlyPart // a.k.a. WebPageDocument
-{
- friend class KJS::WindowFunc;
-public:
- /**
- * Construct a new @ref KHTMLPart.
- *
- * KHTML basically consists of two objects: The @ref KHTMLPart itself,
- * holding the document data (DOM document), and the @ref KHTMLView,
- * derived from @ref QScrollview, in which the document content is
- * rendered in. You can specify two different parent objects for a
- * @ref KHTMLPart, one parent for the @ref KHTMLPart document and on parent
- * for the @ref KHTMLView. If the second @p parent argument is 0L, then
- * @p parentWidget is used as parent for both objects, the part and
- * the view.
- */
- KHTMLPart();
-
- // Perhaps new constructor?
- KHTMLPart(const KURL &url );
-
- /**
- * Destructor.
- */
- virtual ~KHTMLPart();
-
- /**
- * Opens the specified URL @p url.
- *
- * Reimplemented from @ref KParts::ReadOnlyPart::openURL .
- */
- virtual bool openURL( const KURL &url );
-
- /**
- * Stop loading the document and kill all data requests (for images, etc.)
- */
- virtual bool closeURL();
-
- /**
- * Retrieve a reference to the DOM HTML document (for non-HTML documents, returns null)
- */
- DOM::HTMLDocument htmlDocument() const;
-
- /**
- * Retrieve a reference to the DOM document.
- */
- DOM::Document document() const;
-
- /**
- * Retrieve the node that has the keyboard focus
- */
- // DUBIOUS, selection and focus should be handled externally
- DOM::Node activeNode() const;
-
- /**
- * Enable/disable Javascript support. Note that this will
- * in either case permanently override the default usersetting.
- * If you want to have the default UserSettings, don't call this
- * method.
- */
- void setJScriptEnabled( bool enable );
-
- /**
- * Deprecated, use setJScriptEnabled instead.
- */
- void enableJScript( bool enable ); // ### KDE 3.0: removeme
-
- /**
- * Returns @p true if Javascript support is enabled or @p false
- * otherwise.
- */
- bool jScriptEnabled() const;
-
- /**
- * Enable/disable the automatic forwarding by <meta http-equiv="refresh" ....>
- */
- void enableMetaRefresh( bool enable );
-
- /**
- * Returns @p true if automtaic forwarding is enabled.
- */
- bool metaRefreshEnabled() const;
-
- /**
- * Execute the specified snippet of JavaScript code.
- *
- * Returns @p true if JavaScript was enabled, no error occured
- * and the code returned true itself or @p false otherwise.
- * @deprecated, use the one below.
- */
- // DUBIOUS, rather than executing the script this document should be
- // passed to the interpreter.
- QVariant executeScript( const QString &script );
-
- /**
- * Same as above except the Node parameter specifying the 'this' value.
- */
- // DUBIOUS, rather than executing the script this document should be
- // passed to the interpreter.
- QVariant executeScript( const DOM::Node &n, const QString &script );
-
- /**
- * Enable/disable Java applet support. Note that calling this function
- * will permanently override the User settings about Java applet support.
- * Not calling this function is the only way to let the default settings
- * apply.
- */
- void setJavaEnabled( bool enable );
- /**
- * Deprecated, use setJavaEnabled instead.
- */
- void enableJava( bool enable ); // ### KDE 3.0: removeme
-
- /**
- * Return if Java applet support is enabled/disabled.
- */
- bool javaEnabled() const;
-
- /**
- * Return the java context of the applets. If no applet exists, 0 is returned.
- */
- KJavaAppletContext *javaContext();
-
- /**
- * Return the java context of the applets. If no context exists yet, a new one is
- * created.
- */
- KJavaAppletContext *createJavaContext();
-
- /**
- * Deprecated. Use setPluginsEnabled instead.
- */
- void enablePlugins( bool enable ); // ### KDE 3.0: removeme
-
- /**
- * Enable or disable plugins via, default is enabled
- */
- void setPluginsEnabled( bool enable );
-
- /**
- * Return if plugins are enabled/disabled.
- */
- bool pluginsEnabled() const;
-
- /**
- * Deprecated. Use setAutoloadImages instead.
- */
- void autoloadImages( bool enable ); // ### KDE 3.0: removeme
- /**
- * Specify whether images contained in the document should be loaded
- * automatically or not.
- *
- * @note Request will be ignored if called before @ref begin().
- */
- void setAutoloadImages( bool enable );
- /**
- * Return whether images contained in the document are loaded automatically
- * or not.
- * @note that the returned information is unrelieable as long as no begin()
- * was called.
- */
- bool autoloadImages() const;
-
- /**
- * Security option
- *
- * Specify whether only local references ( stylesheets, images, scripts, subdocuments )
- * should be loaded. ( default false - everything is loaded, if the more specific
- * options allow )
- */
- void setOnlyLocalReferences(bool enable);
-
- /**
- * Return whether references should be loaded ( default false )
- **/
- bool onlyLocalReferences() const;
-
- /**
- * Clear the widget and prepares it for new content.
- *
- * If you want @ref url() to return
- * for example "file:/tmp/test.html", you can use the following code:
- * <PRE>
- * view->begin( KURL("file:/tmp/test.html" ) );
- * </PRE>
- *
- * @param url is the url of the document to be displayed. Even if you
- * are generating the HTML on the fly, it may be useful to specify
- * a directory so that any pixmaps are found.
- *
- * @param xOffset is the initial horizontal scrollbar value. Usually
- * you don't want to use this.
- *
- * @param yOffset is the initial vertical scrollbar value. Usually
- * you don't want to use this.
- *
- * All child frames and the old document are removed if you call
- * this method.
- */
- virtual void begin( const KURL &url = KURL(), int xOffset = 0, int yOffset = 0 );
-
- /**
- * Write another part of the HTML code to the widget.
- *
- * You may call
- * this function many times in sequence. But remember: The fewer calls
- * you make, the faster the widget will be.
- *
- * The HTML code is send through a decoder which decodes the stream to
- * Unicode.
- *
- * The @p len parameter is needed for streams encoded in utf-16,
- * since these can have \0 chars in them. In case the encoding
- * you're using isn't utf-16, you can safely leave out the length
- * parameter.
- *
- * Attention: Don't mix calls to @ref write( const char *) with calls
- * to @ref write( const QString & ).
- *
- * The result might not be what you want.
- */
- virtual void write( const char *str, int len = -1 );
-
- /**
- * Write another part of the HTML code to the widget.
- *
- * You may call
- * this function many times in sequence. But remember: The fewer calls
- * you make, the faster the widget will be.
- */
- virtual void write( const QString &str );
-
- /**
- * Call this after your last call to @ref write().
- */
- virtual void end();
-
- /* Mainly used internally.
- *
- * Sets the document's base URL.
- */
- void setBaseURL( const KURL &url );
-
- /**
- * Retrieve the base URL of this document
- *
- * The base URL is ususally set by a <base url=...>
- * tag in the document head. If no base tag is set, the url of the current
- * document serves as base url and is returned.
- */
- KURL baseURL() const;
-
- /**
- * Mainly used internally.
- *
- *Sets the document's base target.
- */
- void setBaseTarget( const QString &target );
-
- /**
- * Retrieve the base target of this document.
- *
- * The base target is ususally set by a <base target=...>
- * tag in the document head.
- */
- QString baseTarget() const;
-
- /**
- * Set the charset to use for displaying HTML pages.
- *
- * If override is @p true,
- * it will override charset specifications of the document.
- */
- bool setCharset( const QString &name, bool override = false );
-
- /**
- * Set the encoding the page uses.
- *
- * This can be different from the charset. The widget will try to reload the current page in the new
- * encoding, if url() is not empty.
- */
- bool setEncoding( const QString &name, bool override = false );
-
- /**
- * return the encoding the page currently uses.
- *
- * Note that the encoding might be different from the charset.
- */
- QString encoding(); // ### KDE 3.0: make const
-
- /**
- * Set a user defined style sheet to be used on top of the HTML 4
- * default style sheet.
- *
- * This gives a wide range of possibilities to
- * change the layout of the page.
- */
- void setUserStyleSheet(const KURL &url);
-
- /**
- * Set a user defined style sheet to be used on top of the HTML 4
- * default style sheet.
- *
- * This gives a wide range of possibilities to
- * change the layout of the page.
- */
- void setUserStyleSheet(const QString &styleSheet);
-
- /**
- * Set point sizes to be associated with the HTML-sizes used in
- * <FONT size=Html-Font-Size>
- *
- * Html-Font-Sizes range from 0 (smallest) to 6 (biggest), but you
- * can specify up to 15 font sizes, the bigger ones will get used,
- * if <font size=+1> extends over 7, or if a 'font-size: larger'
- * style declaration gets into this region.
- *
- * They are related to the CSS font sizes by 0 == xx-small to 6 == xx-large. */
- void setFontSizes(const QValueList<int> &newFontSizes );
-
- /**
- * Get point sizes to be associated with the HTML-sizes used in
- * <FONT size=Html-Font-Size>
- *
- * Html-Font-Sizes range from 0 (smallest) to 6 (biggest).
- *
- * They are related to the CSS font sizes by 0 == xx-small to 6 == xx-large.
- */
- QValueList<int> fontSizes() const;
-
- /**
- * Reset the point sizes to be associated with the HTML-sizes used in
- * <FONT size=Html-Font-Size> to their default.
- *
- * Html-Font-Sizes range from 0 (smallest) to 6 (biggest).
- */
- void resetFontSizes();
-
- /**
- * Set the standard font style.
- *
- * @param name The font name to use for standard text.
- */
- void setStandardFont( const QString &name );
-
- /**
- * Set the fixed font style.
- *
- * @param name The font name to use for fixed text, e.g.
- * the <tt><pre></tt> tag.
- */
- void setFixedFont( const QString &name );
-
- /**
- * Find the anchor named @p name.
- *
- * If the anchor is found, the widget
- * scrolls to the closest position. Returns @p if the anchor has
- * been found.
- */
- bool gotoAnchor( const QString &name );
- bool gotoBaseAnchor();
-
- /**
- * Set the cursor to use when the cursor is on a link.
- */
- void setURLCursor( const QCursor &c );
-
- /**
- * Retrieve the cursor which is used when the cursor is on a link.
- */
- const QCursor& urlCursor() const; // ### KDE 3.0: change return type to plain QCursor
-
- /**
- * Initiate a text search.
- */
- // DUBIOUS, perhaps searching should be handled externally
- void findTextBegin();
-
- /**
- * Find the next occurrance of the expression.
- */
- // DUBIOUS, perhaps searching should be handled externally
- bool findTextNext( const QRegExp &exp, bool forward );
-
- /**
- * Find the next occurence of the string.
- */
- // DUBIOUS, perhaps searching should be handled externally
- bool findTextNext( const QString &str, bool forward, bool caseSensitive );
-
- /**
- * Returns the current zoom factor.
- */
- int zoomFactor() const;
-
- /**
- * Get the text the user has marked.
- */
- // DUBIOUS, perhaps selection should be managed externally
- virtual QString selectedText() const;
-
- /**
- * Retrieve the selected part of the HTML.
- */
- // DUBIOUS, perhaps selection should be managed externally
- DOM::Range selection() const;
-
- /**
- * set the current selection
- */
- // DUBIOUS, perhaps selection should be managed externally
- void setSelection( const DOM::Range & );
-
- /**
- * Has the user selected anything?
- *
- * Call @ref selectedText() to
- * retrieve the selected text.
- *
- * @return @p true if there is text selected.
- */
- // DUBIOUS, perhaps selection should be managed externally
- bool hasSelection() const;
-
- /**
- * Marks all text in the document as selected.
- */
- // DUBIOUS, perhaps selection should be managed externally
- void selectAll();
-
- /**
- * Called by KJS.
- * Sets the StatusBarText assigned
- * via window.status
- */
- void setJSStatusBarText( const QString &text );
-
- /**
- * Called by KJS.
- * Sets the DefaultStatusBarText assigned
- * via window.defaultStatus
- */
- void setJSDefaultStatusBarText( const QString &text );
-
- /**
- * Referrer used for links in this page.
- */
- QString referrer() const;
-
- /**
- * Last-modified date (in raw string format), if received in the [HTTP] headers.
- */
- QString lastModified() const;
-
- /**
- * Called by KJS.
- * Returns the StatusBarText assigned
- * via window.status
- */
- QString jsStatusBarText() const;
-
- /**
- * Called by KJS.
- * Returns the DefaultStatusBarText assigned
- * via window.defaultStatus
- */
- QString jsDefaultStatusBarText() const;
-
- // Most of the following should be NOT be called, but must be implemented because
- // of existing references.
-
- // This should be private.
- KHTMLSettings *settings();
-
- QVariant executeScript(QString filename, int baseLine, const DOM::Node &n, const QString &script);
-
- // This should be private.
- KJSProxy *jScript();
-
- // This should be private.
- KURL completeURL( const QString &url );
-
- // This should be private.
-
- // This should be private.
- const KURL & url() const;
-
- // The following are only present to get khtml to build.
- void scheduleRedirection( int delay, const QString &url ); // ### KDE 3.0: make private?
- KHTMLView *view() const;
- void setView(KHTMLView *view);
- QWidget *widget();
- KHTMLPart *opener();
- KHTMLPart *parentPart();
- DOM::DocumentImpl *xmlDocImpl() const;
- const QPtrList<KParts::ReadOnlyPart> frames() const;
- KHTMLPart *findFrame( const QString &f );
- void setOpener(KHTMLPart *_opener);
- bool openedByJS();
- void setOpenedByJS(bool _openedByJS);
- KParts::BrowserExtension *browserExtension() const;
- DOM::EventListener *createHTMLEventListener( QString code );
- QString requestFrameName();
- bool frameExists( const QString &frameName );
- bool requestFrame( khtml::RenderPart *frame, const QString &url, const QString &frameName,
- const QStringList &args = QStringList(), bool isIFrame = false );
- void emitUnloadEvent();
- virtual void submitForm( const char *action, const QString &url, const QByteArray &formData,
- const QString &target, const QString& contentType = QString::null,
- const QString& boundary = QString::null ); // ### KDE 3.0: make private
- virtual void urlSelected( const QString &url, int button = 0, int state = 0,
- const QString &_target = QString::null ); // ### KDE 3.0: make private
-
- bool requestObject( khtml::RenderPart *frame, const QString &url, const QString &serviceType,
- const QStringList &args = QStringList() );
-
- bool requestObject( khtml::ChildFrame *frame, const KURL &url, const KParts::URLArgs &args = KParts::URLArgs() );
-
- void nodeActivated(const DOM::Node &);
- QVariant executeScheduledScript();
- void stopAutoScroll();
- virtual void overURL( const QString &url, const QString &target ); // ### KDE 3.0: make private (merge)
-
- bool event( QEvent *event );
- void khtmlMousePressEvent( khtml::MousePressEvent *event );
- void khtmlMouseDoubleClickEvent( khtml::MouseDoubleClickEvent * );
- void khtmlMouseMoveEvent( khtml::MouseMoveEvent *event );
- void khtmlMouseReleaseEvent( khtml::MouseReleaseEvent *event );
- void khtmlDrawContentsEvent( khtml::DrawContentsEvent * );
-
- QString sheetUsed() const;
- void setSheetUsed(const QString&);
-
-#ifdef APPLE_CHANGES
- QString documentSource();
-
- void init();
-
- void ref() { _ref++; }
- void deref() { if(_ref) _ref--; if(!_ref) delete this; }
-
-
- void slotData(IFURLHandle *handle, const char *bytes, int length);
-#endif
-
- // this function checks to see whether a base URI and all its
- // associated sub-URIs have loaded
- void checkCompleted();
-
-#ifdef APPLE_CHANGES
- // Not retained.
- void setDataSource(IFWebDataSource *d) { dataSource = d; }
- IFWebDataSource *getDataSource() { return dataSource; }
-
- void setTitle(const DOM::DOMString &);
-#endif
-
-private:
-
- KHTMLPartPrivate *d;
- // DUBIOUS, why are impls being referenced?
- DOM::HTMLDocumentImpl *docImpl() const;
-
-#ifdef APPLE_CHANGES
- IFWebDataSource *dataSource;
- QValueList<QString> plugins;
- unsigned int _ref;
-#endif
-};
-
-
-#endif
diff --git a/WebCore/src/kwq/KWQKHTMLPart.mm b/WebCore/src/kwq/KWQKHTMLPart.mm
index f5d535b..fcc91df 100644
--- a/WebCore/src/kwq/KWQKHTMLPart.mm
+++ b/WebCore/src/kwq/KWQKHTMLPart.mm
@@ -48,7 +48,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#include <kwqdebug.h>
#include <decoder.h>
@@ -73,13 +72,15 @@
#include <loader.h>
#include <kjs/interpreter.h>
#include <kjs/collector.h>
+#include <ecma/kjs_proxy.h>
#include <kjs_dom.h>
#include <dom_doc.h>
#include <qcursor.h>
#include <kurl.h>
#include <khtmlview.h>
-#include <KWQKHTMLPart.h>
+#include <khtml_part.h>
+#include <khtml_events.h>
#import <WCPluginWidget.h>
@@ -169,6 +170,10 @@ public:
#endif
QString m_sheetUsed;
+
+ QValueList<QString> plugins;
+
+ IFWebDataSource *m_dataSource;
KHTMLPartPrivate(KHTMLPart *part)
{
@@ -195,6 +200,8 @@ public:
m_documentSource = "";
m_decodingStarted = 0;
+
+ m_dataSource = 0;
}
~KHTMLPartPrivate()
@@ -238,17 +245,7 @@ static QString splitUrlTarget(const QString &url, QString *target=0)
return result;
}
-KHTMLPart::KHTMLPart()
-{
- init();
-}
-
-KHTMLPart::KHTMLPart(const KURL &url)
-{
- init();
-}
-
-void KHTMLPart::init()
+KHTMLPart::KHTMLPart( QWidget *, const char *, QObject *, const char *, GUIProfile )
{
d = new KHTMLPartPrivate(this);
_ref = 1;
@@ -323,6 +320,8 @@ bool KHTMLPart::metaRefreshEnabled() const
return TRUE;
}
+extern "C" { KJSProxy *kjs_html_init(KHTMLPart *khtmlpart); }
+
KJSProxy *KHTMLPart::jScript()
{
if (!jScriptEnabled()) return 0;
@@ -692,8 +691,7 @@ bool KHTMLPart::gotoAnchor( const QString &name )
return true;
}
-
-KHTMLSettings *KHTMLPart::settings()
+const KHTMLSettings *KHTMLPart::settings() const
{
return d->m_settings;
}
@@ -708,16 +706,11 @@ KURL KHTMLPart::completeURL(const QString &url)
return KURL( d->m_doc->completeURL( url ) );
}
-void KHTMLPart::scheduleRedirection( int delay, const QString &url )
+void KHTMLPart::scheduleRedirection( int delay, const QString &url, bool )
{
_logNeverImplemented();
}
-bool KHTMLPart::setCharset( const QString &name, bool override = false )
-{
- _logNeverImplemented();
- return FALSE;
-}
bool KHTMLPart::setEncoding( const QString &name, bool override )
{
@@ -747,7 +740,7 @@ bool KHTMLPart::setEncoding( const QString &name, bool override )
#endif /* not APPLE_CHANGES */
}
-QString KHTMLPart::encoding()
+QString KHTMLPart::encoding() const
{
_logNeverImplemented();
return d->m_settings->encoding();
@@ -781,7 +774,7 @@ void KHTMLPart::setURLCursor( const QCursor &c )
// FIXME: this should be removed
static const QCursor *staticURLCursor = NULL;
-const QCursor& KHTMLPart::urlCursor() const
+QCursor KHTMLPart::urlCursor() const
{
_logNeverImplemented();
if (staticURLCursor == NULL) {
@@ -806,20 +799,6 @@ void KHTMLPart::findTextBegin()
_logNeverImplemented();
}
-bool KHTMLPart::findTextNext( const QRegExp &exp, bool forward )
-{
-// DUBIOUS, perhaps searching should be handled externally
- _logNeverImplemented();
- return FALSE;
-}
-
-bool KHTMLPart::findTextNext( const QString &str, bool forward, bool caseSensitive )
-{
-// DUBIOUS, perhaps searching should be handled externally
- _logNeverImplemented();
- return FALSE;
-}
-
QString KHTMLPart::selectedText() const
{
// DUBIOUS, perhaps selection should be managed externally
@@ -847,12 +826,7 @@ void KHTMLPart::setSelection( const DOM::Range & )
_logNeverImplemented();
}
-void KHTMLPart::overURL( const QString &url, const QString &target)
-{
- _logNeverImplemented();
-}
-
-void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target)
+void KHTMLPart::urlSelected( const QString &url, int button, int state, const QString &_target, KParts::URLArgs )
{
_logNeverImplemented();
}
@@ -947,10 +921,10 @@ bool KHTMLPart::requestObject( khtml::RenderPart *frame, const QString &url, con
// requestObject can be called multiple times for a single plug-in.
// The plugins array is an attempt to avoid multiple creations of the same plug-in.
// FIXME: Can't have multiple plug-ins with the same URL on a page
- if(!plugins.contains(url)) {
+ if(!d->plugins.contains(url)) {
WCPluginWidget *pluginWidget = new WCPluginWidget(completeURL(url).url(), serviceType, args, d->m_baseURL.url());
frame->setWidget(pluginWidget);
- plugins.append(url);
+ d->plugins.append(url);
}
return true;
}
@@ -1112,7 +1086,7 @@ QString KHTMLPart::jsDefaultStatusBarText() const
return QString();
}
-const QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
+QPtrList<KParts::ReadOnlyPart> KHTMLPart::frames() const
{
_logNeverImplemented();
@@ -1566,7 +1540,7 @@ void KHTMLPart::setOpenedByJS(bool _openedByJS)
_logNeverImplemented();
}
-QString KHTMLPart::documentSource()
+QString KHTMLPart::documentSource() const
{
return d->m_documentSource;
}
@@ -1591,28 +1565,11 @@ KURL KHTMLPart::baseURL() const
return d->m_baseURL;
}
-const KURL & KHTMLPart::url() const
-{
- return d->m_workingURL;
-}
-
void KHTMLPart::setView(KHTMLView *view)
{
d->m_view = view;
}
-QWidget *KHTMLPart::widget()
-{
- _logNotYetImplemented();
- return 0L;
-}
-
-
-void KHTMLPart::emitUnloadEvent()
-{
- _logNeverImplemented();
-}
-
void KHTMLPart::nodeActivated(const DOM::Node &aNode)
{
KWQDEBUG ("name %s = %s\n", (const char *)aNode.nodeName().string(), (const char *)aNode.nodeValue().string());
@@ -1625,7 +1582,7 @@ void KHTMLPart::stopAutoScroll()
void KHTMLPart::setTitle(const DOMString &title)
{
- [dataSource _setTitle:(NSString *)title.string().getCFMutableString()];
+ [getDataSource() _setTitle:(NSString *)title.string().getCFMutableString()];
}
QString KHTMLPart::sheetUsed() const
@@ -1642,3 +1599,13 @@ int KHTMLPart::zoomFactor(void) const
{
return 100;
}
+
+void KHTMLPart::setDataSource(IFWebDataSource *dataSource)
+{
+ d->m_dataSource = dataSource; // not retained
+}
+
+IFWebDataSource *KHTMLPart::getDataSource()
+{
+ return d->m_dataSource;
+}
diff --git a/WebCore/src/kwq/KWQKHTMLSettings.mm b/WebCore/src/kwq/KWQKHTMLSettings.mm
index c84defd..06af5aa 100644
--- a/WebCore/src/kwq/KWQKHTMLSettings.mm
+++ b/WebCore/src/kwq/KWQKHTMLSettings.mm
@@ -150,7 +150,7 @@ const QValueList<int> &KHTMLSettings::fontSizes() const
}
-bool KHTMLSettings::changeCursor()
+bool KHTMLSettings::changeCursor() const
{
_logNotYetImplemented();
return FALSE;
diff --git a/WebCore/src/kwq/KWQKloader.mm b/WebCore/src/kwq/KWQKloader.mm
index 25e6fbe..69845d1 100644
--- a/WebCore/src/kwq/KWQKloader.mm
+++ b/WebCore/src/kwq/KWQKloader.mm
@@ -1190,7 +1190,7 @@ void Loader::load(DocLoader* dl, CachedObject *object, bool incremental = true)
#if APPLE_CHANGES
id client;
- id dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
+ IFWebDataSource *dataSource = ((KHTMLPart *)(((DocLoader *)(object->loader()))->part()))->getDataSource();
client = [[[URLLoadClient alloc] initWithLoader:this dataSource: dataSource] autorelease];
req->client = client;
#endif
diff --git a/WebCore/src/kwq/KWQView.mm b/WebCore/src/kwq/KWQView.mm
index 701ac6c..cef4d6b 100644
--- a/WebCore/src/kwq/KWQView.mm
+++ b/WebCore/src/kwq/KWQView.mm
@@ -170,16 +170,13 @@
- (void)layout
{
- if (((KHTMLView *)widget)->part()->xmlDocImpl() &&
- ((KHTMLView *)widget)->part()->xmlDocImpl()->renderer()){
- if (needsLayout){
+ if (needsLayout){
#ifndef xNDEBUG
- double start = CFAbsoluteTimeGetCurrent();
+ double start = CFAbsoluteTimeGetCurrent();
#endif
- ((KHTMLView *)widget)->layout();
- KWQDEBUGLEVEL (KWQ_LOG_TIMING, "layout time %e\n", CFAbsoluteTimeGetCurrent() - start);
- needsLayout = NO;
- }
+ ((KHTMLView *)widget)->layout();
+ KWQDEBUGLEVEL (KWQ_LOG_TIMING, "layout time %e\n", CFAbsoluteTimeGetCurrent() - start);
+ needsLayout = NO;
}
}
diff --git a/WebCore/src/kwq/khtml/khtml_settings.h b/WebCore/src/kwq/khtml/khtml_settings.h
index 008f576..b1430bf 100644
--- a/WebCore/src/kwq/khtml/khtml_settings.h
+++ b/WebCore/src/kwq/khtml/khtml_settings.h
@@ -67,7 +67,7 @@ public:
const QValueList<int> &fontSizes() const;
- bool changeCursor();
+ bool changeCursor() const;
bool isFormCompletionEnabled() const;
int maxFormCompletionItems() const;
diff --git a/WebCore/src/libwebcore.exp b/WebCore/src/libwebcore.exp
index 606f001..05b4d0f 100644
--- a/WebCore/src/libwebcore.exp
+++ b/WebCore/src/libwebcore.exp
@@ -9,11 +9,11 @@ ___11QMouseEventQ26QEvent4TypeRC6QPointii
___4KURLPCci
___6QPointii
___8QPainterP7QWidget
-___9KHTMLPart
+___9KHTMLPartP7QWidgetPCcP7QObjectPCcQ29KHTMLPart10GUIProfile
___9KHTMLViewP9KHTMLPartP7QWidgetPCc
_deref__9KHTMLPart
_deref__Q23DOM9DomShared
-_documentSource__9KHTMLPart
+_documentSource__C9KHTMLPart
_flushAll__Q25khtml5Cache
_getStatistics__Q25khtml5Cache
_getView__C7QWidget
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 5737b9d..95b509a 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,13 @@
+2002-04-16 Darin Adler <darin at apple.com>
+
+ * WebView.subproj/IFBaseWebControllerPrivate.mm: Include khtml_part.h instead
+ of KWQKHTMLPart.h.
+
+ * WebView.subproj/IFWebFrame.mm: Include khtml_part.h instead of KWQKHTMLPart.h.
+
+ * WebView.subproj/IFWebDataSource.mm: (-[IFWebDataSource documentTextFromDOM]):
+ Remove an unneeded cast and an extra retain/autorelease.
+
in 2002-04-16 Darin Adler <darin at apple.com>
* WebView.subproj/IFWebFrame.h:
diff --git a/WebKit/ChangeLog-2002-12-03 b/WebKit/ChangeLog-2002-12-03
index 5737b9d..95b509a 100644
--- a/WebKit/ChangeLog-2002-12-03
+++ b/WebKit/ChangeLog-2002-12-03
@@ -1,3 +1,13 @@
+2002-04-16 Darin Adler <darin at apple.com>
+
+ * WebView.subproj/IFBaseWebControllerPrivate.mm: Include khtml_part.h instead
+ of KWQKHTMLPart.h.
+
+ * WebView.subproj/IFWebFrame.mm: Include khtml_part.h instead of KWQKHTMLPart.h.
+
+ * WebView.subproj/IFWebDataSource.mm: (-[IFWebDataSource documentTextFromDOM]):
+ Remove an unneeded cast and an extra retain/autorelease.
+
in 2002-04-16 Darin Adler <darin at apple.com>
* WebView.subproj/IFWebFrame.h:
diff --git a/WebKit/WebView.subproj/IFBaseWebControllerPrivate.mm b/WebKit/WebView.subproj/IFBaseWebControllerPrivate.mm
index b618d68..6dac93b 100644
--- a/WebKit/WebView.subproj/IFBaseWebControllerPrivate.mm
+++ b/WebKit/WebView.subproj/IFBaseWebControllerPrivate.mm
@@ -12,7 +12,7 @@
#import <WebFoundation/IFError.h>
#import <WebFoundation/IFURLCacheLoaderConstants.h>
-#import <KWQKHTMLPart.h>
+#import <khtml_part.h>
#import <rendering/render_frames.h>
#import <WebKit/WebKitDebug.h>
diff --git a/WebKit/WebView.subproj/IFWebDataSource.mm b/WebKit/WebView.subproj/IFWebDataSource.mm
index 5e2d7ee..521c7b5 100644
--- a/WebKit/WebView.subproj/IFWebDataSource.mm
+++ b/WebKit/WebView.subproj/IFWebDataSource.mm
@@ -235,13 +235,10 @@ static id IFWebDataSourceMake(void *url)
KHTMLPart *part = [self _part];
if (part != 0){
- doc = (DOM::DocumentImpl *)[self _part]->xmlDocImpl();
+ doc = [self _part]->xmlDocImpl();
if (doc != 0){
QString str = doc->recursive_toHTML(1);
string = QSTRING_TO_NSSTRING(str);
-
- // Ensure life of NSString to end of call frame.
- [[string retain] autorelease];
}
}
if (string == nil) {
diff --git a/WebKit/WebView.subproj/IFWebFrame.mm b/WebKit/WebView.subproj/IFWebFrame.mm
index 23b993e..38c3106 100644
--- a/WebKit/WebView.subproj/IFWebFrame.mm
+++ b/WebKit/WebView.subproj/IFWebFrame.mm
@@ -15,7 +15,7 @@
#import <WebKit/WebKitDebug.h>
-#include <KWQKHTMLPart.h>
+#include <khtml_part.h>
#include <rendering/render_frames.h>
@implementation IFWebFrame
diff --git a/WebKit/WebView.subproj/WebDataSource.m b/WebKit/WebView.subproj/WebDataSource.m
index 5e2d7ee..521c7b5 100644
--- a/WebKit/WebView.subproj/WebDataSource.m
+++ b/WebKit/WebView.subproj/WebDataSource.m
@@ -235,13 +235,10 @@ static id IFWebDataSourceMake(void *url)
KHTMLPart *part = [self _part];
if (part != 0){
- doc = (DOM::DocumentImpl *)[self _part]->xmlDocImpl();
+ doc = [self _part]->xmlDocImpl();
if (doc != 0){
QString str = doc->recursive_toHTML(1);
string = QSTRING_TO_NSSTRING(str);
-
- // Ensure life of NSString to end of call frame.
- [[string retain] autorelease];
}
}
if (string == nil) {
diff --git a/WebKit/WebView.subproj/WebFrame.m b/WebKit/WebView.subproj/WebFrame.m
index 23b993e..38c3106 100644
--- a/WebKit/WebView.subproj/WebFrame.m
+++ b/WebKit/WebView.subproj/WebFrame.m
@@ -15,7 +15,7 @@
#import <WebKit/WebKitDebug.h>
-#include <KWQKHTMLPart.h>
+#include <khtml_part.h>
#include <rendering/render_frames.h>
@implementation IFWebFrame
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list