[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kfm-devel
Subject:    KHTMLFactory redesign
From:       David Faure <faure () kde ! org>
Date:       2007-11-26 17:05:46
Message-ID: 200711261805.46517.faure () kde ! org
[Download RAW message or body]

We've always gotten some trouble from the fact that KHTMLFactory has a dual purpose;
being the KParts::Factory (when khtmlpart is dlopened, e.g. in konqueror), and
being the repository for a bunch of global things needed by khtml.

I've separated those two things, creating a KHTMLGlobal for the global stuff and \
leaving the KHTMLFactory to being the kparts factory only. It solves some life-cycle \
issues and allows to remove the ugly bool clone from the constructor. Apart from that \
the patch is mainly a s/KHTMLFactory::/KHTMLGlobal::/ everywhere since the khtml code \
only cares about those global things, not about the actual factory. But I also \
improved the refcounting mechanism which is now in KHTMLGlobal, so that we can debug \
the famous assert a bit more easily: ref/deref are no more public, the API is now \
limited to registerPart/deregisterPart and \
registerDocumentImpl/deregisterDocumentImpl. This allows to be more verbose when the \
assert fails and to say:

konqueror(31854)/khtml KHTMLGlobal::finalCheck: 1 docs not deleted
konqueror(31854)/khtml KHTMLGlobal::finalCheck: Document \
DOM::HTMLDocumentImpl(0x10f8330) wasn't deleted

OK, I still have on idea why the documentimpl itself has one ref too many so \
KHTMLPart::clear() unrefs it but doesn't destroy it, but at least I'm more confident \
about the KHTMLFactory/KHTMLGlobal side of things now :)

OK with me committing? (BTW KHTMLFactory was exported but not installed, it was only \
used by testkhtml and test_regression, which I ported; this change is completely \
SC/BC). After that, I'll try to keep debugging the assert, but I'm not sure how....

-- 
David Faure, faure@kde.org, sponsored by Trolltech to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).


["khtmlfactory.diff" (text/x-diff)]

Index: khtml_settings.cc
===================================================================
--- khtml_settings.cc	(revision 741807)
+++ khtml_settings.cc	(working copy)
@@ -59,6 +59,7 @@ struct KPerDomainSettings {
 #endif
 };
 
+QString *KHTMLSettings::avFamilies = 0;
 typedef QMap<QString,KPerDomainSettings> PolicyMap;
 
 class KHTMLSettingsPrivate
Index: khtml_settings.h
===================================================================
--- khtml_settings.h	(revision 741807)
+++ khtml_settings.h	(working copy)
@@ -222,7 +222,7 @@ public:
     bool jsPopupBlockerPassivePopup() const;
 
 private:
-    friend class KHTMLFactory;
+    friend class KHTMLGlobal;
     QString lookupFont(int i) const;
 
     KHTMLSettingsPrivate* const d;
Index: khtmlview.cpp
===================================================================
--- khtmlview.cpp	(revision 741807)
+++ khtmlview.cpp	(working copy)
@@ -247,10 +247,9 @@ public:
 	accessKeysActivated = false;
 	accessKeysPreActivate = false;
 
-        // We ref/deref to ensure defaultHTMLSettings is available
-        KHTMLFactory::ref();
-        accessKeysEnabled = \
                KHTMLFactory::defaultHTMLSettings()->accessKeysEnabled();
-        KHTMLFactory::deref();
+        // defaultHTMLSettings is available since a KHTMLPart has been created first
+        // and has ref()'ed the factory for us.
+        accessKeysEnabled = KHTMLGlobal::defaultHTMLSettings()->accessKeysEnabled();
 
         emitCompletedAfterRepaint = CSNone;
         m_mouseEventsTarget = 0;
@@ -555,6 +554,7 @@ void KHTMLView::delayedInit()
         setHasStaticBackground();
 }
 
+// called by KHTMLPart::clear()
 void KHTMLView::clear()
 {
 #ifndef KHTML_NO_CARET
@@ -1353,7 +1353,7 @@ void KHTMLView::mouseMoveEvent( QMouseEv
           case LINK_NEWWINDOW:  cursorIcon = "window-new";       break;
           default:              cursorIcon = "dialog-error";     break;
 	}
-        QPixmap icon_pixmap = KHTMLFactory::iconLoader()->loadIcon( cursorIcon, \
KIconLoader::Small, 0, KIconLoader::DefaultState, QStringList(), 0, true ); +        \
QPixmap icon_pixmap = KHTMLGlobal::iconLoader()->loadIcon( cursorIcon, \
KIconLoader::Small, 0, KIconLoader::DefaultState, QStringList(), 0, true );  
 #if 0
 	if (d->cursor_icon_widget)
Index: testkhtml.cpp
===================================================================
--- testkhtml.cpp	(revision 741807)
+++ testkhtml.cpp	(working copy)
@@ -20,12 +20,10 @@
 #include "dom/html_document.h"
 #include "dom/dom_exception.h"
 #include <stdio.h>
-#define protected public
-#include "khtml_factory.h"
-#undef protected
 #include "css/cssstyleselector.h"
 #include "html/html_imageimpl.h"
 #include "rendering/render_style.h"
+#include "khtml_global.h"
 #include <kxmlguiwindow.h>
 #include <kcmdlineargs.h>
 #include <ktoggleaction.h>
@@ -49,9 +47,7 @@ int main(int argc, char *argv[])
 	::exit( 1 );
     }
 
-#ifndef __KDE_HAVE_GCC_VISIBILITY
-    KHTMLFactory *fac = new KHTMLFactory(true);
-#endif
+    KHTMLGlobal *fac = new KHTMLGlobal;
 
     KXmlGuiWindow *toplevel = new KXmlGuiWindow();
     KHTMLPart *doc = new KHTMLPart( toplevel, toplevel, KHTMLPart::BrowserViewGUI );
@@ -127,9 +123,7 @@ int main(int argc, char *argv[])
 
 
     int ret = a.exec();
-#ifndef __KDE_HAVE_GCC_VISIBILITY
-    fac->deref();
-#endif
+    delete fac;
     return ret;
 }
 
Index: misc/loader.cpp
===================================================================
--- misc/loader.cpp	(revision 741807)
+++ misc/loader.cpp	(working copy)
@@ -69,8 +69,9 @@
 #include <kiconloader.h>
 #include <scheduler.h>
 #include <kdebug.h>
-#include "khtml_factory.h"
-#include "khtml_part.h"
+
+#include <khtml_global.h>
+#include <khtml_part.h>
 
 #ifdef IMAGE_TITLES
 #include <qfile.h>
