[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

aroben at apple.com aroben at apple.com
Wed Dec 22 14:38:41 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit a5dcda08714a2d5c3c40a3820be0ee87f924678a
Author: aroben at apple.com <aroben at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Oct 14 19:22:27 2010 +0000

    Make sure WebKit2 only loads each plugin once
    
    Fixes <http://webkit.org/b/47677> <rdar://problem/8552178> WebKit2 can
    load the same plugin multiple times
    
    Reviewed by Sam Weinig.
    
    * UIProcess/Plugins/PluginInfoStore.cpp:
    (WebKit::addFromVector): Helper function that adds all the elements
    from a Vector to a HashSet.
    (WebKit::PluginInfoStore::loadPluginsIfNecessary): Put all the plugin
    paths into a HashSet, then load the plugins specified in the HashSet.
    On Windows, the HashSet is case-insensitive, just like the file
    system.
    
    * UIProcess/Plugins/PluginInfoStore.h: Removed loadPluginsInDirectory,
    which is no longer used.
    
    * UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
    (WebKit::addPluginPathsFromRegistry):
    (WebKit::PluginInfoStore::individualPluginPaths):
    Changed to store the paths in a Vector instead of a HashSet now that
    loadPluginsIfNecessary will handle duplicates for us.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@69790 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 8ddbf26..5b861c5 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,5 +1,31 @@
 2010-10-14  Adam Roben  <aroben at apple.com>
 
+        Make sure WebKit2 only loads each plugin once
+
+        Fixes <http://webkit.org/b/47677> <rdar://problem/8552178> WebKit2 can
+        load the same plugin multiple times
+
+        Reviewed by Sam Weinig.
+
+        * UIProcess/Plugins/PluginInfoStore.cpp:
+        (WebKit::addFromVector): Helper function that adds all the elements
+        from a Vector to a HashSet.
+        (WebKit::PluginInfoStore::loadPluginsIfNecessary): Put all the plugin
+        paths into a HashSet, then load the plugins specified in the HashSet.
+        On Windows, the HashSet is case-insensitive, just like the file
+        system.
+
+        * UIProcess/Plugins/PluginInfoStore.h: Removed loadPluginsInDirectory,
+        which is no longer used.
+
+        * UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
+        (WebKit::addPluginPathsFromRegistry):
+        (WebKit::PluginInfoStore::individualPluginPaths):
+        Changed to store the paths in a Vector instead of a HashSet now that
+        loadPluginsIfNecessary will handle duplicates for us.
+
+2010-10-14  Adam Roben  <aroben at apple.com>
+
         Load plugins that are specified in the MozillaPlugins registry key
 
         Fixes <http://webkit.org/b/44271> <rdar://problem/8329750> WebKit2
diff --git a/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp b/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp
index 8faffa1..22f4678 100644
--- a/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp
+++ b/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp
@@ -51,6 +51,19 @@ void PluginInfoStore::refresh()
     m_pluginListIsUpToDate = false;
 }
 
+template <typename T, typename U, typename V, typename W>
+static void addFromVector(HashSet<T, U, V>& hashSet, const W& vector)
+{
+    for (size_t i = 0; i < vector.size(); ++i)
+        hashSet.add(vector[i]);
+}
+
+#if OS(WINDOWS)
+typedef HashSet<String, CaseFoldingHash> PathHashSet;
+#else
+typedef HashSet<String> PathHashSet;
+#endif
+
 void PluginInfoStore::loadPluginsIfNecessary()
 {
     if (m_pluginListIsUpToDate)
@@ -58,28 +71,25 @@ void PluginInfoStore::loadPluginsIfNecessary()
 
     m_plugins.clear();
 
+    PathHashSet uniquePluginPaths;
+
     // First, load plug-ins from the additional plug-ins directories specified.
     for (size_t i = 0; i < m_additionalPluginsDirectories.size(); ++i)
-        loadPluginsInDirectory(m_additionalPluginsDirectories[i]);
+        addFromVector(uniquePluginPaths, pluginPathsInDirectory(m_additionalPluginsDirectories[i]));
 
     // Then load plug-ins from the standard plug-ins directories.
     Vector<String> directories = pluginsDirectories();
     for (size_t i = 0; i < directories.size(); ++i)
-        loadPluginsInDirectory(directories[i]);
+        addFromVector(uniquePluginPaths, pluginPathsInDirectory(directories[i]));
 
     // Then load plug-ins that are not in the standard plug-ins directories.
-    Vector<String> paths = individualPluginPaths();
-    for (size_t i = 0; i < paths.size(); ++i)
-        loadPlugin(paths[i]);
+    addFromVector(uniquePluginPaths, individualPluginPaths());
 
-    m_pluginListIsUpToDate = true;
-}
+    PathHashSet::const_iterator end = uniquePluginPaths.end();
+    for (PathHashSet::const_iterator it = uniquePluginPaths.begin(); it != end; ++it)
+        loadPlugin(*it);
 
