summaryrefslogtreecommitdiff
path: root/Source/WebCore/plugins/PluginData.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/plugins/PluginData.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/plugins/PluginData.cpp')
-rw-r--r--Source/WebCore/plugins/PluginData.cpp158
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