@@ -406,7 +407,7 @@ CachedImage::CachedImage(DocLoader* dl, 
     setAccept( acceptHeader );
     m_showAnimations = dl->showAnimations();
 
-    if ( KHTMLFactory::defaultHTMLSettings()->isAdFiltered( url.string() ) ) {
+    if ( KHTMLGlobal::defaultHTMLSettings()->isAdFiltered( url.string() ) ) {
         m_wasBlocked = true;
         CachedObject::finish();
     }
@@ -1118,8 +1119,8 @@ CachedCSSStyleSheet *DocLoader::requestS
 CachedScript *DocLoader::requestScript( const DOM::DOMString &url, const QString& \
charset)  {
     DOCLOADER_SECCHECK(true);
-    if ( ! KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(fullURL.host()) \
                ||
-           KHTMLFactory::defaultHTMLSettings()->isAdFiltered(fullURL.url()))
+    if ( ! KHTMLGlobal::defaultHTMLSettings()->isJavaScriptEnabled(fullURL.host()) \
|| +           KHTMLGlobal::defaultHTMLSettings()->isAdFiltered(fullURL.url()))
 	return 0L;
 
     CachedScript* s = Cache::requestObject<CachedScript, CachedObject::Script>( \
this, fullURL, 0 ); @@ -1443,7 +1444,7 @@ void Cache::init()
         nullPixmap = new QPixmap;
 
     if ( !brokenPixmap )
-        brokenPixmap = new \
QPixmap(KHTMLFactory::iconLoader()->loadIcon("image-missing", KIconLoader::Desktop, \
16, KIconLoader::DisabledState)); +        brokenPixmap = new \
QPixmap(KHTMLGlobal::iconLoader()->loadIcon("image-missing", KIconLoader::Desktop, \
16, KIconLoader::DisabledState));  
     if ( !blockedPixmap ) {
         blockedPixmap = new QPixmap();
Index: khtmlview.h
===================================================================
Index: khtml_factory_init.cpp
===================================================================
--- khtml_factory_init.cpp	(revision 741807)
+++ khtml_factory_init.cpp	(working copy)
@@ -1,38 +0,0 @@
-/* This file is part of the KDE project
- *
- * Copyright (C) 2000 Simon Hausmann <hausmann@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., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "khtml_factory.h"
-
-extern "C" KDE_EXPORT void *init_libkhtmlpart()
-{
-    // We can't use a plain self() here, because that would
-    // return the global factory, which might already exist
-    // at the time init_libkhtmlpart is called! As soon as someone
-    // does new KHTMLPart() in his application and loads up
-    // an html document into that part which either embeds
-    // embeds another KHTMLPart instance via <object> or
-    // as html frame, then we cannot return self(), as
-    // what we return here is what the KLibLoader deletes
-    // in the end, and we don't want the libloader to
-    // delete our global instance. Anyway, the new
-    // KHTMLFactory we create here is very cheap :)
-    // (Simon)
-    return new KHTMLFactory( true );
-}
Index: khtmlpart_p.h
===================================================================
--- khtmlpart_p.h	(revision 741807)
+++ khtmlpart_p.h	(working copy)
@@ -42,7 +42,7 @@
 
 #include "html/html_formimpl.h"
 #include "khtml_run.h"
-#include "khtml_factory.h"
+#include "khtml_global.h"
 #include "khtml_events.h"
 #include "khtml_ext.h"
 #include "khtml_settings.h"
@@ -151,7 +151,7 @@ public:
     m_bLoadEventEmitted = true;
     m_cachePolicy = KIO::CC_Verify;
     m_manager = 0L;
-    m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
+    m_settings = new KHTMLSettings(*KHTMLGlobal::defaultHTMLSettings());
     m_bClearing = false;
     m_bCleared = false;
     m_zoomFactor = 100;
Index: khtml_ext.cpp
===================================================================
--- khtml_ext.cpp	(revision 741807)
+++ khtml_ext.cpp	(working copy)
@@ -59,7 +59,7 @@
 #include <kdesktopfile.h>
 #include <kinputdialog.h>
 #include <ktemporaryfile.h>
-#include "khtml_factory.h"
+#include "khtml_global.h"
 #include <kstandardaction.h>
 #include <kactioncollection.h>
 #include <kactionmenu.h>
@@ -611,7 +611,7 @@ KHTMLPopupGUIClient::KHTMLPopupGUIClient
             action->setSeparator(true);
             menu->addAction(action);
 
-            if ( KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled() ) {
+            if ( KHTMLGlobal::defaultHTMLSettings()->isAdFilterEnabled() ) {
                 if ( khtml->d->m_frame->m_type == khtml::ChildFrame::IFrame ) {
                     action = new KAction( i18n( "Block IFrame..." ), this );
                     d->m_actionCollection->addAction( "blockiframe", action );
@@ -671,7 +671,7 @@ KHTMLPopupGUIClient::KHTMLPopupGUIClient
         connect( action, SIGNAL(triggered(bool)), this, SLOT( slotViewImage() ) );
         partActions.append(action);
 
-        if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled()) {
+        if (KHTMLGlobal::defaultHTMLSettings()->isAdFilterEnabled()) {
             action = new KAction( i18n( "Block Image..." ), this );
             d->m_actionCollection->addAction( "blockimage", action );
             connect( action, SIGNAL(triggered(bool)), this, SLOT( slotBlockImage() ) \
); @@ -750,7 +750,7 @@ void KHTMLPopupGUIClient::slotSaveImageA
 void KHTMLPopupGUIClient::slotBlockHost()
 {
     QString name=d->m_imageURL.protocol()+"://"+d->m_imageURL.host()+"/*";
-    KHTMLFactory::defaultHTMLSettings()->addAdFilter( name );
+    KHTMLGlobal::defaultHTMLSettings()->addAdFilter( name );
     d->m_khtml->reparseConfiguration();
 }
 
@@ -763,7 +763,7 @@ void KHTMLPopupGUIClient::slotBlockImage
                                          d->m_imageURL.url(),
                                          &ok);
     if ( ok ) {
-        KHTMLFactory::defaultHTMLSettings()->addAdFilter( url );
+        KHTMLGlobal::defaultHTMLSettings()->addAdFilter( url );
         d->m_khtml->reparseConfiguration();
     }
 }
@@ -776,7 +776,7 @@ void KHTMLPopupGUIClient::slotBlockIFram
                                                d->m_khtml->url().url(),
                                                &ok );
     if ( ok ) {
-        KHTMLFactory::defaultHTMLSettings()->addAdFilter( url );
+        KHTMLGlobal::defaultHTMLSettings()->addAdFilter( url );
         d->m_khtml->reparseConfiguration();
     }
 }
Index: khtml_global.h
===================================================================
--- khtml_global.h	(revision 0)
+++ khtml_global.h	(revision 0)
@@ -0,0 +1,84 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
+ * Copyright (C) 2007 David Faure <faure@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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KHTML_GLOBAL_H
+#define KHTML_GLOBAL_H
+
+#include <khtml_export.h>
+
+#include <kparts/historyprovider.h>
+#include <kurl.h>
+
+class KComponentData;
+class KIconLoader;
+class KAboutData;
+class HistoryProvider;
+class KHTMLSettings;
+class KHTMLPart;
+
+namespace DOM
+{
+  class DocumentImpl;
+}
+
+/**
+ * @internal
+ * Exported for khtml test programs, but not installed
+ */
+class KHTML_EXPORT KHTMLGlobal
+{
+public:
+    KHTMLGlobal();
+    ~KHTMLGlobal();
+
+    static void registerPart( KHTMLPart *part );
+    static void deregisterPart( KHTMLPart *part );
+
+    static void registerDocumentImpl( DOM::DocumentImpl *doc );
+    static void deregisterDocumentImpl( DOM::DocumentImpl *doc );
+
+    static const KComponentData &componentData();
+    static KIconLoader *iconLoader();
+
+    static KHTMLSettings *defaultHTMLSettings();
+
+    // list of visited URLs
+    static KParts::HistoryProvider *vLinks() {
+        return KParts::HistoryProvider::self();
+    }
+
+    // Called when khtml part is unloaded
+    static void finalCheck();
+
+private:
+    static void ref();
+    static void deref();
+private:
+    static unsigned long s_refcnt;
+    static KHTMLGlobal *s_self;
+    static KComponentData *s_componentData;
+    static KIconLoader *s_iconLoader;
+    static KAboutData *s_about;
+    static KHTMLSettings *s_settings;
+};
+
+#endif
+
Index: khtml_part.cpp
===================================================================
--- khtml_part.cpp	(revision 741807)
+++ khtml_part.cpp	(working copy)
@@ -57,6 +57,7 @@ using namespace DOM;
 
 #include "khtmlview.h"
 #include <kparts/partmanager.h>
+#include <kparts/factory.h>
 #include "ecma/kjs_proxy.h"
 #include "ecma/kjs_window.h"
 #include "khtml_settings.h"
@@ -209,10 +210,10 @@ KHTMLPart::KHTMLPart( QWidget *parentWid
 : KParts::ReadOnlyPart( parent )
 {
     d = 0;
-    KHTMLFactory::registerPart( this );
-    setComponentData(  KHTMLFactory::componentData(), prof == BrowserViewGUI && \
!parentPart() ); +    KHTMLGlobal::registerPart( this );
+    setComponentData(  KHTMLGlobal::componentData(), prof == BrowserViewGUI && \
!parentPart() );  // TODO KDE4 - don't load plugins yet
-    //setComponentData( KHTMLFactory::componentData(), false );
+    //setComponentData( KHTMLGlobal::componentData(), false );
     init( new KHTMLView( this, parentWidget ), prof );
 }
 
@@ -220,10 +221,10 @@ KHTMLPart::KHTMLPart( KHTMLView *view, Q
 : KParts::ReadOnlyPart( parent )
 {
     d = 0;
-    KHTMLFactory::registerPart( this );
-    setComponentData(  KHTMLFactory::componentData(), prof == BrowserViewGUI && \
!parentPart() ); +    KHTMLGlobal::registerPart( this );
+    setComponentData(  KHTMLGlobal::componentData(), prof == BrowserViewGUI && \
!parentPart() );  // TODO KDE4 - don't load plugins yet
-    //setComponentData( KHTMLFactory::componentData(), false );
+    //setComponentData( KHTMLGlobal::componentData(), false );
     assert( view );
     init( view, prof );
 }
@@ -467,7 +468,7 @@ void KHTMLPart::init( KHTMLView *view, G
 
 KHTMLPart::~KHTMLPart()
 {
-  //kDebug(6050) << "KHTMLPart::~KHTMLPart " << this;
+  kDebug(6050) << this;
   KConfigGroup config( KGlobal::config(), "HTML Settings" );
   config.writeEntry( "AutomaticDetectionLanguage", int(d->m_autoDetectLanguage) );
 
@@ -515,7 +516,7 @@ KHTMLPart::~KHTMLPart()
   if (!parentPart()) // only delete d->m_frame if the top khtml_part closes
       delete d->m_frame;
   delete d; d = 0;
-  KHTMLFactory::deregisterPart( this );
+  KHTMLGlobal::deregisterPart( this );
 }
 
 bool KHTMLPart::restoreURL( const KUrl &url )
@@ -539,10 +540,10 @@ bool KHTMLPart::restoreURL( const KUrl &
   d->m_workingURL = url;
 
   // set the java(script) flags according to the current host.
-  d->m_bJScriptEnabled = \
                KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
-  setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
-  d->m_bJavaEnabled = \
                KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
-  d->m_bPluginsEnabled = \
KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host()); +  \
d->m_bJScriptEnabled = \
KHTMLGlobal::defaultHTMLSettings()->isJavaScriptEnabled(url.host()); +  \
setDebugScript( KHTMLGlobal::defaultHTMLSettings()->isJavaScriptDebugEnabled() ); +  \
d->m_bJavaEnabled = KHTMLGlobal::defaultHTMLSettings()->isJavaEnabled(url.host()); +  \
d->m_bPluginsEnabled = \
KHTMLGlobal::defaultHTMLSettings()->isPluginsEnabled(url.host());  
   setUrl(url);
 
@@ -602,7 +603,7 @@ bool KHTMLPart::openUrl( const KUrl &url
     if (userAgent != KProtocolManager::userAgentForHost(QString())) {
       if (!d->m_statusBarUALabel) {
         d->m_statusBarUALabel = new KUrlLabel(d->m_statusBarExtension->statusBar());
-        d->m_statusBarUALabel->setFixedHeight(KHTMLFactory::iconLoader()->currentSize(KIconLoader::Small));
 +        d->m_statusBarUALabel->setFixedHeight(KHTMLGlobal::iconLoader()->currentSize(KIconLoader::Small));
                
         d->m_statusBarUALabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, \
QSizePolicy::Fixed));  d->m_statusBarUALabel->setUseCursor(false);
         d->m_statusBarExtension->addStatusBarItem(d->m_statusBarUALabel, 0, false);
@@ -752,10 +753,10 @@ bool KHTMLPart::openUrl( const KUrl &url
     d->m_statusBarText[BarOverrideText] = d->m_statusBarText[BarDefaultText] = \
QString();  
   // set the javascript flags according to the current url
-  d->m_bJScriptEnabled = \
                KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(url.host());
-  setDebugScript( KHTMLFactory::defaultHTMLSettings()->isJavaScriptDebugEnabled() );
-  d->m_bJavaEnabled = \
                KHTMLFactory::defaultHTMLSettings()->isJavaEnabled(url.host());
-  d->m_bPluginsEnabled = \
KHTMLFactory::defaultHTMLSettings()->isPluginsEnabled(url.host()); +  \
d->m_bJScriptEnabled = \
KHTMLGlobal::defaultHTMLSettings()->isJavaScriptEnabled(url.host()); +  \
setDebugScript( KHTMLGlobal::defaultHTMLSettings()->isJavaScriptDebugEnabled() ); +  \
d->m_bJavaEnabled = KHTMLGlobal::defaultHTMLSettings()->isJavaEnabled(url.host()); +  \
d->m_bPluginsEnabled = \
KHTMLGlobal::defaultHTMLSettings()->isPluginsEnabled(url.host());  
 
   connect( d->m_job, SIGNAL( speed( KJob*, unsigned long ) ),
@@ -1863,10 +1864,10 @@ void KHTMLPart::begin( const KUrl &url, 
 
   if(url.isValid()) {
       QString urlString = url.url();
-      KHTMLFactory::vLinks()->insert( urlString );
+      KHTMLGlobal::vLinks()->insert( urlString );
       QString urlString2 = url.prettyUrl();
       if ( urlString != urlString2 ) {
-          KHTMLFactory::vLinks()->insert( urlString2 );
+          KHTMLGlobal::vLinks()->insert( urlString2 );
       }
   }
 
@@ -1907,14 +1908,14 @@ void KHTMLPart::begin( const KUrl &url, 
   if (!d->m_doc->attached())
     d->m_doc->attach( );
   d->m_doc->setBaseURL( KUrl() );
-  d->m_doc->docLoader()->setShowAnimations( \
KHTMLFactory::defaultHTMLSettings()->showAnimations() ); +  \
d->m_doc->docLoader()->setShowAnimations( \
KHTMLGlobal::defaultHTMLSettings()->showAnimations() );  emit docCreated();
 
   d->m_paUseStylesheet->setItems(QStringList());
   d->m_paUseStylesheet->setEnabled( false );
 
-  setAutoloadImages( KHTMLFactory::defaultHTMLSettings()->autoLoadImages() );
-  QString userStyleSheet = KHTMLFactory::defaultHTMLSettings()->userStyleSheet();
+  setAutoloadImages( KHTMLGlobal::defaultHTMLSettings()->autoLoadImages() );
+  QString userStyleSheet = KHTMLGlobal::defaultHTMLSettings()->userStyleSheet();
   if ( !userStyleSheet.isEmpty() )
     setUserStyleSheet( KUrl( userStyleSheet ) );
 
@@ -4568,7 +4569,7 @@ KParts::ReadOnlyPart *KHTMLPart::createP
   {
     KService::Ptr service = (*it);
 
-    KPluginLoader loader( *service, KHTMLFactory::componentData() );
+    KPluginLoader loader( *service, KHTMLGlobal::componentData() );
     KPluginFactory* const factory = loader.factory();
     if ( factory ) {
       KParts::ReadOnlyPart *res = 0L;
@@ -5803,7 +5804,7 @@ void KHTMLPart::slotLoadImages()
 
 void KHTMLPart::reparseConfiguration()
 {
-  KHTMLSettings *settings = KHTMLFactory::defaultHTMLSettings();
+  KHTMLSettings *settings = KHTMLGlobal::defaultHTMLSettings();
   settings->init();
 
   setAutoloadImages( settings->autoLoadImages() );
@@ -5819,14 +5820,14 @@ void KHTMLPart::reparseConfiguration()
   d->m_metaRefreshEnabled = settings->isAutoDelayedActionsEnabled ();
 
   delete d->m_settings;
-  d->m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
+  d->m_settings = new KHTMLSettings(*KHTMLGlobal::defaultHTMLSettings());
 
   QApplication::setOverrideCursor( Qt::WaitCursor );
   khtml::CSSStyleSelector::reparseConfiguration();
   if(d->m_doc) d->m_doc->updateStyleSelector();
   QApplication::restoreOverrideCursor();
 
-  if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled())
+  if (KHTMLGlobal::defaultHTMLSettings()->isAdFilterEnabled())
      runAdFilter();
 }
 
@@ -6649,13 +6650,13 @@ void KHTMLPart::runAdFilter()
         if ( obj->type() == khtml::CachedObject::Image ) {
             khtml::CachedImage *image = static_cast<khtml::CachedImage *>(obj);
             bool wasBlocked = image->m_wasBlocked;
-            image->m_wasBlocked = KHTMLFactory::defaultHTMLSettings()->isAdFiltered( \
d->m_doc->completeURL( image->url().string() ) ); +            image->m_wasBlocked = \
KHTMLGlobal::defaultHTMLSettings()->isAdFiltered( d->m_doc->completeURL( \
image->url().string() ) );  if ( image->m_wasBlocked != wasBlocked )
                 image->do_notify(QRect(QPoint(0,0), image->pixmap_size()));
         }
     }
 
-    if ( KHTMLFactory::defaultHTMLSettings()->isHideAdsEnabled() ) {
+    if ( KHTMLGlobal::defaultHTMLSettings()->isHideAdsEnabled() ) {
         for ( NodeImpl *nextNode, *node = d->m_doc; node; node = nextNode ) {
 
             // We might be deleting 'node' shortly.
@@ -6665,7 +6666,7 @@ void KHTMLPart::runAdFilter()
                  node->id() == ID_IFRAME ||
                  (node->id() == ID_INPUT && static_cast<HTMLInputElementImpl \
*>(node)->inputType() == HTMLInputElementImpl::IMAGE ))  {
-                if ( KHTMLFactory::defaultHTMLSettings()->isAdFiltered( \
d->m_doc->completeURL( static_cast<ElementImpl \
*>(node)->getAttribute(ATTR_SRC).string() ) ) ) +                if ( \
KHTMLGlobal::defaultHTMLSettings()->isAdFiltered( d->m_doc->completeURL( \
static_cast<ElementImpl *>(node)->getAttribute(ATTR_SRC).string() ) ) )  {
                     // We found an IMG, IFRAME or INPUT (of type IMAGE) matching a \
filter.  node->ref();
@@ -7113,7 +7114,7 @@ void KHTMLPart::walletOpened(KWallet::Wa
 
   if (!d->m_statusBarWalletLabel) {
     d->m_statusBarWalletLabel = new KUrlLabel(d->m_statusBarExtension->statusBar());
-    d->m_statusBarWalletLabel->setFixedHeight(KHTMLFactory::iconLoader()->currentSize(KIconLoader::Small));
 +    d->m_statusBarWalletLabel->setFixedHeight(KHTMLGlobal::iconLoader()->currentSize(KIconLoader::Small));
                
     d->m_statusBarWalletLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, \
QSizePolicy::Fixed));  d->m_statusBarWalletLabel->setUseCursor(false);
     d->m_statusBarExtension->addStatusBarItem(d->m_statusBarWalletLabel, 0, false);
@@ -7248,7 +7249,7 @@ void KHTMLPart::setSuppressedPopupIndica
 
     if ( enable && !d->m_statusBarPopupLabel ) {
         d->m_statusBarPopupLabel = new KUrlLabel( \
                d->m_statusBarExtension->statusBar() );
-        d->m_statusBarPopupLabel->setFixedHeight( \
KHTMLFactory::iconLoader()->currentSize( KIconLoader::Small) ); +        \
d->m_statusBarPopupLabel->setFixedHeight( KHTMLGlobal::iconLoader()->currentSize( \
                KIconLoader::Small) );
         d->m_statusBarPopupLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, \
QSizePolicy::Fixed ));  d->m_statusBarPopupLabel->setUseCursor( false );
         d->m_statusBarExtension->addStatusBarItem( d->m_statusBarPopupLabel, 0, \
                false );
Index: khtml_factory.cpp
===================================================================
--- khtml_factory.cpp	(revision 741807)
+++ khtml_factory.cpp	(working copy)
@@ -1,6 +1,7 @@
 /* This file is part of the KDE project
  *
  * Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
+ * Copyright (C) 2007 David Faure <faure@kde.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -19,81 +20,24 @@
  */
 
 #include "khtml_factory.h"
+#include "khtml_global.h"
 #include "khtml_part.h"
-#include "khtml_settings.h"
 
-#include "css/cssstyleselector.h"
-#include "html/html_imageimpl.h"
-#include "rendering/render_style.h"
-#include "rendering/break_lines.h"
-#include "misc/loader.h"
-#include "misc/arena.h"
-#include "misc/paintbuffer.h"
-
-#include <QtCore/QLinkedList>
-
-#include <kcomponentdata.h>
-#include <kiconloader.h>
-#include <kaboutdata.h>
-#include <klocale.h>
-
-#include <assert.h>
-
-#include <kdebug.h>
-
-KHTMLFactory *KHTMLFactory::s_self = 0;
-unsigned long int KHTMLFactory::s_refcnt = 0;
-KComponentData *KHTMLFactory::s_componentData = 0;
-KIconLoader *KHTMLFactory::s_iconLoader = 0;
-KAboutData *KHTMLFactory::s_about = 0;
-KHTMLSettings *KHTMLFactory::s_settings = 0;
-QLinkedList<KHTMLPart*> *KHTMLFactory::s_parts = 0;
-QString *KHTMLSettings::avFamilies = 0;
-
-KHTMLFactory::KHTMLFactory( bool clone )
+KHTMLFactory::KHTMLFactory()
 {
-    if ( clone )
-        ref();
+    kDebug(6000) << this;
 }
 
 KHTMLFactory::~KHTMLFactory()
 {
-    if ( s_self == this )
-    {
-        assert( !s_refcnt );
-
-        delete s_iconLoader;
-        delete s_componentData;
-        delete s_about;
-        delete s_settings;
-	delete KHTMLSettings::avFamilies;
-        if ( s_parts )
-        {
-            assert( s_parts->isEmpty() );
-            delete s_parts;
-        }
-
-        s_iconLoader = 0;
-        s_componentData = 0;
-        s_about = 0;
-        s_settings = 0;
-        s_parts = 0;
-	KHTMLSettings::avFamilies = 0;
-
-        // clean up static data
-        khtml::CSSStyleSelector::clear();
-        khtml::RenderStyle::cleanup();
-        khtml::PaintBuffer::cleanup();
-        khtml::Cache::clear();
-        khtml::cleanup_thaibreaks();
-        khtml::ArenaFinish();
-    }
-    else
-        deref();
+    kDebug(6000) << this;
+    // Called when khtml part is unloaded; check that we didn't leak anything
+    KHTMLGlobal::finalCheck();
 }
 
-KParts::Part *KHTMLFactory::createPartObject( QWidget *parentWidget, QObject \
*parent, const char *className, const QStringList & ) +KParts::Part * \
KHTMLFactory::createPartObject( QWidget *parentWidget, QObject *parent, const char \
*className, const QStringList &args )  {
+    Q_UNUSED(args);
   KHTMLPart::GUIProfile prof = KHTMLPart::DefaultGUI;
   if ( strcmp( className, "Browser/View" ) == 0 )
     prof = KHTMLPart::BrowserViewGUI;
@@ -101,106 +45,9 @@ KParts::Part *KHTMLFactory::createPartOb
   return new KHTMLPart( parentWidget, parent, prof );
 }
 
-void KHTMLFactory::ref()
-{
-    if ( !s_refcnt && !s_self )
-    {
-        // we can't use a staticdeleter here, because that would mean
-        // that the factory gets deleted from within a qPostRoutine, called
-        // from the QApplication destructor. That however is too late, because
-        // we want to destruct a KComponentData object, which involves destructing
-        // a KConfig object, which might call KGlobal::dirs() (in sync()) which
-        // probably is not going to work ;-)
-        // well, perhaps I'm wrong here, but as I'm unsure I try to stay on the
-        // safe side ;-) -> let's use a simple reference counting scheme
-        // (Simon)
-        s_self = new KHTMLFactory;
-        khtml::Cache::init();
-    }
-
-    s_refcnt++;
-}
-
-void KHTMLFactory::deref()
-{
-    if ( !--s_refcnt && s_self )
-    {
-        delete s_self;
-        s_self = 0;
-    }
-}
-
-void KHTMLFactory::registerPart( KHTMLPart *part )
-{
-    if ( !s_parts )
-        s_parts = new QLinkedList<KHTMLPart*>;
-
-    if ( !s_parts->contains( part ) )
-    {
-        s_parts->append( part );
-        ref();
-    }
-}
-
-void KHTMLFactory::deregisterPart( KHTMLPart *part )
-{
-    assert( s_parts );
-
-    if ( s_parts->removeAll( part ) )
-    {
-        if ( s_parts->isEmpty() )
-        {
-            delete s_parts;
-            s_parts = 0;
-        }
-        deref();
-    }
-}
-
-const KComponentData &KHTMLFactory::componentData()
-{
-  assert( s_self );
-
-  if ( !s_componentData )
-  {
-    s_about = new KAboutData( "khtml", 0, ki18n( "KHTML" ), "4.0",
-                              ki18n( "Embeddable HTML component" ),
-                              KAboutData::License_LGPL );
-    s_about->addAuthor(ki18n("Lars Knoll"), KLocalizedString(), "knoll@kde.org");
-    s_about->addAuthor(ki18n("Antti Koivisto"), KLocalizedString(), \
                "koivisto@kde.org");
-    s_about->addAuthor(ki18n("Waldo Bastian"), KLocalizedString(), \
                "bastian@kde.org");
-    s_about->addAuthor(ki18n("Dirk Mueller"), KLocalizedString(), \
                "mueller@kde.org");
-    s_about->addAuthor(ki18n("Peter Kelly"), KLocalizedString(), "pmk@kde.org");
-    s_about->addAuthor(ki18n("Torben Weis"), KLocalizedString(), "weis@kde.org");
-    s_about->addAuthor(ki18n("Martin Jones"), KLocalizedString(), "mjones@kde.org");
-    s_about->addAuthor(ki18n("Simon Hausmann"), KLocalizedString(), \
                "hausmann@kde.org");
-    s_about->addAuthor(ki18n("Tobias Anton"), KLocalizedString(), \
                "anton@stud.fbi.fh-darmstadt.de");
-
-    s_componentData = new KComponentData( s_about );
-  }
-
-  return *s_componentData;
-}
-
-KIconLoader *KHTMLFactory::iconLoader()
+extern "C" KDE_EXPORT void *init_libkhtmlpart()
 {
-  if ( !s_iconLoader )
-  {
-    s_iconLoader = new KIconLoader(componentData().componentName(), \
                componentData().dirs());
-  }
-
-  return s_iconLoader;
+    return new KHTMLFactory;
 }
 
-KHTMLSettings *KHTMLFactory::defaultHTMLSettings()
-{
-  assert( s_self );
-  if ( !s_settings )
-    s_settings = new KHTMLSettings();
-
-  return s_settings;
-}
-
-using namespace KParts;
 #include "khtml_factory.moc"
-
Index: html/htmlparser.cpp
===================================================================
--- html/htmlparser.cpp	(revision 741807)
+++ html/htmlparser.cpp	(working copy)
@@ -50,7 +50,7 @@
 #include <html/htmltokenizer.h>
 #include <khtmlview.h>
 #include <khtml_part.h>
-#include <khtml_factory.h>
+#include <khtml_global.h>
 #include <css/cssproperties.h>
 #include <css/cssvalues.h>
 #include <css/csshelper.h>
@@ -892,11 +892,11 @@ NodeImpl *KHTMLParser::getElement(Token*
         break;
     case ID_INPUT:
         if ( t->attrs &&
-             KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled() &&
-             KHTMLFactory::defaultHTMLSettings()->isHideAdsEnabled() &&
+             KHTMLGlobal::defaultHTMLSettings()->isAdFilterEnabled() &&
+             KHTMLGlobal::defaultHTMLSettings()->isHideAdsEnabled() &&
              !strcasecmp( t->attrs->getValue( ATTR_TYPE ), "image" ) )
         {
-            if (KHTMLFactory::defaultHTMLSettings()->isAdFiltered( \
doc()->completeURL( khtml::parseURL(t->attrs->getValue(ATTR_SRC)).string() ) )) +     \
if (KHTMLGlobal::defaultHTMLSettings()->isAdFiltered( doc()->completeURL( \
khtml::parseURL(t->attrs->getValue(ATTR_SRC)).string() ) ))  return 0;
         }
         n = new HTMLInputElementImpl(document, form);
@@ -1020,11 +1020,11 @@ NodeImpl *KHTMLParser::getElement(Token*
 // images
     case ID_IMG:
         if (t->attrs&&
-            KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled()&&
-            KHTMLFactory::defaultHTMLSettings()->isHideAdsEnabled())
+            KHTMLGlobal::defaultHTMLSettings()->isAdFilterEnabled()&&
+            KHTMLGlobal::defaultHTMLSettings()->isHideAdsEnabled())
         {
             QString url = doc()->completeURL( \
                khtml::parseURL(t->attrs->getValue(ATTR_SRC)).string() );
-            if (KHTMLFactory::defaultHTMLSettings()->isAdFiltered(url))
+            if (KHTMLGlobal::defaultHTMLSettings()->isAdFiltered(url))
                 return 0;
         }
         n = new HTMLImageElementImpl(document, form);
Index: html/html_documentimpl.cpp
===================================================================
--- html/html_documentimpl.cpp	(revision 741807)
+++ html/html_documentimpl.cpp	(working copy)
@@ -39,7 +39,7 @@
 #include "xml/xml_tokenizer.h"
 #include "xml/dom2_eventsimpl.h"
 
-#include "khtml_factory.h"
+#include <khtml_global.h>
 #include "rendering/render_object.h"
 #include "dom/dom_exception.h"
 
@@ -80,12 +80,12 @@ HTMLDocumentImpl::HTMLDocumentImpl(DOMIm
     m_doAutoFill = false;
 
 /* dynamic history stuff to be fixed later (pfeiffer)
-    connect( KHTMLFactory::vLinks(), SIGNAL( removed( const QString& )),
+    connect( KHTMLGlobal::vLinks(), SIGNAL( removed( const QString& )),
              SLOT( slotHistoryChanged() ));
 */
-    connect( KHTMLFactory::vLinks(), SIGNAL( inserted( const QString& ) ),
+    connect( KHTMLGlobal::vLinks(), SIGNAL( inserted( const QString& ) ),
              SLOT( slotHistoryChanged() ));
-    connect( KHTMLFactory::vLinks(), SIGNAL( cleared()),
+    connect( KHTMLGlobal::vLinks(), SIGNAL( cleared()),
              SLOT( slotHistoryChanged() ));
 }
 
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(revision 741807)
+++ CMakeLists.txt	(working copy)
@@ -251,7 +251,7 @@ set(khtml_LIB_SRCS
    khtmlview.cpp
    khtml_part.cpp
    khtml_run.cpp
-   khtml_factory.cpp
+   khtml_global.cpp
    khtml_settings.cc
    khtml_events.cpp
    khtml_ext.cpp
@@ -330,7 +330,7 @@ install(TARGETS khtml DESTINATION ${LIB_
 
 ########### khtmlpart ###############
 
-set(khtmlpart_PART_SRCS khtml_factory_init.cpp )
+set(khtmlpart_PART_SRCS khtml_factory.cpp )
 
 
 kde4_add_plugin(khtmlpart WITH_PREFIX ${khtmlpart_PART_SRCS})
Index: rendering/font.cpp
===================================================================
--- rendering/font.cpp	(revision 741807)
+++ rendering/font.cpp	(working copy)
@@ -36,7 +36,7 @@
 #  endif
 #endif
 
-#include <khtml_factory.h>
+#include <khtml_global.h>
 #include <khtml_settings.h>
 
 #include <kdebug.h>
@@ -430,7 +430,7 @@ bool Font::isFontScalable(QFontDatabase&
 
 void Font::update(int logicalDpiY) const
 {
-    f.setFamily( fontDef.family.isEmpty() ? \
KHTMLFactory::defaultHTMLSettings()->stdFontName() : fontDef.family ); +    \
f.setFamily( fontDef.family.isEmpty() ? \
KHTMLGlobal::defaultHTMLSettings()->stdFontName() : fontDef.family );  f.setItalic( \
fontDef.italic );  f.setWeight( fontDef.weight );
 
Index: khtml_global.cpp
===================================================================
--- khtml_global.cpp	(revision 0)
+++ khtml_global.cpp	(revision 0)
@@ -0,0 +1,245 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
+ * Copyright (C) 2007 David Faure <faure@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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "khtml_global.h"
+#include "khtml_part.h"
+#include "khtml_settings.h"
+
+#include "css/cssstyleselector.h"
+#include "html/html_imageimpl.h"
+#include "rendering/render_style.h"
+#include "rendering/break_lines.h"
+#include "misc/loader.h"
+#include "misc/arena.h"
+#include "misc/paintbuffer.h"
+
+#include <QtCore/QLinkedList>
+
+#include <kcomponentdata.h>
+#include <kiconloader.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+
+#include <assert.h>
+
+#include <kdebug.h>
+
+KHTMLGlobal *KHTMLGlobal::s_self = 0;
+unsigned long int KHTMLGlobal::s_refcnt = 0;
+KComponentData *KHTMLGlobal::s_componentData = 0;
+KIconLoader *KHTMLGlobal::s_iconLoader = 0;
+KAboutData *KHTMLGlobal::s_about = 0;
+KHTMLSettings *KHTMLGlobal::s_settings = 0;
+
+static QLinkedList<KHTMLPart*> *s_parts = 0;
+static QLinkedList<DOM::DocumentImpl*> *s_docs = 0;
+
+KHTMLGlobal::KHTMLGlobal()
+{
+    assert(!s_self);
+    s_self = this;
+    ref();
+
+    khtml::Cache::init();
+}
+
+KHTMLGlobal::~KHTMLGlobal()
+{
+    kDebug(6000) << this;
+    if ( s_self == this )
+    {
+        finalCheck();
+        delete s_iconLoader;
+        delete s_componentData;
+        delete s_about;
+        delete s_settings;
+	delete KHTMLSettings::avFamilies;
+        if (s_parts) {
+            assert(s_parts->isEmpty());
+            delete s_parts;
+        }
+        if (s_docs) {
+            assert(s_docs->isEmpty());
+            delete s_docs;
+        }
+
+        s_iconLoader = 0;
+        s_componentData = 0;
+        s_about = 0;
+        s_settings = 0;
+        s_parts = 0;
+        s_docs = 0;
+	KHTMLSettings::avFamilies = 0;
+
+        // clean up static data
+        khtml::CSSStyleSelector::clear();
+        khtml::RenderStyle::cleanup();
+        khtml::PaintBuffer::cleanup();
+        khtml::Cache::clear();
+        khtml::cleanup_thaibreaks();
+        khtml::ArenaFinish();
+    }
+    else
+        deref();
+}
+
+void KHTMLGlobal::ref()
+{
+    if ( !s_refcnt && !s_self )
+    {
+        kDebug(6000) << "Creating KHTMLGlobal instance";
+        // we can't use a staticdeleter here, because that would mean
+        // that the KHTMLGlobal instance gets deleted from within a qPostRoutine, \
called +        // from the QApplication destructor. That however is too late, \
because +        // we want to destruct a KComponentData object, which involves \
destructing +        // a KConfig object, which might call KGlobal::dirs() (in \
sync()) which +        // probably is not going to work ;-)
+        // well, perhaps I'm wrong here, but as I'm unsure I try to stay on the
+        // safe side ;-) -> let's use a simple reference counting scheme
+        // (Simon)
+        new KHTMLGlobal; // does initial ref()
+    } else {
+        ++s_refcnt;
+    }
+    kDebug(6000) << "s_refcnt=" << s_refcnt;
+}
+
+void KHTMLGlobal::deref()
+{
+    kDebug(6000) << "s_refcnt=" << s_refcnt - 1;
+    if ( !--s_refcnt && s_self )
+    {
+        delete s_self;
+        s_self = 0;
+    }
+}
+
+void KHTMLGlobal::registerPart( KHTMLPart *part )
+{
+    kDebug() << part;
+    if ( !s_parts )
+        s_parts = new QLinkedList<KHTMLPart*>;
+
+    if ( !s_parts->contains( part ) ) {
+        s_parts->append( part );
+        ref();
+    }
+}
+
+void KHTMLGlobal::deregisterPart( KHTMLPart *part )
+{
+    kDebug() << part;
+    assert( s_parts );
+
+    if ( s_parts->removeAll( part ) ) {
+        if ( s_parts->isEmpty() ) {
+            delete s_parts;
+            s_parts = 0;
+        }
+        deref();
+    }
+}
+
+void KHTMLGlobal::registerDocumentImpl( DOM::DocumentImpl *doc )
+{
+    kDebug() << doc;
+    if ( !s_docs )
+        s_docs = new QLinkedList<DOM::DocumentImpl*>;
+
+    if ( !s_docs->contains( doc ) ) {
+        s_docs->append( doc );
+        ref();
+    }
+}
+
+void KHTMLGlobal::deregisterDocumentImpl( DOM::DocumentImpl *doc )
+{
+    kDebug() << doc;
+    assert( s_docs );
+
+    if ( s_docs->removeAll( doc ) ) {
+        if ( s_docs->isEmpty() ) {
+            delete s_docs;
+            s_docs = 0;
+        }
+        deref();
+    }
+}
+
+const KComponentData &KHTMLGlobal::componentData()
+{
+  assert( s_self );
+
+  if ( !s_componentData )
+  {
+    s_about = new KAboutData( "khtml", 0, ki18n( "KHTML" ), "4.0",
+                              ki18n( "Embeddable HTML component" ),
+                              KAboutData::License_LGPL );
+    s_about->addAuthor(ki18n("Lars Knoll"), KLocalizedString(), "knoll@kde.org");
+    s_about->addAuthor(ki18n("Antti Koivisto"), KLocalizedString(), \
"koivisto@kde.org"); +    s_about->addAuthor(ki18n("Waldo Bastian"), \
KLocalizedString(), "bastian@kde.org"); +    s_about->addAuthor(ki18n("Dirk \
Mueller"), KLocalizedString(), "mueller@kde.org"); +    \
s_about->addAuthor(ki18n("Peter Kelly"), KLocalizedString(), "pmk@kde.org"); +    \
s_about->addAuthor(ki18n("Torben Weis"), KLocalizedString(), "weis@kde.org"); +    \
s_about->addAuthor(ki18n("Martin Jones"), KLocalizedString(), "mjones@kde.org"); +    \
s_about->addAuthor(ki18n("Simon Hausmann"), KLocalizedString(), "hausmann@kde.org"); \
+    s_about->addAuthor(ki18n("Tobias Anton"), KLocalizedString(), \
"anton@stud.fbi.fh-darmstadt.de"); +
+    s_componentData = new KComponentData( s_about );
+  }
+
+  return *s_componentData;
+}
+
+KIconLoader *KHTMLGlobal::iconLoader()
+{
+  if ( !s_iconLoader )
+  {
+    s_iconLoader = new KIconLoader(componentData().componentName(), \
componentData().dirs()); +  }
+
+  return s_iconLoader;
+}
+
+KHTMLSettings *KHTMLGlobal::defaultHTMLSettings()
+{
+  assert( s_self );
+  if ( !s_settings )
+    s_settings = new KHTMLSettings();
+
+  return s_settings;
+}
+
+void KHTMLGlobal::finalCheck()
+{
+    kDebug(6000) << "s_refcnt=" << s_refcnt;
+    if (s_refcnt) {
+        if (s_parts && !s_parts->isEmpty()) {
+            kWarning(6000) << s_parts->count() << "parts not deleted";
+            kWarning(6000) << "Part" << s_parts->first() << "wasn't deleted";
+        }
+        if (s_docs && !s_docs->isEmpty()) {
+            kWarning(6000) << s_docs->count() << "docs not deleted";
+            kWarning(6000) << "Document" << s_docs->first() << "wasn't deleted";
+        }
+    }
+    assert( !s_refcnt );
+}
Index: css/cssstyleselector.cpp
===================================================================
--- css/cssstyleselector.cpp	(revision 741807)
+++ css/cssstyleselector.cpp	(working copy)
@@ -36,7 +36,7 @@
 #include "xml/dom_restyler.h"
 #include "dom/css_rule.h"
 #include "dom/css_value.h"
-#include "khtml_factory.h"
+#include "khtml_global.h"
 #include "khtmlpart_p.h"
 using namespace khtml;
 using namespace DOM;
@@ -929,9 +929,9 @@ static PseudoState checkPseudoState( con
         cleanpath( u );
     }
     //completeURL( attr.string() );
-    bool contains = KHTMLFactory::vLinks()->contains( u );
+    bool contains = KHTMLGlobal::vLinks()->contains( u );
     if ( !contains && u.count('/')==2 )
-      contains = KHTMLFactory::vLinks()->contains( u+'/' );
+      contains = KHTMLGlobal::vLinks()->contains( u+'/' );
     return contains ? PseudoVisited : PseudoLink;
 }
 
Index: khtml_factory.h
===================================================================
--- khtml_factory.h	(revision 741807)
+++ khtml_factory.h	(working copy)
@@ -1,6 +1,7 @@
 /* This file is part of the KDE project
  *
  * Copyright (C) 2000 Simon Hausmann <hausmann@kde.org>
+ * Copyright (C) 2007 David Faure <faure@kde.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -23,60 +24,15 @@
 #include <khtml_export.h>
 
 #include <kparts/factory.h>
-#include <kparts/historyprovider.h>
-#include <kurl.h>
 
-#include <QtCore/QLinkedList>
-
-class KComponentData;
-class KIconLoader;
-class KAboutData;
-class HistoryProvider;
-class KHTMLSettings;
-class KHTMLPart;
-
-namespace DOM
-{
-  class DocumentImpl;
-}
-
-class KHTML_EXPORT KHTMLFactory : public KParts::Factory
+class KHTMLFactory : public KParts::Factory
 {
   Q_OBJECT
-  friend class DOM::DocumentImpl;
-  friend class KHTMLViewPrivate;
 public:
-  KHTMLFactory( bool clone = false );
+    KHTMLFactory();
   virtual ~KHTMLFactory();
 
   virtual KParts::Part *createPartObject( QWidget *parentWidget, QObject *parent, \
                const char *className, const QStringList &args );
-
-  static void registerPart( KHTMLPart *part );
-  static void deregisterPart( KHTMLPart *part );
-
-  static QLinkedList<KHTMLPart*> *partList() { return s_parts; }
-
-  static const KComponentData &componentData();
-  static KIconLoader *iconLoader();
-
-  static KHTMLSettings *defaultHTMLSettings();
-
-  // list of visited URLs
-  static KParts::HistoryProvider *vLinks() {
-    return KParts::HistoryProvider::self();
-  }
-
-protected:
-  static void ref();
-  static void deref();
-private:
-  static unsigned long s_refcnt;
-  static KHTMLFactory *s_self;
-  static KComponentData *s_componentData;
-  static KIconLoader *s_iconLoader;
-  static KAboutData *s_about;
-  static KHTMLSettings *s_settings;
-  static QLinkedList<KHTMLPart*> *s_parts;
 };
 
 #endif
Index: test_regression.cpp
===================================================================
--- test_regression.cpp	(revision 741807)
+++ test_regression.cpp	(working copy)
@@ -217,7 +217,7 @@ public:
 
 #include <kaction.h>
 #include <kcmdlineargs.h>
-#include "khtml_factory.h"
+#include "khtml_global.h"
 #include <kio/job.h>
 #include <kmainwindow.h>
 #include <kconfig.h>
@@ -750,7 +750,7 @@ int main(int argc, char *argv[])
     kClearDebugConfig();
 
     // create widgets
-    KHTMLFactory *fac = new KHTMLFactory();
+    KHTMLGlobal *fac = new KHTMLGlobal();
     KMainWindow *toplevel = new KMainWindow();
     KHTMLPart *part = new KHTMLPart( toplevel, 0, KHTMLPart::BrowserViewGUI );
 
Index: xml/dom_docimpl.cpp
===================================================================
--- xml/dom_docimpl.cpp	(revision 741807)
+++ xml/dom_docimpl.cpp	(working copy)
@@ -322,7 +322,7 @@ DocumentImpl::DocumentImpl(DOMImplementa
     m_view = v;
     m_renderArena.reset();
 
-    KHTMLFactory::ref();
+    KHTMLGlobal::registerDocumentImpl(this);
 
     if ( v ) {
         m_docLoader = new DocLoader(v->part(), this );
@@ -484,7 +484,7 @@ DocumentImpl::~DocumentImpl()
 
     m_renderArena.reset();
 
-    KHTMLFactory::deref();
+    KHTMLGlobal::deregisterDocumentImpl(this);
 }
 
 
@@ -2372,7 +2372,7 @@ bool DocumentImpl::isURLAllowed(const QS
     KUrl newURL(completeURL(url));
     newURL.setRef(QString());
 
-    if (KHTMLFactory::defaultHTMLSettings()->isAdFiltered( newURL.url() ))
+    if (KHTMLGlobal::defaultHTMLSettings()->isAdFiltered( newURL.url() ))
         return false;
 
     // Prohibit non-file URLs if we are asked to.



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic