diff options
Diffstat (limited to 'Source/WebCore/plugins/PluginData.cpp')
-rw-r--r-- | Source/WebCore/plugins/PluginData.cpp | 158 |
1 files changed, 123 insertions, 35 deletions
diff --git a/Source/WebCore/plugins/PluginData.cpp b/Source/WebCore/plugins/PluginData.cpp index 6dd4eaadb..26e498c23 100644 --- a/Source/WebCore/plugins/PluginData.cpp +++ b/Source/WebCore/plugins/PluginData.cpp @@ -2,7 +2,7 @@ Copyright (C) 2000 Harri Porten (porten@kde.org) Copyright (C) 2000 Daniel Molkentin (molkentin@kde.org) Copyright (C) 2000 Stefan Schimanski (schimmi@kde.org) - Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All Rights Reserved. + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2015 Apple Inc. All Rights Reserved. Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) This library is free software; you can redistribute it and/or @@ -24,69 +24,157 @@ #include "config.h" #include "PluginData.h" -#include "PlatformStrategies.h" -#include "PluginStrategy.h" +#include "LocalizedStrings.h" +#include "Page.h" +#include "PluginInfoProvider.h" namespace WebCore { -PluginData::PluginData(const Page* page) +PluginData::PluginData(Page& page) + : m_page(page) { - initPlugins(page); + initPlugins(); +} + +Vector<PluginInfo> PluginData::webVisiblePlugins() const +{ + Vector<PluginInfo> plugins; + m_page.pluginInfoProvider().getWebVisiblePluginInfo(m_page, plugins); + return plugins; +} + +#if PLATFORM(COCOA) +static inline bool isBuiltInPDFPlugIn(const PluginInfo& plugIn) +{ + return plugIn.name == builtInPDFPluginName(); +} +#else +static inline bool isBuiltInPDFPlugIn(const PluginInfo&) +{ + return false; +} +#endif + +static bool shouldBePubliclyVisible(const PluginInfo& plugin) +{ + // We can greatly reduce fingerprinting opportunities by only advertising plug-ins + // that are widely needed for general website compatibility. Since many users + // will have these plug-ins, we are not revealing much user-specific information. + // + // Web compatibility data indicate that Flash, QuickTime, Java, and PDF support + // are frequently accessed through the bad practice of iterating over the contents + // of the navigator.plugins list. Luckily, these plug-ins happen to be the least + // user-specific. + return plugin.name.containsIgnoringASCIICase("Shockwave") + || plugin.name.containsIgnoringASCIICase("QuickTime") + || plugin.name.containsIgnoringASCIICase("Java") + || isBuiltInPDFPlugIn(plugin); +} + +Vector<PluginInfo> PluginData::publiclyVisiblePlugins() const +{ + if (m_page.showAllPlugins()) + return webVisiblePlugins(); + + Vector<PluginInfo> allPlugins; + m_page.pluginInfoProvider().getWebVisiblePluginInfo(m_page, allPlugins); + + Vector<PluginInfo> plugins; + for (auto&& plugin : allPlugins) { + if (shouldBePubliclyVisible(plugin)) + plugins.append(WTFMove(plugin)); + } + + std::sort(plugins.begin(), plugins.end(), [](const PluginInfo& a, const PluginInfo& b) { + return codePointCompareLessThan(a.name, b.name); + }); + return plugins; +} + +void PluginData::getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const +{ + getMimesAndPluginIndiciesForPlugins(webVisiblePlugins(), mimes, mimePluginIndices); +} - for (unsigned i = 0; i < m_plugins.size(); ++i) { - const PluginInfo& plugin = m_plugins[i]; - for (unsigned j = 0; j < plugin.mimes.size(); ++j) { - m_mimes.append(plugin.mimes[j]); - m_mimePluginIndices.append(i); +void PluginData::getMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const +{ + getMimesAndPluginIndiciesForPlugins(plugins(), mimes, mimePluginIndices); +} + +void PluginData::getMimesAndPluginIndiciesForPlugins(const Vector<PluginInfo>& plugins, Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const +{ + ASSERT_ARG(mimes, mimes.isEmpty()); + ASSERT_ARG(mimePluginIndices, mimePluginIndices.isEmpty()); + + for (unsigned i = 0; i < plugins.size(); ++i) { + const PluginInfo& plugin = plugins[i]; + for (auto& mime : plugin.mimes) { + mimes.append(mime); + mimePluginIndices.append(i); } } } -bool PluginData::supportsMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const +bool PluginData::supportsWebVisibleMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const { - for (unsigned i = 0; i < m_mimes.size(); ++i) { - if (m_mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || m_plugins[m_mimePluginIndices[i]].isApplicationPlugin)) + Vector<MimeClassInfo> mimes; + Vector<size_t> mimePluginIndices; + const Vector<PluginInfo>& plugins = webVisiblePlugins(); + getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); + + for (unsigned i = 0; i < mimes.size(); ++i) { + if (mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || plugins[mimePluginIndices[i]].isApplicationPlugin)) return true; } return false; } -const PluginInfo* PluginData::pluginInfoForMimeType(const String& mimeType) const +bool PluginData::getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo& pluginInfoRef) const { - for (unsigned i = 0; i < m_mimes.size(); ++i) { - const MimeClassInfo& info = m_mimes[i]; - - if (info.type == mimeType) - return &m_plugins[m_mimePluginIndices[i]]; + Vector<MimeClassInfo> mimes; + Vector<size_t> mimePluginIndices; + const Vector<PluginInfo>& plugins = webVisiblePlugins(); + getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices); + + for (unsigned i = 0; i < mimes.size(); ++i) { + const MimeClassInfo& info = mimes[i]; + + if (info.type == mimeType) { + pluginInfoRef = plugins[mimePluginIndices[i]]; + return true; + } } - return 0; + return false; } -String PluginData::pluginNameForMimeType(const String& mimeType) const +String PluginData::pluginFileForWebVisibleMimeType(const String& mimeType) const { - if (const PluginInfo* info = pluginInfoForMimeType(mimeType)) - return info->name; + PluginInfo info; + if (getPluginInfoForWebVisibleMimeType(mimeType, info)) + return info.file; return String(); } -String PluginData::pluginFileForMimeType(const String& mimeType) const +bool PluginData::supportsMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const { - if (const PluginInfo* info = pluginInfoForMimeType(mimeType)) - return info->file; - return String(); -} + Vector<MimeClassInfo> mimes; + Vector<size_t> mimePluginIndices; + const Vector<PluginInfo>& plugins = this->plugins(); + getMimesAndPluginIndices(mimes, mimePluginIndices); -void PluginData::refresh() -{ - platformStrategies()->pluginStrategy()->refreshPlugins(); + for (unsigned i = 0; i < mimes.size(); ++i) { + if (mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || plugins[mimePluginIndices[i]].isApplicationPlugin)) + return true; + } + return false; } -void PluginData::initPlugins(const Page* page) +void PluginData::initPlugins() { ASSERT(m_plugins.isEmpty()); - - platformStrategies()->pluginStrategy()->getPluginInfo(page, m_plugins); -} + m_page.pluginInfoProvider().getPluginInfo(m_page, m_plugins); } + +} // namespace WebCore |