-void PluginInfoStore::loadPluginsInDirectory(const String& directory)
-{
-    Vector<String> pluginPaths = pluginPathsInDirectory(directory);
-    for (size_t i = 0; i < pluginPaths.size(); ++i)
-        loadPlugin(pluginPaths[i]);
+    m_pluginListIsUpToDate = true;
 }
 
 void PluginInfoStore::loadPlugin(const String& pluginPath)
diff --git a/WebKit2/UIProcess/Plugins/PluginInfoStore.h b/WebKit2/UIProcess/Plugins/PluginInfoStore.h
index 179bacf..f3e669e 100644
--- a/WebKit2/UIProcess/Plugins/PluginInfoStore.h
+++ b/WebKit2/UIProcess/Plugins/PluginInfoStore.h
@@ -68,7 +68,6 @@ private:
     Plugin findPluginForExtension(const String& extension, String& mimeType);
 
     void loadPluginsIfNecessary();
-    void loadPluginsInDirectory(const String& directory);
     void loadPlugin(const String& pluginPath);
     
     // Platform-specific member functions
diff --git a/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp b/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp
index 2829796..645b4c0 100644
--- a/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp
+++ b/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp
@@ -29,9 +29,7 @@
 #include "NotImplemented.h"
 #include <WebCore/FileSystem.h>
 #include <shlwapi.h>
-#include <wtf/HashSet.h>
 #include <wtf/OwnArrayPtr.h>
-#include <wtf/text/StringHash.h>
 
 using namespace WebCore;
 
@@ -305,7 +303,7 @@ Vector<String> PluginInfoStore::pluginPathsInDirectory(const String& directory)
     return paths;
 }
 
-static void addPluginPathsFromRegistry(HKEY rootKey, HashSet<String, CaseFoldingHash>& paths)
+static void addPluginPathsFromRegistry(HKEY rootKey, Vector<String>& paths)
 {
     HKEY key;
     if (::RegOpenKeyExW(rootKey, L"Software\\MozillaPlugins", 0, KEY_ENUMERATE_SUB_KEYS, &key) != ERROR_SUCCESS)
@@ -326,7 +324,7 @@ static void addPluginPathsFromRegistry(HKEY rootKey, HashSet<String, CaseFolding
         if (type != REG_SZ)
             continue;
 
-        paths.add(path);
+        paths.append(path);
     }
 
     ::RegCloseKey(key);
@@ -334,14 +332,12 @@ static void addPluginPathsFromRegistry(HKEY rootKey, HashSet<String, CaseFolding
 
 Vector<String> PluginInfoStore::individualPluginPaths()
 {
-    HashSet<String, CaseFoldingHash> paths;
+    Vector<String> paths;
 
     addPluginPathsFromRegistry(HKEY_LOCAL_MACHINE, paths);
     addPluginPathsFromRegistry(HKEY_CURRENT_USER, paths);
 
-    Vector<String> result;
-    copyToVector(paths, result);
-    return result;
+    return paths;
 }
 
 static String getVersionInfo(const LPVOID versionInfoData, const String& info)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list