2006-02-27 Eric Seidel <eseidel@apple.com>
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 27 Feb 2006 21:31:01 +0000 (21:31 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 27 Feb 2006 21:31:01 +0000 (21:31 +0000)
        Reviewed by darin.

        Reworked KConfig and plugin architecture to be much more sane.
        This is part one.  Once this lands, I'll move it under platform with a better name.

        Darin had several great suggested further improvements as part of:
        http://bugzilla.opendarwin.org/show_bug.cgi?id=7451
        I'll make some of those when I move this to platform.

        No layout test possible (no way to control which plugins DRT sees).

        * khtml/ecma/kjs_navigator.cpp:
        (KJS::PluginBase::PluginBase):
        (KJS::PluginBase::~PluginBase):
        (KJS::PluginBase::refresh):
        (KJS::Plugins::getValueProperty):
        (KJS::Plugins::nameGetter):
        (KJS::Plugins::getOwnPropertySlot):
        (KJS::MimeTypes::getValueProperty):
        (KJS::MimeTypes::nameGetter):
        (KJS::MimeTypes::getOwnPropertySlot):
        (KJS::Plugin::getValueProperty):
        (KJS::Plugin::nameGetter):
        (KJS::Plugin::getOwnPropertySlot):
        * khtml/ecma/kjs_navigator.h:
        * khtml/ecma/kjs_window.cpp:
        * kwq/KWQKConfigBase.h:
        (WebCore::PluginInfoStore::PluginInfoStore):
        * kwq/KWQKConfigBase.mm:
        (WebCore::PluginInfoStore::createPluginInfoForPluginAtIndex):
        (WebCore::PluginInfoStore::pluginCount):
        (WebCore::refreshPlugins):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@13014 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/khtml/ecma/kjs_navigator.cpp
WebCore/khtml/ecma/kjs_navigator.h
WebCore/khtml/ecma/kjs_window.cpp
WebCore/kwq/KWQKConfigBase.h
WebCore/kwq/KWQKConfigBase.mm

index 27f2429f2436cd14c749d54527f2f552e4e215bb..5b5c816b794c4e9f26bb104ec3de86e4881b20d5 100644 (file)
@@ -1,3 +1,38 @@
+2006-02-27  Eric Seidel  <eseidel@apple.com>
+
+        Reviewed by darin.
+
+        Reworked KConfig and plugin architecture to be much more sane.
+        This is part one.  Once this lands, I'll move it under platform with a better name.
+
+        Darin had several great suggested further improvements as part of:
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=7451
+        I'll make some of those when I move this to platform.
+
+        No layout test possible (no way to control which plugins DRT sees).
+
+        * khtml/ecma/kjs_navigator.cpp:
+        (KJS::PluginBase::PluginBase):
+        (KJS::PluginBase::~PluginBase):
+        (KJS::PluginBase::refresh):
+        (KJS::Plugins::getValueProperty):
+        (KJS::Plugins::nameGetter):
+        (KJS::Plugins::getOwnPropertySlot):
+        (KJS::MimeTypes::getValueProperty):
+        (KJS::MimeTypes::nameGetter):
+        (KJS::MimeTypes::getOwnPropertySlot):
+        (KJS::Plugin::getValueProperty):
+        (KJS::Plugin::nameGetter):
+        (KJS::Plugin::getOwnPropertySlot):
+        * khtml/ecma/kjs_navigator.h:
+        * khtml/ecma/kjs_window.cpp:
+        * kwq/KWQKConfigBase.h:
+        (WebCore::PluginInfoStore::PluginInfoStore):
+        * kwq/KWQKConfigBase.mm:
+        (WebCore::PluginInfoStore::createPluginInfoForPluginAtIndex):
+        (WebCore::PluginInfoStore::pluginCount):
+        (WebCore::refreshPlugins):
+
 2006-02-27  Eric Seidel  <eseidel@apple.com>
 
         Reviewed by darin.
index 4e44ebf2294d4c5a714be466a1e96713d95f9b32..10d02ef36c5afb3e10cad568e167a31f4ab27b5e 100644 (file)
@@ -45,25 +45,8 @@ namespace KJS {
         
         void refresh(bool reload);
 
-        struct MimeClassInfo;
-        struct PluginInfo;
-
-        struct MimeClassInfo {
-            QString type;
-            QString desc;
-            QString suffixes;
-            PluginInfo *plugin;
-        };
-
-        struct PluginInfo {
-            QString name;
-            QString file;
-            QString desc;
-            QPtrList<MimeClassInfo> mimes;
-        };
-
-        static QPtrList<PluginInfo> *plugins;
-        static QPtrList<MimeClassInfo> *mimes;
+        static Vector<PluginInfo*> *plugins;
+        static Vector<MimeClassInfo*> *mimes;
 
     private:
         static int m_refCount;
@@ -134,8 +117,8 @@ const ClassInfo MimeTypes::info = { "MimeTypeArray", 0, &MimeTypesTable, 0 };
 const ClassInfo Plugin::info = { "Plugin", 0, &PluginTable, 0 };
 const ClassInfo MimeType::info = { "MimeType", 0, &MimeTypeTable, 0 };
 
-QPtrList<PluginBase::PluginInfo> *KJS::PluginBase::plugins = 0;
-QPtrList<PluginBase::MimeClassInfo> *KJS::PluginBase::mimes = 0;
+Vector<PluginInfo*> *KJS::PluginBase::plugins = 0;
+Vector<MimeClassInfo*> *KJS::PluginBase::mimes = 0;
 int KJS::PluginBase::m_refCount = 0;
 
 const ClassInfo Navigator::info = { "Navigator", 0, &NavigatorTable, 0 };
@@ -231,66 +214,25 @@ JSValue *Navigator::getValueProperty(ExecState *exec, int token) const
 PluginBase::PluginBase(ExecState *exec)
   : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype() )
 {
-    if ( !plugins ) {
-        plugins = new QPtrList<PluginInfo>;
-        mimes = new QPtrList<MimeClassInfo>;
-        plugins->setAutoDelete( true );
-        mimes->setAutoDelete( true );
-
+    if (!plugins) {
+        plugins = new Vector<PluginInfo*>;
+        mimes = new Vector<MimeClassInfo*>;
+        
         // read configuration
-        KConfig c("pluginsinfo");
-        unsigned num = (unsigned int)c.readNumEntry("number");
-        for ( unsigned n=0; n<num; n++ ) {
-
-            c.setGroup( QString::number(n) );
-            PluginInfo *plugin = new PluginInfo;
-
-            plugin->name = c.readEntry("name");
-            plugin->file = c.readEntry("file");
-            plugin->desc = c.readEntry("description");
-
-            //kdDebug(6070) << "plugin : " << plugin->name << " - " << plugin->desc << endl;
-
-            plugins->append( plugin );
-
-            // get mime types from string
-            QStringList types = QStringList::split( ';', c.readEntry("mime") );
-            QStringList::Iterator type;
-            for ( type=types.begin(); type!=types.end(); ++type ) {
-
-                // get mime information
-                MimeClassInfo *mime = new MimeClassInfo;
-                QStringList tokens = QStringList::split(':', *type, true);
-                QStringList::Iterator token;
-
-                token = tokens.begin();
-                if (token == tokens.end()) {
-                    delete mime;
-                    continue;
-                }
-                mime->type = (*token).lower();
-                //kdDebug(6070) << "mime->type=" << mime->type << endl;
-                ++token;
-
-                if (token == tokens.end()) {
-                    delete mime;
-                    continue;
-                }
-                mime->suffixes = *token;
-                ++token;
-
-                if (token == tokens.end()) {
-                    delete mime;
-                    continue;
-                }
-                mime->desc = *token;
-                ++token;
-
-                mime->plugin = plugin;
-
-                mimes->append( mime );
-                plugin->mimes.append( mime );
-            }
+        PluginInfoStore c;
+        unsigned pluginCount = c.pluginCount();
+        for (unsigned n = 0; n < pluginCount; n++) {
+            PluginInfo* plugin = c.createPluginInfoForPluginAtIndex(n);
+            if (!plugin) 
+                continue;
+            
+            plugins->append(plugin);
+            if (!plugin->mimes)
+                continue;
+            
+            Vector<MimeClassInfo*>::iterator end = plugin->mimes.end();
+            for (Vector<MimeClassInfo*>::iterator itr = plugin->mimes.begin(); itr != end; itr++)
+                mimes->append(*itr);
         }
     }
 
@@ -301,7 +243,9 @@ PluginBase::~PluginBase()
 {
     m_refCount--;
     if ( m_refCount==0 ) {
+        deleteAllValues(*plugins);
         delete plugins;
+        deleteAllValues(*mimes);
         delete mimes;
         plugins = 0;
         mimes = 0;
@@ -310,11 +254,13 @@ PluginBase::~PluginBase()
 
 void PluginBase::refresh(bool reload)
 {
+    deleteAllValues(*plugins);
     delete plugins;
+    deleteAllValues(*mimes);
     delete mimes;
     plugins = 0;
     mimes = 0;
-    RefreshPlugins(reload);
+    refreshPlugins(reload);
 }
 
 
@@ -331,7 +277,7 @@ KJS_IMPLEMENT_PROTOFUNC(PluginsFunc)
 JSValue *Plugins::getValueProperty(ExecState *exec, int token) const
 {
   assert(token == Length);
-  return jsNumber(plugins->count());
+  return jsNumber(plugins->size());
 }
 
 JSValue *Plugins::indexGetter(ExecState *exec, JSObject *originalObject, const Identifier& propertyName, const PropertySlot& slot)
@@ -341,12 +287,13 @@ JSValue *Plugins::indexGetter(ExecState *exec, JSObject *originalObject, const I
 
 JSValue *Plugins::nameGetter(ExecState *exec, JSObject *originalObject, const Identifier& propertyName, const PropertySlot& slot)
 {
-  for (PluginInfo *pl = plugins->first(); pl; pl = plugins->next()) {
-    if (pl->name == propertyName.qstring()) {
-      return new Plugin(exec, pl);
+    Vector<PluginInfo*>::iterator end = plugins->end();
+    for (Vector<PluginInfo*>::iterator itr = plugins->begin(); itr != end; itr++) {
+        PluginInfo *pl = *itr;
+        if (pl->name == propertyName.domString())
+            return new Plugin(exec, pl);
     }
-  }
-  return jsUndefined();
+    return jsUndefined();
 }
 
 bool Plugins::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
@@ -362,14 +309,15 @@ bool Plugins::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName
         // plugins[#]
         bool ok;
         unsigned int i = propertyName.toUInt32(&ok);
-        if (ok && i < plugins->count()) {
+        if (ok && i < plugins->size()) {
             slot.setCustomIndex(this, i, indexGetter);
             return true;
         }
 
         // plugin[name]
-        for (PluginInfo *pl = plugins->first(); pl; pl = plugins->next()) {
-            if (pl->name == propertyName.qstring()) {
+        Vector<PluginInfo*>::iterator end = plugins->end();
+        for (Vector<PluginInfo*>::iterator itr = plugins->begin(); itr != end; itr++) {
+            if ((*itr)->name == propertyName.domString()) {
                 slot.setCustom(this, nameGetter);
                 return true;
             }
@@ -390,7 +338,7 @@ bool Plugins::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName
 JSValue *MimeTypes::getValueProperty(ExecState *exec, int token) const
 {
   assert(token == Length);
-  return jsNumber(plugins->count());
+  return jsNumber(plugins->size());
 }
 
 JSValue *MimeTypes::indexGetter(ExecState *exec, JSObject *originalObject, const Identifier& propertyName, const PropertySlot& slot)
@@ -400,11 +348,13 @@ JSValue *MimeTypes::indexGetter(ExecState *exec, JSObject *originalObject, const
 
 JSValue *MimeTypes::nameGetter(ExecState *exec, JSObject *originalObject, const Identifier& propertyName, const PropertySlot& slot)
 {
-  for (MimeClassInfo *m = mimes->first(); m; m = mimes->next()) {
-      if (m->type == propertyName.qstring())
-          return new MimeType(exec, m);
-  }
-  return jsUndefined();
+    Vector<MimeClassInfo*>::iterator end = mimes->end();
+    for (Vector<MimeClassInfo*>::iterator itr = mimes->begin(); itr != end; itr++) {
+        MimeClassInfo *m = (*itr);
+        if (m->type == propertyName.domString())
+            return new MimeType(exec, m);
+    }
+    return jsUndefined();
 }
 
 bool MimeTypes::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
@@ -417,14 +367,15 @@ bool MimeTypes::getOwnPropertySlot(ExecState *exec, const Identifier& propertyNa
         // mimeTypes[#]
         bool ok;
         unsigned int i = propertyName.toUInt32(&ok);
-        if (ok && i < mimes->count()) {
+        if (ok && i < mimes->size()) {
             slot.setCustomIndex(this, i, indexGetter);
             return true;
         }
 
         // mimeTypes[name]
-        for (MimeClassInfo *m = mimes->first(); m; m = mimes->next()) {
-            if (m->type == propertyName.qstring()) {
+        Vector<MimeClassInfo*>::iterator end = mimes->end();
+        for (Vector<MimeClassInfo*>::iterator itr = mimes->begin(); itr != end; itr++) {
+            if ((*itr)->type == propertyName.domString()) {
                 slot.setCustom(this, nameGetter);
                 return true;
             }
@@ -456,7 +407,7 @@ JSValue *Plugin::getValueProperty(ExecState *exec, int token) const
     case Description:
         return jsString(m_info->desc);
     case Length: 
-        return jsNumber(m_info->mimes.count());
+        return jsNumber(m_info->mimes.size());
     default:
         assert(0);
         return jsUndefined();
@@ -472,8 +423,10 @@ JSValue *Plugin::indexGetter(ExecState *exec, JSObject *originalObject, const Id
 JSValue *Plugin::nameGetter(ExecState *exec, JSObject *originalObject, const Identifier& propertyName, const PropertySlot& slot)
 {
     Plugin *thisObj = static_cast<Plugin *>(slot.slotBase());
-    for (MimeClassInfo *m = thisObj->m_info->mimes.first(); m; m = thisObj->m_info->mimes.next()) {
-        if (m->type == propertyName.qstring())
+    Vector<MimeClassInfo*>::iterator end = thisObj->m_info->mimes.end();
+    for (Vector<MimeClassInfo*>::iterator itr = thisObj->m_info->mimes.begin(); itr != end; itr++) {
+        MimeClassInfo *m = (*itr);
+        if (m->type == propertyName.domString())
             return new MimeType(exec, m);
     }
     return jsUndefined();
@@ -490,14 +443,15 @@ bool Plugin::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName,
         // plugin[#]
         bool ok;
         unsigned int i = propertyName.toUInt32(&ok);
-        if (ok && i < m_info->mimes.count()) {
+        if (ok && i < m_info->mimes.size()) {
             slot.setCustomIndex(this, i, indexGetter);
             return true;
         }
 
         // plugin["name"]
-        for (MimeClassInfo *m=m_info->mimes.first(); m; m = m_info->mimes.next()) {
-            if (m->type == propertyName.qstring()) {
+        Vector<MimeClassInfo*>::iterator end = m_info->mimes.end();
+        for (Vector<MimeClassInfo*>::iterator itr = m_info->mimes.begin(); itr != end; itr++) {
+            if ((*itr)->type == propertyName.domString()) {
                 slot.setCustom(this, nameGetter);
                 return true;
             }
index 7d2389fb6309358af5fea51cac9ba33f9b4d0883..c4214025e039b1d1e8a0be161fd3d6a94f2b8823 100644 (file)
@@ -18,8 +18,8 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef _KJS_NAVIGATOR_H_
-#define _KJS_NAVIGATOR_H_
+#ifndef KJS_Navigator_H
+#define KJS_Navigator_H
 
 #include <kjs/object.h>
 
index 32ab938c47961d01cec051439eda7242666f3154..c12b4434fc1a65795d6d899cb684929f8782b7ed 100644 (file)
@@ -56,6 +56,7 @@
 #include <kjs/collector.h>
 #include <klocale.h>
 #include "FrameTree.h"
+#include "khtml_settings.h"
 
 #if KHTML_XSLT
 #include "XSLTProcessor.h"
index c51f4d3c9b32b83418fe635624bd36be52e3d073..97cffe3aaac9a0be7d3e8d9333e2cfefbed924bc 100644 (file)
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#ifndef KCONFIG_H_
-#define KCONFIG_H_
+#ifndef PluginConfig_H
+#define PluginConfig_H
 
-#include "QString.h"
-#include "KWQKHTMLSettings.h"
-
-class QStringList;
-
-class KWQKConfigImpl;
+#include "PlatformString.h"
+#include <kxmlcore/Vector.h>
 
 namespace WebCore {
-    class Color;
-}
-
-class KConfig {
-public:
 
-    KConfig(const QString &n, bool bReadOnly=false, bool bUseKDEGlobals = true);
-    ~KConfig();
+struct PluginInfo;
 
-    void setGroup(const QString &pGroup);
-    
-    QString readEntry(const char *pKey, const QString& aDefault=QString::null) const;
-    
-    int readNumEntry(const char *pKey, int nDefault=0) const;
-    unsigned int readUnsignedNumEntry(const KHTMLSettings *settings, const char *pKey, unsigned int nDefault=0) const;
-    
-    WebCore::Color readColorEntry(const char *pKey, const WebCore::Color *pDefault=0L) const;
+struct MimeClassInfo {
+    String type;
+    String desc;
+    String suffixes;
+    PluginInfo* plugin;
+};
 
-private:
+struct PluginInfo {
+    String name;
+    String file;
+    String desc;
+    Vector<MimeClassInfo*> mimes;
+};
 
-    KConfig(const KConfig &);
-    KConfig &operator=(const KConfig &);
+class PluginInfoStore {
+public:
+    PluginInfoStore() { }
+    PluginInfo *createPluginInfoForPluginAtIndex(unsigned);
+    unsigned pluginCount() const;
     
-    KWQKConfigImpl *impl;
-
+private:
+    PluginInfoStore(const PluginInfoStore&);
+    PluginInfoStore &operator=(const PluginInfoStore&);
 };
 
-void RefreshPlugins(bool reload);
+void refreshPlugins(bool reload);
+
+}
 
 #endif
index b8f50105e90f2810f3ba52e40d23de4c9f9f611e..2a18892ed49063411a078e7e97dee6c9c7b8f0c4 100644 (file)
 #include "config.h"
 #import "KWQKConfigBase.h"
 
-#import "Color.h"
 #import "KWQExceptions.h"
-#import "KWQKHTMLSettings.h"
 #import "KWQLogging.h"
-#import "QStringList.h"
-#import "WebCoreSettings.h"
 #import "WebCoreViewFactory.h"
 
-class KWQKConfigImpl
-{
-public:
-    bool isPluginInfo;
-    bool isKonquerorRC;
-    int pluginIndex;
-};
+namespace WebCore {
 
-KConfig::KConfig(const QString &n, bool bReadOnly, bool bUseKDEGlobals)
+PluginInfo *PluginInfoStore::createPluginInfoForPluginAtIndex(unsigned index)
 {
-    impl = new KWQKConfigImpl;
-    impl->isPluginInfo = n.contains("pluginsinfo");
-    impl->isKonquerorRC = (n == "konquerorrc");
-    impl->pluginIndex = 0;
-}
-
-KConfig::~KConfig()
-{
-    delete impl;
-}
-
-void KConfig::setGroup(const QString &pGroup)
-{
-    if (impl->isPluginInfo) {
-        impl->pluginIndex = pGroup.toUInt();
-    }
-}
-
-QString KConfig::readEntry(const char *pKey, const QString& aDefault) const
-{
-    if (impl->isPluginInfo) {
-       KWQ_BLOCK_EXCEPTIONS;
-
-       NSString *result = nil;
-
-        id <WebCorePluginInfo> plugin = [[[WebCoreViewFactory sharedFactory] pluginsInfo] objectAtIndex:impl->pluginIndex];
-        if (strcmp(pKey, "name") == 0) {
-            result = [plugin name];
-        } else if (strcmp(pKey, "file") == 0) {
-            result = [plugin filename];
-        } else if (strcmp(pKey, "description") == 0) {
-            result = [plugin pluginDescription];
-        } else if (strcmp(pKey, "mime") == 0) {
-            NSEnumerator *MIMETypeEnumerator = [plugin MIMETypeEnumerator], *extensionEnumerator;
-            NSMutableString *MIMEString = [NSMutableString string];
-            NSString *MIME, *extension;
-            NSArray *extensions;
-            
-            while ((MIME = [MIMETypeEnumerator nextObject]) != nil) {
-                [MIMEString appendFormat:@"%@:", MIME];
-
-                extensions = [plugin extensionsForMIMEType:MIME];
-                extensionEnumerator = [extensions objectEnumerator];
-                
-                while ((extension = [extensionEnumerator nextObject]) != nil) {
-                    [MIMEString appendFormat:@"%@,", extension];
-                }
-                // Delete the last ",".
-                NSRange tempRange = { [MIMEString length]-1, 1 }; // workaround for 4213314
-                [MIMEString deleteCharactersInRange:tempRange];
-                [MIMEString appendFormat:@":%@;", [plugin descriptionForMIMEType:MIME]];
-            }
-
-            result = MIMEString;
-        }
-
-       return QString::fromNSString(result);
-
-       KWQ_UNBLOCK_EXCEPTIONS;
+    PluginInfo *pluginInfo = new PluginInfo;
+    
+    KWQ_BLOCK_EXCEPTIONS;
 
-       return QString();
+    id <WebCorePluginInfo> plugin = [[[WebCoreViewFactory sharedFactory] pluginsInfo] objectAtIndex:index];
+    
+    pluginInfo->name = [plugin name];
+    pluginInfo->file = [plugin filename];
+    pluginInfo->desc = [plugin pluginDescription];
+
+    NSEnumerator *MIMETypeEnumerator = [plugin MIMETypeEnumerator];
+    while (NSString *MIME = [MIMETypeEnumerator nextObject]) {
+        MimeClassInfo *mime = new MimeClassInfo;
+        pluginInfo->mimes.append(mime);
+        mime->type = String(MIME).lower();
+        mime->suffixes = [[plugin extensionsForMIMEType:MIME] componentsJoinedByString:@","];
+        mime->desc = [plugin descriptionForMIMEType:MIME];
+        mime->plugin = pluginInfo;
     }
     
-    LOG_ERROR("config %s not implemented", pKey);
-    return QString();
-}
+    return pluginInfo;
 
-int KConfig::readNumEntry(const char *pKey, int nDefault) const
-{
-    if (impl->isPluginInfo && strcmp(pKey, "number") == 0) {
-        KWQ_BLOCK_EXCEPTIONS;
-       return [[[WebCoreViewFactory sharedFactory] pluginsInfo] count];
-       KWQ_UNBLOCK_EXCEPTIONS;
-       
-       return 0;
-    }
-    LOG_ERROR("config %s not implemented", pKey);
-    return nDefault;
-}
+    KWQ_UNBLOCK_EXCEPTIONS;
+    
+    if (pluginInfo && pluginInfo->mimes)
+        deleteAllValues(pluginInfo->mimes);
+    delete pluginInfo;
 
-unsigned KConfig::readUnsignedNumEntry(const KHTMLSettings *settings, const char *pKey, unsigned nDefault) const
-{
-    if (impl->isKonquerorRC && strcmp(pKey, "WindowOpenPolicy") == 0) {
-        if (settings->JavaScriptCanOpenWindowsAutomatically()) {
-           return 0;
-       } else {
-           return 3;
-       }
-    }
-    LOG_ERROR("config %s not implemented", pKey);
-    return nDefault;
+    return 0;
 }
 
-Color KConfig::readColorEntry(const char *pKey, const Color *pDefault) const
+unsigned PluginInfoStore::pluginCount() const
 {
-    return pDefault ? *pDefault : Color(0, 0, 0);
+    KWQ_BLOCK_EXCEPTIONS;
+    return [[[WebCoreViewFactory sharedFactory] pluginsInfo] count];
+    KWQ_UNBLOCK_EXCEPTIONS;
+    
+    return 0;
 }
 
-void RefreshPlugins(bool reload)
+void refreshPlugins(bool reload)
 {
     KWQ_BLOCK_EXCEPTIONS;
     [[WebCoreViewFactory sharedFactory] refreshPlugins:reload];
     KWQ_UNBLOCK_EXCEPTIONS;
 }
 
+}
+