diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp')
-rw-r--r-- | src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp | 67 |
1 files changed, 56 insertions, 11 deletions
diff --git a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp index de1c298..f40ed95 100644 --- a/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp +++ b/src/3rdparty/webkit/WebCore/plugins/PluginDatabase.cpp @@ -21,7 +21,7 @@ * 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. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" @@ -29,11 +29,19 @@ #include "Frame.h" #include "KURL.h" +#include "PluginDatabaseClient.h" #include "PluginPackage.h" #include <stdlib.h> namespace WebCore { +typedef HashMap<String, RefPtr<PluginPackage> > PluginPackageByNameMap; + +PluginDatabase::PluginDatabase() + : m_client(0) +{ +} + PluginDatabase* PluginDatabase::installedPlugins(bool populate) { static PluginDatabase* plugins = 0; @@ -109,9 +117,11 @@ bool PluginDatabase::refresh() remove(oldPackage.get()); } - RefPtr<PluginPackage> package = PluginPackage::createPackage(*it, lastModified); - if (package && add(package.release())) - pluginSetChanged = true; + if (!m_client || m_client->shouldLoadPluginAtPath(*it)) { + RefPtr<PluginPackage> package = PluginPackage::createPackage(*it, lastModified); + if (package && (!m_client || m_client->shouldLoadPluginPackage(package.get())) && add(package.release())) + pluginSetChanged = true; + } } // Cache all the paths we found with their timestamps for next time. @@ -126,10 +136,10 @@ bool PluginDatabase::refresh() PluginSet::const_iterator end = m_plugins.end(); for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) { // Get MIME types + MIMEToDescriptionsMap::const_iterator map_it = (*it)->mimeToDescriptions().begin(); MIMEToDescriptionsMap::const_iterator map_end = (*it)->mimeToDescriptions().end(); - for (MIMEToDescriptionsMap::const_iterator map_it = (*it)->mimeToDescriptions().begin(); map_it != map_end; ++map_it) { + for (; map_it != map_end; ++map_it) m_registeredMIMETypes.add(map_it->first); - } } return true; @@ -161,12 +171,23 @@ PluginPackage* PluginDatabase::pluginForMIMEType(const String& mimeType) String key = mimeType.lower(); PluginSet::const_iterator end = m_plugins.end(); + PluginPackage* preferredPlugin = m_preferredPlugins.get(key).get(); + if (preferredPlugin + && preferredPlugin->isEnabled() + && preferredPlugin->mimeToDescriptions().contains(key)) { + return preferredPlugin; + } Vector<PluginPackage*, 2> pluginChoices; for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) { - if ((*it)->mimeToDescriptions().contains(key)) - pluginChoices.append((*it).get()); + PluginPackage* plugin = (*it).get(); + + if (!plugin->isEnabled()) + continue; + + if (plugin->mimeToDescriptions().contains(key)) + pluginChoices.append(plugin); } if (pluginChoices.isEmpty()) @@ -188,16 +209,25 @@ String PluginDatabase::MIMETypeForExtension(const String& extension) const HashMap<PluginPackage*, String> mimeTypeForPlugin; for (PluginSet::const_iterator it = m_plugins.begin(); it != end; ++it) { + if (!(*it)->isEnabled()) + continue; + MIMEToExtensionsMap::const_iterator mime_end = (*it)->mimeToExtensions().end(); for (MIMEToExtensionsMap::const_iterator mime_it = (*it)->mimeToExtensions().begin(); mime_it != mime_end; ++mime_it) { + mimeType = mime_it->first; + PluginPackage* preferredPlugin = m_preferredPlugins.get(mimeType).get(); const Vector<String>& extensions = mime_it->second; bool foundMapping = false; for (unsigned i = 0; i < extensions.size(); i++) { if (equalIgnoringCase(extensions[i], extension)) { PluginPackage* plugin = (*it).get(); + + if (preferredPlugin && PluginPackage::equal(*plugin, *preferredPlugin)) + return mimeType; + pluginChoices.append(plugin); - mimeTypeForPlugin.add(plugin, mime_it->first); + mimeTypeForPlugin.add(plugin, mimeType); foundMapping = true; break; } @@ -219,7 +249,7 @@ PluginPackage* PluginDatabase::findPlugin(const KURL& url, String& mimeType) { PluginPackage* plugin = pluginForMIMEType(mimeType); String filename = url.string(); - + if (!plugin) { String filename = url.lastPathComponent(); if (!filename.endsWith("/")) { @@ -233,12 +263,18 @@ PluginPackage* PluginDatabase::findPlugin(const KURL& url, String& mimeType) } } - // FIXME: if no plugin could be found, query Windows for the mime type + // FIXME: if no plugin could be found, query Windows for the mime type // corresponding to the extension. return plugin; } +void PluginDatabase::setPreferredPluginForMIMEType(const String& mimeType, PluginPackage* plugin) +{ + if (!plugin || plugin->mimeToExtensions().contains(mimeType)) + m_preferredPlugins.set(mimeType.lower(), plugin); +} + void PluginDatabase::getDeletedPlugins(PluginSet& plugins) const { PluginSet::const_iterator end = m_plugins.end(); @@ -263,6 +299,14 @@ bool PluginDatabase::add(PassRefPtr<PluginPackage> prpPackage) void PluginDatabase::remove(PluginPackage* package) { + MIMEToExtensionsMap::const_iterator it = package->mimeToExtensions().begin(); + MIMEToExtensionsMap::const_iterator end = package->mimeToExtensions().end(); + for ( ; it != end; ++it) { + PluginPackageByNameMap::iterator packageInMap = m_preferredPlugins.find(it->first); + if (packageInMap != m_preferredPlugins.end() && packageInMap->second == package) + m_preferredPlugins.remove(packageInMap); + } + m_plugins.remove(package); m_pluginsByPath.remove(package->path()); } @@ -273,6 +317,7 @@ void PluginDatabase::clear() m_pluginsByPath.clear(); m_pluginPathsWithTimes.clear(); m_registeredMIMETypes.clear(); + m_preferredPlugins.clear(); } #if !PLATFORM(WIN_OS) || PLATFORM(WX) |