PluginModuleInfo PluginInfoStore::findPlugin(String& mimeType, const KURL& url) { loadPluginsIfNecessary(); // First, check if we can get the plug-in based on its MIME type. if (!mimeType.isNull()) { PluginModuleInfo plugin = findPluginForMIMEType(mimeType); if (!plugin.path.isNull()) return plugin; } // Next, check if any plug-ins claim to support the URL extension. String extension = pathExtension(url).lower(); if (!extension.isNull() && mimeType.isEmpty()) { PluginModuleInfo plugin = findPluginForExtension(extension, mimeType); if (!plugin.path.isNull()) return plugin; // Finally, try to get the MIME type from the extension in a platform specific manner and use that. String extensionMimeType = getMIMETypeForExtension(extension); if (!extensionMimeType.isNull()) { PluginModuleInfo plugin = findPluginForMIMEType(extensionMimeType); if (!plugin.path.isNull()) { mimeType = extensionMimeType; return plugin; } } } return PluginModuleInfo(); }
PluginModuleInfo PluginInfoStore::findPluginForExtension(const String& extension, String& mimeType, PluginData::AllowedPluginTypes allowedPluginTypes) const { ASSERT(!extension.isNull()); for (size_t i = 0; i < m_plugins.size(); ++i) { const PluginModuleInfo& plugin = m_plugins[i]; if (allowedPluginTypes == PluginData::OnlyApplicationPlugins && !plugin.info.isApplicationPlugin) continue; for (size_t j = 0; j < plugin.info.mimes.size(); ++j) { const MimeClassInfo& mimeClassInfo = plugin.info.mimes[j]; const Vector<String>& extensions = mimeClassInfo.extensions; if (std::find(extensions.begin(), extensions.end(), extension) != extensions.end()) { // We found a supported extension, set the correct MIME type. mimeType = mimeClassInfo.type; return plugin; } } } return PluginModuleInfo(); }
PluginModuleInfo PluginInfoStore::infoForPluginWithPath(const String& pluginPath) const { for (size_t i = 0; i < m_plugins.size(); ++i) { if (m_plugins[i].path == pluginPath) return m_plugins[i]; } ASSERT_NOT_REACHED(); return PluginModuleInfo(); }
PluginModuleInfo PluginInfoStore::findPluginForMIMEType(const String& mimeType) const { ASSERT(!mimeType.isNull()); for (size_t i = 0; i < m_plugins.size(); ++i) { const PluginModuleInfo& plugin = m_plugins[i]; for (size_t j = 0; j < plugin.info.mimes.size(); ++j) { const MimeClassInfo& mimeClassInfo = plugin.info.mimes[j]; if (mimeClassInfo.type == mimeType) return plugin; } } return PluginModuleInfo(); }
PluginModuleInfo PluginInfoStore::findPluginForMIMEType(const String& mimeType, PluginData::AllowedPluginTypes allowedPluginTypes) const { ASSERT(!mimeType.isNull()); for (size_t i = 0; i < m_plugins.size(); ++i) { const PluginModuleInfo& plugin = m_plugins[i]; if (allowedPluginTypes == PluginData::OnlyApplicationPlugins && !plugin.info.isApplicationPlugin) continue; for (size_t j = 0; j < plugin.info.mimes.size(); ++j) { const MimeClassInfo& mimeClassInfo = plugin.info.mimes[j]; if (mimeClassInfo.type == mimeType) return plugin; } } return PluginModuleInfo(); }
PluginModuleInfo PluginInfoStore::findPluginForExtension(const String& extension, String& mimeType) const { MutexLocker locker(m_pluginsLock); ASSERT(!extension.isNull()); for (size_t i = 0; i < m_plugins.size(); ++i) { const PluginModuleInfo& plugin = m_plugins[i]; for (size_t j = 0; j < plugin.info.mimes.size(); ++j) { const MimeClassInfo& mimeClassInfo = plugin.info.mimes[j]; const Vector<String>& extensions = mimeClassInfo.extensions; if (find(extensions.begin(), extensions.end(), extension) != extensions.end()) { // We found a supported extension, set the correct MIME type. mimeType = mimeClassInfo.type; return plugin; } } } return PluginModuleInfo(); }
PluginModuleInfo PluginInfoStore::findPluginWithBundleIdentifier(const String&) { ASSERT_NOT_REACHED(); return PluginModuleInfo(); }