Diff
Modified: trunk/Source/WebCore/ChangeLog (181561 => 181562)
--- trunk/Source/WebCore/ChangeLog 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/ChangeLog 2015-03-16 17:13:04 UTC (rev 181562)
@@ -1,3 +1,134 @@
+2015-03-16 Conrad Shultz <conrad_shu...@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
+ from the page). As part of this:
+
+ 1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
+ set of plug-ins.
+
+ 2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
+ down the stack.
+
+ 3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
+ a concrete implementation thereof in WebPlatformStrategies in WebKit2.
+
+ 4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
+
+ While currently only used in a very limited manner, the new declarative plug-in policies are written generically
+ so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
+
+ * dom/DOMImplementation.cpp:
+ (WebCore::DOMImplementation::createDocument):
+ Update to reflect function rename.
+
+ * loader/SubframeLoader.cpp:
+ (WebCore::findPluginMIMETypeFromURL):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::logPluginRequest):
+ Update to reflect function rename.
+ (WebCore::SubframeLoader::shouldUsePlugin):
+ Ditto.
+
+ * platform/PlatformStrategies.h:
+ Export platformStrategies(), since it is now used in WebProcess.cpp.
+
+ * plugins/DOMMimeType.cpp:
+ (WebCore::DOMMimeType::type):
+ (WebCore::DOMMimeType::description):
+ (WebCore::DOMMimeType::mimeClassInfo):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::DOMMimeType::enabledPlugin):
+ Ditto.
+
+ * plugins/DOMMimeType.h:
+ Don't return references in a few places where it is no longer safe to do so.
+ (WebCore::DOMMimeType::mimeClassInfo): Deleted.
+
+ * plugins/DOMMimeTypeArray.cpp:
+ (WebCore::DOMMimeTypeArray::length):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::DOMMimeTypeArray::item):
+ Ditto.
+ (WebCore::DOMMimeTypeArray::canGetItemsForName):
+ Ditto.
+ (WebCore::DOMMimeTypeArray::namedItem):
+ Ditto.
+
+ * plugins/DOMPlugin.cpp:
+ (WebCore::DOMPlugin::pluginInfo):
+ Adopt getWebVisiblePlugins().
+ (WebCore::DOMPlugin::item):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::DOMPlugin::canGetItemsForName):
+ Ditto.
+ (WebCore::DOMPlugin::namedItem):
+ Ditto.
+
+ * plugins/DOMPlugin.h:
+ (WebCore::DOMPlugin::pluginInfo): Deleted.
+
+ * plugins/DOMPluginArray.cpp:
+ (WebCore::DOMPluginArray::length):
+ Adopt getWebVisiblePlugins().
+ (WebCore::DOMPluginArray::item):
+ Ditto.
+ (WebCore::DOMPluginArray::canGetItemsForName):
+ Ditto.
+ (WebCore::DOMPluginArray::namedItem):
+ Ditto.
+
+ * plugins/PluginData.cpp:
+ (WebCore::PluginData::PluginData):
+ Stash the passed-in Page and call initPlugins().
+ (WebCore::PluginData::getWebVisiblePlugins):
+ New member function; call through to PluginStrategy::getWebVisiblePluginInfo().
+ (WebCore::PluginData::getWebVisibleMimesAndPluginIndices):
+ New member function; build up the mimes and mimePluginIndices vectors in the same manner as before, but
+ limited to the web-visible plug-ins.
+ (WebCore::PluginData::supportsWebVisibleMimeType):
+ Renamed from supportsMimeType(); update to work in terms of web-visible plug-ins.
+ (WebCore::PluginData::pluginInfoForWebVisibleMimeType):
+ Renamed from pluginInfoForMimeType(); ditto.
+ (WebCore::PluginData::pluginNameForWebVisibleMimeType):
+ Renamed from pluginNameForMimeType(); ditto.
+ (WebCore::PluginData::pluginFileForWebVisibleMimeType):
+ Renamed from pluginFileForMimeType(); ditto.
+ (WebCore::PluginData::initPlugins):
+ (WebCore::PluginData::supportsMimeType): Deleted.
+ (WebCore::PluginData::pluginInfoForMimeType): Deleted.
+ (WebCore::PluginData::pluginNameForMimeType): Deleted.
+ (WebCore::PluginData::pluginFileForMimeType): Deleted.
+
+ * plugins/PluginData.h:
+ Add a member variable for the associate Page; declare the PluginLoadClientPolicy enumeration; add
+ new members to PluginInfo for the clientLoadPolicy and bundle information.
+ (WebCore::PluginData::PluginData):
+ Replace some member functions with new ones that will hide plug-ins upon request from the client;
+ (WebCore::PluginData::mimes): Deleted.
+ (WebCore::PluginData::mimePluginIndices): Deleted.
+
+ * plugins/PluginStrategy.h:
+ Declare new member functions for retrieving web-visible plug-ins and setting/clearing plug-in policies.
+
+ * replay/SerializationMethods.cpp:
+ (JSC::EncodingTraits<PluginData>::encodeValue):
+ Remove now-obsolete code for handling MIME types and add a FIXME.
+ (JSC::DeserializedPluginData::DeserializedPluginData):
+ (JSC::EncodingTraits<PluginData>::decodeValue):
+ Ditto.
+ (JSC::EncodingTraits<PluginInfo>::encodeValue):
+ Handle the new members in PluginInfo.
+ (JSC::EncodingTraits<PluginInfo>::decodeValue):
+ Ditto.
+
+ * replay/WebInputs.json:
+ Teach Replay about PluginLoadClientPolicy.
+
2015-03-16 Max Stepin <maxste...@gmail.com>
Add APNG support
Modified: trunk/Source/WebCore/dom/DOMImplementation.cpp (181561 => 181562)
--- trunk/Source/WebCore/dom/DOMImplementation.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/dom/DOMImplementation.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -329,7 +329,7 @@
// PDF is one image type for which a plugin can override built-in support.
// We do not want QuickTime to take over all image types, obviously.
- if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->supportsMimeType(type, allowedPluginTypes))
+ if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes))
return PluginDocument::create(frame, url);
if (Image::supportsType(type))
return ImageDocument::create(*frame, url);
@@ -348,7 +348,7 @@
// Everything else except text/plain can be overridden by plugins. In particular, Adobe SVG Viewer should be used for SVG, if installed.
// Disallowing plug-ins to use text/plain prevents plug-ins from hijacking a fundamental type that the browser is expected to handle,
// and also serves as an optimization to prevent loading the plug-in database in the common case.
- if (type != "text/plain" && ((pluginData && pluginData->supportsMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
+ if (type != "text/plain" && ((pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
return PluginDocument::create(frame, url);
if (isTextMIMEType(type))
return TextDocument::create(frame, url);
Modified: trunk/Source/WebCore/loader/SubframeLoader.cpp (181561 => 181562)
--- trunk/Source/WebCore/loader/SubframeLoader.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/loader/SubframeLoader.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -167,8 +167,11 @@
const PluginData& pluginData = page->pluginData();
- for (size_t i = 0; i < pluginData.mimes().size(); ++i) {
- const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ for (size_t i = 0; i < mimes.size(); ++i) {
+ const MimeClassInfo& mimeClassInfo = mimes[i];
for (size_t j = 0; j < mimeClassInfo.extensions.size(); ++j) {
if (equalIgnoringCase(extension, mimeClassInfo.extensions[j]))
return mimeClassInfo.type;
@@ -191,7 +194,7 @@
return;
}
- String pluginFile = page->pluginData().pluginFileForMimeType(newMIMEType);
+ String pluginFile = page->pluginData().pluginFileForWebVisibleMimeType(newMIMEType);
String description = !pluginFile ? newMIMEType : pluginFile;
DiagnosticLoggingClient& diagnosticLoggingClient = page->mainFrame().diagnosticLoggingClient();
@@ -367,7 +370,7 @@
// Allow other plug-ins to win over QuickTime because if the user has installed a plug-in that
// can handle TIFF (which QuickTime can also handle) they probably intended to override QT.
if (m_frame.page() && (mimeType == "image/tiff" || mimeType == "image/tif" || mimeType == "image/x-tiff")) {
- String pluginName = m_frame.page()->pluginData().pluginNameForMimeType(mimeType);
+ String pluginName = m_frame.page()->pluginData().pluginNameForWebVisibleMimeType(mimeType);
if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", false))
return true;
}
Modified: trunk/Source/WebCore/platform/PlatformStrategies.h (181561 => 181562)
--- trunk/Source/WebCore/platform/PlatformStrategies.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/platform/PlatformStrategies.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -88,7 +88,7 @@
PluginStrategy* m_pluginStrategy;
};
-PlatformStrategies* platformStrategies();
+WEBCORE_EXPORT PlatformStrategies* platformStrategies();
WEBCORE_EXPORT void setPlatformStrategies(PlatformStrategies*);
bool hasPlatformStrategies();
Modified: trunk/Source/WebCore/plugins/DOMMimeType.cpp (181561 => 181562)
--- trunk/Source/WebCore/plugins/DOMMimeType.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMMimeType.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -42,7 +42,7 @@
{
}
-const String &DOMMimeType::type() const
+String DOMMimeType::type() const
{
return mimeClassInfo().type;
}
@@ -60,17 +60,28 @@
return builder.toString();
}
-const String &DOMMimeType::description() const
+String DOMMimeType::description() const
{
return mimeClassInfo().desc;
}
+MimeClassInfo DOMMimeType::mimeClassInfo() const
+{
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ return mimes[m_index];
+}
+
PassRefPtr<DOMPlugin> DOMMimeType::enabledPlugin() const
{
if (!m_frame || !m_frame->page() || !m_frame->page()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
return 0;
- return DOMPlugin::create(m_pluginData.get(), m_frame, m_pluginData->mimePluginIndices()[m_index]);
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ return DOMPlugin::create(m_pluginData.get(), m_frame, mimePluginIndices[m_index]);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/plugins/DOMMimeType.h (181561 => 181562)
--- trunk/Source/WebCore/plugins/DOMMimeType.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMMimeType.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -37,13 +37,13 @@
static Ref<DOMMimeType> create(PassRefPtr<PluginData> pluginData, Frame* frame, unsigned index) { return adoptRef(*new DOMMimeType(pluginData, frame, index)); }
~DOMMimeType();
- const String &type() const;
+ String type() const;
String suffixes() const;
- const String &description() const;
+ String description() const;
PassRefPtr<DOMPlugin> enabledPlugin() const;
private:
- const MimeClassInfo& mimeClassInfo() const { return m_pluginData->mimes()[m_index]; }
+ MimeClassInfo mimeClassInfo() const;
DOMMimeType(PassRefPtr<PluginData>, Frame*, unsigned index);
RefPtr<PluginData> m_pluginData;
Modified: trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp (181561 => 181562)
--- trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -48,7 +48,11 @@
PluginData* data = ""
if (!data)
return 0;
- return data->mimes().size();
+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ return mimes.size();
}
PassRefPtr<DOMMimeType> DOMMimeTypeArray::item(unsigned index)
@@ -56,7 +60,11 @@
PluginData* data = ""
if (!data)
return 0;
- const Vector<MimeClassInfo>& mimes = data->mimes();
+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
if (index >= mimes.size())
return 0;
return DOMMimeType::create(data, m_frame, index);
@@ -67,7 +75,10 @@
PluginData *data = ""
if (!data)
return 0;
- const Vector<MimeClassInfo>& mimes = data->mimes();
+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i) {
if (mimes[i].type == propertyName)
return true;
@@ -80,7 +91,10 @@
PluginData *data = ""
if (!data)
return 0;
- const Vector<MimeClassInfo>& mimes = data->mimes();
+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i) {
if (mimes[i].type == propertyName)
return DOMMimeType::create(data, m_frame, i);
Modified: trunk/Source/WebCore/plugins/DOMPlugin.cpp (181561 => 181562)
--- trunk/Source/WebCore/plugins/DOMPlugin.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMPlugin.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -56,16 +56,23 @@
return pluginInfo().mimes.size();
}
+PluginInfo DOMPlugin::pluginInfo() const
+{
+ return m_pluginData->webVisiblePlugins()[m_index];
+}
+
PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index)
{
if (index >= pluginInfo().mimes.size())
return 0;
- const MimeClassInfo& mime = pluginInfo().mimes[index];
+ MimeClassInfo mime = pluginInfo().mimes[index];
- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i) {
- if (mimes[i] == mime && m_pluginData->mimePluginIndices()[i] == m_index)
+ if (mimes[i] == mime && mimePluginIndices[i] == m_index)
return DOMMimeType::create(m_pluginData.get(), m_frame, i);
}
return 0;
@@ -73,7 +80,9 @@
bool DOMPlugin::canGetItemsForName(const AtomicString& propertyName)
{
- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i)
if (mimes[i].type == propertyName)
return true;
@@ -82,7 +91,9 @@
PassRefPtr<DOMMimeType> DOMPlugin::namedItem(const AtomicString& propertyName)
{
- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i)
if (mimes[i].type == propertyName)
return DOMMimeType::create(m_pluginData.get(), m_frame, i);
Modified: trunk/Source/WebCore/plugins/DOMPlugin.h (181561 => 181562)
--- trunk/Source/WebCore/plugins/DOMPlugin.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMPlugin.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -48,7 +48,7 @@
PassRefPtr<DOMMimeType> namedItem(const AtomicString& propertyName);
private:
- const PluginInfo& pluginInfo() const { return m_pluginData->plugins()[m_index]; }
+ PluginInfo pluginInfo() const;
DOMPlugin(PluginData*, Frame*, unsigned index);
RefPtr<PluginData> m_pluginData;
Modified: trunk/Source/WebCore/plugins/DOMPluginArray.cpp (181561 => 181562)
--- trunk/Source/WebCore/plugins/DOMPluginArray.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMPluginArray.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -48,7 +48,8 @@
PluginData* data = ""
if (!data)
return 0;
- return data->plugins().size();
+
+ return data->webVisiblePlugins().size();
}
PassRefPtr<DOMPlugin> DOMPluginArray::item(unsigned index)
@@ -56,7 +57,8 @@
PluginData* data = ""
if (!data)
return 0;
- const Vector<PluginInfo>& plugins = data->plugins();
+
+ const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
if (index >= plugins.size())
return 0;
return DOMPlugin::create(data, m_frame, index);
@@ -67,7 +69,8 @@
PluginData* data = ""
if (!data)
return 0;
- const Vector<PluginInfo>& plugins = data->plugins();
+
+ const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
for (unsigned i = 0; i < plugins.size(); ++i) {
if (plugins[i].name == propertyName)
return true;
@@ -80,7 +83,8 @@
PluginData* data = ""
if (!data)
return 0;
- const Vector<PluginInfo>& plugins = data->plugins();
+
+ const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
for (unsigned i = 0; i < plugins.size(); ++i) {
if (plugins[i].name == propertyName)
return DOMPlugin::create(data, m_frame, i);
Modified: trunk/Source/WebCore/plugins/PluginData.cpp (181561 => 181562)
--- trunk/Source/WebCore/plugins/PluginData.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/PluginData.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -2,7 +2,7 @@
Copyright (C) 2000 Harri Porten (por...@kde.org)
Copyright (C) 2000 Daniel Molkentin (molken...@kde.org)
Copyright (C) 2000 Stefan Schimanski (schi...@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
@@ -31,49 +31,80 @@
PluginData::PluginData(const Page* page)
{
- initPlugins(page);
+ ASSERT_ARG(page, page);
- for (unsigned i = 0; i < m_plugins.size(); ++i) {
- const PluginInfo& plugin = m_plugins[i];
+ m_page = page;
+ initPlugins();
+}
+
+Vector<PluginInfo> PluginData::webVisiblePlugins() const
+{
+ Vector<PluginInfo> plugins;
+ platformStrategies()->pluginStrategy()->getWebVisiblePluginInfo(m_page, plugins);
+ return plugins;
+}
+
+void PluginData::getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const
+{
+ ASSERT_ARG(mimes, mimes.isEmpty());
+ ASSERT_ARG(mimePluginIndices, mimePluginIndices.isEmpty());
+
+ const Vector<PluginInfo>& plugins = webVisiblePlugins();
+ for (unsigned i = 0; i < plugins.size(); ++i) {
+ const PluginInfo& plugin = plugins[i];
for (unsigned j = 0; j < plugin.mimes.size(); ++j) {
- m_mimes.append(plugin.mimes[j]);
- m_mimePluginIndices.append(i);
+ mimes.append(plugin.mimes[j]);
+ 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::pluginNameForWebVisibleMimeType(const String& mimeType) const
{
- if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
- return info->name;
+ PluginInfo info;
+ if (getPluginInfoForWebVisibleMimeType(mimeType, info))
+ return info.name;
return String();
}
-String PluginData::pluginFileForMimeType(const String& mimeType) const
+String PluginData::pluginFileForWebVisibleMimeType(const String& mimeType) const
{
- if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
- return info->file;
+ PluginInfo info;
+ if (getPluginInfoForWebVisibleMimeType(mimeType, info))
+ return info.file;
return String();
}
@@ -82,11 +113,11 @@
platformStrategies()->pluginStrategy()->refreshPlugins();
}
-void PluginData::initPlugins(const Page* page)
+void PluginData::initPlugins()
{
ASSERT(m_plugins.isEmpty());
-
- platformStrategies()->pluginStrategy()->getPluginInfo(page, m_plugins);
+
+ platformStrategies()->pluginStrategy()->getPluginInfo(m_page, m_plugins);
}
}
Modified: trunk/Source/WebCore/plugins/PluginData.h (181561 => 181562)
--- trunk/Source/WebCore/plugins/PluginData.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/PluginData.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -29,6 +29,24 @@
class Page;
struct PluginInfo;
+enum PluginLoadClientPolicy : uint8_t {
+ // No client-specific plug-in load policy has been defined. The plug-in should be visible in navigator.plugins and WebKit should synchronously
+ // ask the client whether the plug-in should be loaded.
+ PluginLoadClientPolicyUndefined = 0,
+
+ // The plug-in module should be blocked from being instantiated. The plug-in should be hidden in navigator.plugins.
+ PluginLoadClientPolicyBlock,
+
+ // WebKit should synchronously ask the client whether the plug-in should be loaded. The plug-in should be visible in navigator.plugins.
+ PluginLoadClientPolicyAsk,
+
+ // The plug-in module may be loaded if WebKit is not blocking it.
+ PluginLoadClientPolicyAllow,
+
+ // The plug-in module should be loaded irrespective of whether WebKit has asked it to be blocked.
+ PluginLoadClientPolicyAllowAlways,
+};
+
struct MimeClassInfo {
String type;
String desc;
@@ -46,6 +64,13 @@
String desc;
Vector<MimeClassInfo> mimes;
bool isApplicationPlugin;
+
+ PluginLoadClientPolicy clientLoadPolicy;
+
+#if PLATFORM(MAC)
+ String bundleIdentifier;
+ String versionString;
+#endif
};
// FIXME: merge with PluginDatabase in the future
@@ -54,38 +79,35 @@
static Ref<PluginData> create(const Page* page) { return adoptRef(*new PluginData(page)); }
const Vector<PluginInfo>& plugins() const { return m_plugins; }
- const Vector<MimeClassInfo>& mimes() const { return m_mimes; }
- const Vector<size_t>& mimePluginIndices() const { return m_mimePluginIndices; }
+ Vector<PluginInfo> webVisiblePlugins() const;
+ WEBCORE_EXPORT void getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>&, Vector<size_t>&) const;
enum AllowedPluginTypes {
AllPlugins,
OnlyApplicationPlugins
};
- WEBCORE_EXPORT bool supportsMimeType(const String& mimeType, const AllowedPluginTypes) const;
- String pluginNameForMimeType(const String& mimeType) const;
- String pluginFileForMimeType(const String& mimeType) const;
+ WEBCORE_EXPORT bool supportsWebVisibleMimeType(const String& mimeType, const AllowedPluginTypes) const;
+ String pluginNameForWebVisibleMimeType(const String& mimeType) const;
+ String pluginFileForWebVisibleMimeType(const String& mimeType) const;
static void refresh();
private:
explicit PluginData(const Page*);
- void initPlugins(const Page*);
- const PluginInfo* pluginInfoForMimeType(const String& mimeType) const;
+ void initPlugins();
+ bool getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo&) const;
protected:
#if defined ENABLE_WEB_REPLAY && ENABLE_WEB_REPLAY
- PluginData(Vector<PluginInfo> plugins, Vector<MimeClassInfo> mimes, Vector<size_t> indices)
+ PluginData(Vector<PluginInfo> plugins)
: m_plugins(plugins)
- , m_mimes(mimes)
- , m_mimePluginIndices(indices)
{
}
#endif
+ const Page* m_page;
Vector<PluginInfo> m_plugins;
- Vector<MimeClassInfo> m_mimes;
- Vector<size_t> m_mimePluginIndices;
};
}
Modified: trunk/Source/WebCore/plugins/PluginStrategy.h (181561 => 181562)
--- trunk/Source/WebCore/plugins/PluginStrategy.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/PluginStrategy.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -36,6 +36,11 @@
public:
virtual void refreshPlugins() = 0;
virtual void getPluginInfo(const Page*, Vector<PluginInfo>&) = 0;
+ virtual void getWebVisiblePluginInfo(const Page*, Vector<PluginInfo>&) = 0;
+#if PLATFORM(MAC)
+ virtual void setPluginLoadClientPolicy(PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString) = 0;
+ virtual void clearPluginClientPolicies() = 0;
+#endif
protected:
virtual ~PluginStrategy() { }
Modified: trunk/Source/WebCore/replay/SerializationMethods.cpp (181561 => 181562)
--- trunk/Source/WebCore/replay/SerializationMethods.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/replay/SerializationMethods.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -53,6 +53,7 @@
using WebCore::PlatformWheelEvent;
using WebCore::PlatformWheelEventGranularity;
using WebCore::PluginData;
+using WebCore::PluginLoadClientPolicy;
using WebCore::PluginInfo;
using WebCore::SecurityOrigin;
using WebCore::URL;
@@ -437,23 +438,18 @@
EncodedValue EncodingTraits<PluginData>::encodeValue(RefPtr<PluginData> input)
{
+ // FIXME: This needs to work in terms of web-visible plug-ins.
EncodedValue encodedData = EncodedValue::createObject();
- Vector<uint32_t> castedMimePluginIndices(input->mimePluginIndices().size());
- for (uint32_t index : input->mimePluginIndices())
- castedMimePluginIndices.append(WTF::safeCast<uint32_t>(index));
-
ENCODE_TYPE_WITH_KEY(encodedData, Vector<PluginInfo>, plugins, input->plugins());
- ENCODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes, input->mimes());
- ENCODE_TYPE_WITH_KEY(encodedData, Vector<uint32_t>, mimePluginIndices, castedMimePluginIndices);
return encodedData;
}
class DeserializedPluginData : public PluginData {
public:
- DeserializedPluginData(Vector<PluginInfo> plugins, Vector<MimeClassInfo> mimes, Vector<size_t> indices)
- : PluginData(plugins, mimes, indices)
+ DeserializedPluginData(Vector<PluginInfo> plugins)
+ : PluginData(plugins)
{
}
};
@@ -461,15 +457,10 @@
bool EncodingTraits<PluginData>::decodeValue(EncodedValue& encodedData, RefPtr<PluginData>& input)
{
DECODE_TYPE_WITH_KEY(encodedData, Vector<PluginInfo>, plugins);
- DECODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes);
- DECODE_TYPE_WITH_KEY(encodedData, Vector<uint32_t>, mimePluginIndices);
- Vector<size_t> castedMimePluginIndices(mimePluginIndices.size());
- for (uint32_t index : mimePluginIndices)
- castedMimePluginIndices.append(WTF::safeCast<size_t>(index));
+ // FIXME: This needs to work in terms of web-visible plug-ins.
+ input = adoptRef(new DeserializedPluginData(plugins));
- input = adoptRef(new DeserializedPluginData(plugins, mimes, castedMimePluginIndices));
-
return true;
}
@@ -483,6 +474,11 @@
ENCODE_TYPE_WITH_KEY(encodedData, String, desc, input.desc);
ENCODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes, input.mimes);
ENCODE_TYPE_WITH_KEY(encodedData, bool, isApplicationPlugin, input.isApplicationPlugin);
+ ENCODE_TYPE_WITH_KEY(encodedData, PluginLoadClientPolicy, clientLoadPolicy, static_cast<PluginLoadClientPolicy>(input.clientLoadPolicy));
+#if PLATFORM(MAC)
+ ENCODE_TYPE_WITH_KEY(encodedData, String, bundleIdentifier, input.bundleIdentifier);
+ ENCODE_TYPE_WITH_KEY(encodedData, String, versionString, input.versionString);
+#endif
return encodedData;
}
@@ -497,6 +493,11 @@
DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, String, desc, info.desc);
DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, Vector<MimeClassInfo>, mimes, info.mimes);
DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, bool, isApplicationPlugin, info.isApplicationPlugin);
+ DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, PluginLoadClientPolicy, clientLoadPolicy, info.clientLoadPolicy);
+#if PLATFORM(MAC)
+ DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, String, bundleIdentifier, input.bundleIdentifier);
+ DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, String, versionString, input.versionString);
+#endif
input = info;
return true;
Modified: trunk/Source/WebCore/replay/WebInputs.json (181561 => 181562)
--- trunk/Source/WebCore/replay/WebInputs.json 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/replay/WebInputs.json 2015-03-16 17:13:04 UTC (rev 181562)
@@ -67,6 +67,13 @@
"header": "plugins/PluginData.h"
},
{
+ "name": "PluginLoadClientPolicy", "mode": "SCALAR", "storage": "uint8_t",
+ "flags": ["ENUM"],
+ "values": ["PluginLoadClientPolicyUndefined", "PluginLoadClientPolicyBlock", "PluginLoadClientPolicyAsk", "PluginLoadClientPolicyAllow", "PluginLoadClientPolicyAllowAlways"],
+ "header": "plugins/PluginData.h"
+ },
+
+ {
"name": "ScrollDirection", "mode": "SCALAR", "storage": "uint8_t",
"flags": ["ENUM"],
"values": ["ScrollUp", "ScrollDown", "ScrollLeft", "ScrollRight"],
Modified: trunk/Source/WebKit/mac/ChangeLog (181561 => 181562)
--- trunk/Source/WebKit/mac/ChangeLog 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/ChangeLog 2015-03-16 17:13:04 UTC (rev 181562)
@@ -1,3 +1,48 @@
+2015-03-16 Conrad Shultz <conrad_shu...@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
+ from the page). As part of this:
+
+ 1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
+ set of plug-ins.
+
+ 2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
+ down the stack.
+
+ 3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
+ a concrete implementation thereof in WebPlatformStrategies in WebKit2.
+
+ 4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
+
+ While currently only used in a very limited manner, the new declarative plug-in policies are written generically
+ so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
+
+ * Plugins/WebBasePluginPackage.mm:
+ (-[WebBasePluginPackage getPluginInfoFromPLists]):
+ Set new members in PluginInfo.
+
+ * Plugins/WebNetscapePluginPackage.mm:
+ (-[WebNetscapePluginPackage getPluginInfoFromResources]):
+ Set new members in PluginInfo.
+
+ * WebCoreSupport/WebPlatformStrategies.h:
+ * WebCoreSupport/WebPlatformStrategies.mm:
+ (WebPlatformStrategies::getWebVisiblePluginInfo):
+ Override to wrap getPluginInfo().
+ (WebPlatformStrategies::setPluginLoadClientPolicy):
+ Override to do nothing.
+ (WebPlatformStrategies::clearPluginClientPolicies):
+ Ditto.
+
+ * WebView/WebFrame.mm:
+ (-[WebFrame _canProvideDocumentSource]):
+ Update to reflect function rename.
+
2015-03-14 Dean Jackson <d...@apple.com>
Feature flag for Animations Level 2
Modified: trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm (181561 => 181562)
--- trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -249,6 +249,11 @@
pluginInfo.desc = description;
pluginInfo.isApplicationPlugin = false;
+ pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+ pluginInfo.bundleIdentifier = self.bundleIdentifier;
+ pluginInfo.versionString = self.bundleVersion;
+#endif
return YES;
}
Modified: trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm (181561 => 181562)
--- trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -146,7 +146,12 @@
pluginInfo.name = theName;
pluginInfo.isApplicationPlugin = false;
-
+ pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+ pluginInfo.bundleIdentifier = self.bundleIdentifier;
+ pluginInfo.versionString = self.bundleVersion;
+#endif
+
[self closeResourceFile:resRef];
return YES;
Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h (181561 => 181562)
--- trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -62,6 +62,11 @@
// WebCore::PluginStrategy
virtual void refreshPlugins() override;
virtual void getPluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
+ virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
+#if PLATFORM(MAC)
+ virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String&, const String&, const String&) override;
+ virtual void clearPluginClientPolicies() override;
+#endif
// WebCore::LoaderStrategy
// - Using default implementation.
Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm (181561 => 181562)
--- trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -128,6 +128,21 @@
END_BLOCK_OBJC_EXCEPTIONS;
}
+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
+{
+ getPluginInfo(page, plugins);
+}
+
+#if PLATFORM(MAC)
+void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy, const String&, const String&, const String&)
+{
+}
+
+void WebPlatformStrategies::clearPluginClientPolicies()
+{
+}
+#endif
+
void WebPlatformStrategies::getTypes(Vector<String>& types, const String& pasteboardName)
{
PlatformPasteboard(pasteboardName).getTypes(types);
Modified: trunk/Source/WebKit/mac/WebView/WebFrame.mm (181561 => 181562)
--- trunk/Source/WebKit/mac/WebView/WebFrame.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/WebView/WebFrame.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -979,8 +979,8 @@
if (WebCore::DOMImplementation::isTextMIMEType(mimeType)
|| Image::supportsType(mimeType)
- || (pluginData && pluginData->supportsMimeType(mimeType, PluginData::AllPlugins) && frame->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
- || (pluginData && pluginData->supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
+ || (pluginData && pluginData->supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && frame->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
+ || (pluginData && pluginData->supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
return NO;
return YES;
Modified: trunk/Source/WebKit/win/ChangeLog (181561 => 181562)
--- trunk/Source/WebKit/win/ChangeLog 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/ChangeLog 2015-03-16 17:13:04 UTC (rev 181562)
@@ -1,3 +1,19 @@
+2015-03-16 Conrad Shultz <conrad_shu...@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ * WebCoreSupport/WebPlatformStrategies.h:
+ * WebCoreSupport/WebPlatformStrategies.cpp:
+ (WebPlatformStrategies::getWebVisiblePluginInfo):
+ Wrap getPluginInfo();
+
+ * WebView.cpp:
+ (WebView::canShowMIMEType):
+ Update to reflect function rename.
+
2015-03-13 Commit Queue <commit-qu...@webkit.org>
Unreviewed, rolling out r181483.
Modified: trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp (181561 => 181562)
--- trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -134,3 +134,8 @@
outPlugins[i] = info;
}
}
+
+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
+{
+ getPluginInfo(page, plugins);
+}
Modified: trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h (181561 => 181562)
--- trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -55,6 +55,7 @@
// WebCore::PluginStrategy
virtual void refreshPlugins();
virtual void getPluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&);
+ virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&);
};
#endif // WebPlatformStrategies_h
Modified: trunk/Source/WebKit/win/WebView.cpp (181561 => 181562)
--- trunk/Source/WebKit/win/WebView.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/WebView.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -2629,8 +2629,8 @@
|| MIMETypeRegistry::isSupportedMediaMIMEType(mimeType);
if (!canShow && m_page) {
- canShow = (m_page->pluginData().supportsMimeType(mimeType, PluginData::AllPlugins) && allowPlugins)
- || m_page->pluginData().supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins);
+ canShow = (m_page->pluginData().supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && allowPlugins)
+ || m_page->pluginData().supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins);
}
if (!canShow)
Modified: trunk/Source/WebKit2/ChangeLog (181561 => 181562)
--- trunk/Source/WebKit2/ChangeLog 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/ChangeLog 2015-03-16 17:13:04 UTC (rev 181562)
@@ -1,3 +1,114 @@
+2015-03-16 Conrad Shultz <conrad_shu...@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
+ from the page). As part of this:
+
+ 1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
+ set of plug-ins.
+
+ 2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
+ down the stack.
+
+ 3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
+ a concrete implementation thereof in WebPlatformStrategies in WebKit2.
+
+ 4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
+
+ While currently only used in a very limited manner, the new declarative plug-in policies are written generically
+ so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
+
+ * Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm:
+ (WebKit::NetscapePluginModule::getPluginInfo):
+ Set new PluginInfo members.
+
+ * Shared/WebCoreArgumentCoders.cpp:
+ (IPC::ArgumentCoder<PluginInfo>::encode):
+ Handle new PluginInfo members.
+ (IPC::ArgumentCoder<PluginInfo>::decode):
+ Ditto.
+
+ * Shared/WebProcessCreationParameters.h:
+ Declare a member to store client plug-in policies.
+
+ * Shared/WebProcessCreationParameters.cpp:
+ (WebKit::WebProcessCreationParameters::encode):
+ Encode the policies.
+ (WebKit::WebProcessCreationParameters::decode):
+ Decode the policies.
+
+ * UIProcess/API/C/WKAPICast.h:
+ (WebKit::toWKPluginLoadClientPolicy):
+ Teach how to cast between WebCore and WebKit2 policy definitions.
+ (WebKit::toPluginLoadClientPolicy):
+ Ditto.
+
+ * UIProcess/API/C/WKPluginLoadPolicy.h:
+ Declare WKPluginLoadClientPolicy, matching PluginLoadClientPolicy in WebCore.
+
+ * UIProcess/API/C/mac/WKContextPrivateMac.h:
+ * UIProcess/API/C/mac/WKContextPrivateMac.mm:
+ (WKContextSetPluginLoadClientPolicy):
+ New function; wrap WebProcessPool::setPluginLoadClientPolicy().
+ (WKContextClearPluginClientPolicies):
+ New function; wrap WebProcessPool::clearPluginClientPolicies().
+
+ * UIProcess/WebProcessPool.h:
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::createNewWebProcess):
+ Copy any client plug-in policies to the new process' creation parameters.
+ (WebKit::WebProcessPool::setPluginLoadClientPolicy):
+ Send SetPluginLoadClientPolicy to all processes and stash the passed-in policy info.
+ (WebKit::WebProcessPool::clearPluginClientPolicies):
+ Send ClearPluginClientPolicies to all processes and clear any stashed policy info.
+
+ * WebProcess/Plugins/PDF/PDFPlugin.mm:
+ (WebKit::PDFPlugin::pluginInfo):
+ Set new PluginInfo member.
+
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+ (WebKit::pluginSupportsExtension):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebKit::WebFrameLoaderClient::objectContentType):
+ Update to reflect reflect function rename.
+
+ * WebProcess/WebCoreSupport/WebPlatformStrategies.h:
+ * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
+ (WebKit::WebPlatformStrategies::getPluginInfo):
+ Pass the Page to populatePluginCache().
+ (WebKit::WebPlatformStrategies::getWebVisiblePluginInfo):
+ New member function; wrap getPluginInfo(); if appropriate, filter out plug-ins the client has asked
+ to block on the current page.
+ (WebKit::WebPlatformStrategies::setPluginLoadClientPolicy):
+ New member function; map empty inputs to a wildcard character and insert the new policy into the nested map.
+ (WebKit::WebPlatformStrategies::clearPluginClientPolicies):
+ New member function; empty m_hostsToPluginIdentifierData.
+ (WebKit::WebPlatformStrategies::pluginLoadClientPolicyForHost):
+ New member function; look up the most specific policy for the given plug-in and host.
+ (WebKit::WebPlatformStrategies::populatePluginCache):
+ If appropriate, set the client load policy on the plug-ins; do this irrespective of whether the cache has
+ been populated since the Page, and therefore host, may change.
+
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::canShowMIMEType):
+ Update to reflect function rename.
+
+ * WebProcess/WebProcess.h:
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::initializeWebProcess):
+ Enumerate and process the client plug-in policies in the creation parameters.
+ (WebKit::WebProcess::setPluginLoadClientPolicy):
+ New member function; wrap PluginStrategy::setPluginLoadClientPolicy.
+ (WebKit::WebProcess::clearPluginClientPolicies):
+ New member function; wrap PluginStrategy::clearPluginClientPolicies().
+
+ * WebProcess/WebProcess.messages.in:
+ Add messages for setting and clearing policies.
+
2015-03-16 Carlos Garcia Campos <cgar...@igalia.com>
Unreviewed. Add new Notification classes to GTK+ API documentation.
Modified: trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm (181561 => 181562)
--- trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -399,7 +399,12 @@
plugin.info.desc = plugin.info.file;
plugin.info.isApplicationPlugin = false;
-
+ plugin.info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+ plugin.info.bundleIdentifier = plugin.bundleIdentifier;
+ plugin.info.versionString = plugin.versionString;
+#endif
+
return true;
}
Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp (181561 => 181562)
--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -566,9 +566,18 @@
void ArgumentCoder<PluginInfo>::encode(ArgumentEncoder& encoder, const PluginInfo& pluginInfo)
{
- encoder << pluginInfo.name << pluginInfo.file << pluginInfo.desc << pluginInfo.mimes << pluginInfo.isApplicationPlugin;
+ encoder << pluginInfo.name;
+ encoder << pluginInfo.file;
+ encoder << pluginInfo.desc;
+ encoder << pluginInfo.mimes;
+ encoder << pluginInfo.isApplicationPlugin;
+ encoder.encodeEnum(pluginInfo.clientLoadPolicy);
+#if PLATFORM(MAC)
+ encoder << pluginInfo.bundleIdentifier;
+ encoder << pluginInfo.versionString;
+#endif
}
-
+
bool ArgumentCoder<PluginInfo>::decode(ArgumentDecoder& decoder, PluginInfo& pluginInfo)
{
if (!decoder.decode(pluginInfo.name))
@@ -581,6 +590,15 @@
return false;
if (!decoder.decode(pluginInfo.isApplicationPlugin))
return false;
+ PluginLoadClientPolicy clientLoadPolicy;
+ if (!decoder.decodeEnum(clientLoadPolicy))
+ return false;
+#if PLATFORM(MAC)
+ if (!decoder.decode(pluginInfo.bundleIdentifier))
+ return false;
+ if (!decoder.decode(pluginInfo.versionString))
+ return false;
+#endif
return true;
}
Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp (181561 => 181562)
--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -144,6 +144,10 @@
encoder << hasSelectionServices;
encoder << hasRichContentServices;
#endif
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ encoder << pluginLoadClientPolicies;
+#endif
}
bool WebProcessCreationParameters::decode(IPC::ArgumentDecoder& decoder, WebProcessCreationParameters& parameters)
@@ -302,6 +306,11 @@
return false;
#endif
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ if (!decoder.decode(parameters.pluginLoadClientPolicies))
+ return false;
+#endif
+
return true;
}
Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h (181561 => 181562)
--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -167,6 +167,10 @@
bool hasSelectionServices;
bool hasRichContentServices;
#endif
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ HashMap<String, HashMap<String, HashMap<String, uint8_t>>> pluginLoadClientPolicies;
+#endif
};
} // namespace WebKit
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h (181561 => 181562)
--- trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -47,6 +47,7 @@
#include "WebGrammarDetail.h"
#include <WebCore/Credential.h>
#include <WebCore/FrameLoaderTypes.h>
+#include <WebCore/PluginData.h>
#include <WebCore/ProtectionSpace.h>
#include <WebCore/Settings.h>
@@ -482,6 +483,25 @@
return kWKPluginLoadPolicyBlocked;
}
+inline WKPluginLoadClientPolicy toWKPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy PluginLoadClientPolicy)
+{
+ switch (PluginLoadClientPolicy) {
+ case WebCore::PluginLoadClientPolicyUndefined:
+ return kWKPluginLoadClientPolicyUndefined;
+ case WebCore::PluginLoadClientPolicyBlock:
+ return kWKPluginLoadClientPolicyBlock;
+ case WebCore::PluginLoadClientPolicyAsk:
+ return kWKPluginLoadClientPolicyAsk;
+ case WebCore::PluginLoadClientPolicyAllow:
+ return kWKPluginLoadClientPolicyAllow;
+ case WebCore::PluginLoadClientPolicyAllowAlways:
+ return kWKPluginLoadClientPolicyAllowAlways;
+ }
+
+ ASSERT_NOT_REACHED();
+ return kWKPluginLoadClientPolicyBlock;
+}
+
inline PluginModuleLoadPolicy toPluginModuleLoadPolicy(WKPluginLoadPolicy pluginLoadPolicy)
{
switch (pluginLoadPolicy) {
@@ -497,6 +517,25 @@
return PluginModuleBlocked;
}
+inline WebCore::PluginLoadClientPolicy toPluginLoadClientPolicy(WKPluginLoadClientPolicy pluginLoadClientPolicy)
+{
+ switch (pluginLoadClientPolicy) {
+ case kWKPluginLoadClientPolicyUndefined:
+ return WebCore::PluginLoadClientPolicyUndefined;
+ case kWKPluginLoadClientPolicyBlock:
+ return WebCore::PluginLoadClientPolicyBlock;
+ case kWKPluginLoadClientPolicyAsk:
+ return WebCore::PluginLoadClientPolicyAsk;
+ case kWKPluginLoadClientPolicyAllow:
+ return WebCore::PluginLoadClientPolicyAllow;
+ case kWKPluginLoadClientPolicyAllowAlways:
+ return WebCore::PluginLoadClientPolicyAllowAlways;
+ }
+
+ ASSERT_NOT_REACHED();
+ return WebCore::PluginLoadClientPolicyBlock;
+}
+
inline WebCore::WebGLLoadPolicy toWebGLLoadPolicy(WKWebGLLoadPolicy webGLLoadPolicy)
{
switch (webGLLoadPolicy) {
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h (181561 => 181562)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -40,6 +40,14 @@
};
typedef uint32_t WKPluginLoadPolicy;
+enum WKPluginLoadClientPolicy {
+ kWKPluginLoadClientPolicyUndefined = 0,
+ kWKPluginLoadClientPolicyBlock,
+ kWKPluginLoadClientPolicyAsk,
+ kWKPluginLoadClientPolicyAllow,
+ kWKPluginLoadClientPolicyAllowAlways,
+};
+
#ifdef __cplusplus
}
#endif
Modified: trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h (181561 => 181562)
--- trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -27,6 +27,7 @@
#define WKContextPrivateMac_h
#include <WebKit/WKBase.h>
+#include <WebKit/WKPluginLoadPolicy.h>
#ifdef __cplusplus
extern "C" {
@@ -37,6 +38,9 @@
WK_EXPORT bool WKContextIsPlugInUpdateAvailable(WKContextRef context, WKStringRef plugInBundleIdentifier);
+WK_EXPORT void WKContextSetPluginLoadClientPolicy(WKContextRef context, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString);
+WK_EXPORT void WKContextClearPluginClientPolicies(WKContextRef context);
+
WK_EXPORT WKDictionaryRef WKContextCopyPlugInInfoForBundleIdentifier(WKContextRef context, WKStringRef plugInBundleIdentifier);
typedef void (^WKContextGetInfoForInstalledPlugInsBlock)(WKArrayRef, WKErrorRef);
Modified: trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm (181561 => 181562)
--- trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -52,6 +52,20 @@
#endif
}
+void WKContextSetPluginLoadClientPolicy(WKContextRef contextRef, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ toImpl(contextRef)->setPluginLoadClientPolicy(toPluginLoadClientPolicy(policy), toWTFString(host), toWTFString(bundleIdentifier), toWTFString(versionString));
+#endif
+}
+
+void WKContextClearPluginClientPolicies(WKContextRef contextRef)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ toImpl(contextRef)->clearPluginClientPolicies();
+#endif
+}
+
WKDictionaryRef WKContextCopyPlugInInfoForBundleIdentifier(WKContextRef contextRef, WKStringRef plugInBundleIdentifierRef)
{
#if ENABLE(NETSCAPE_PLUGIN_API)
Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp (181561 => 181562)
--- trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -683,6 +683,10 @@
serviceController.refreshExistingServices();
#endif
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ parameters.pluginLoadClientPolicies = m_pluginLoadClientPolicies;
+#endif
+
#if OS(LINUX)
parameters.shouldEnableMemoryPressureReliefLogging = true;
#endif
@@ -1418,7 +1422,34 @@
m_client.plugInInformationBecameAvailable(this, API::Array::create(WTF::move(plugins)).get());
}
+
+void WebProcessPool::setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy policy, const String& host, const String& bundleIdentifier, const String& versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ HashMap<String, HashMap<String, uint8_t>> policiesByIdentifier;
+ if (m_pluginLoadClientPolicies.contains(host))
+ policiesByIdentifier = m_pluginLoadClientPolicies.get(host);
+
+ HashMap<String, uint8_t> versionsToPolicies;
+ if (policiesByIdentifier.contains(bundleIdentifier))
+ versionsToPolicies = policiesByIdentifier.get(bundleIdentifier);
+
+ versionsToPolicies.set(versionString, policy);
+ policiesByIdentifier.set(bundleIdentifier, versionsToPolicies);
+ m_pluginLoadClientPolicies.set(host, policiesByIdentifier);
#endif
+
+ sendToAllProcesses(Messages::WebProcess::SetPluginLoadClientPolicy(policy, host, bundleIdentifier, versionString));
+}
+
+void WebProcessPool::clearPluginClientPolicies()
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ m_pluginLoadClientPolicies.clear();
+#endif
+ sendToAllProcesses(Messages::WebProcess::ClearPluginClientPolicies());
+}
+#endif
void WebProcessPool::setMemoryCacheDisabled(bool disabled)
{
Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (181561 => 181562)
--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -183,6 +183,9 @@
void setAdditionalPluginsDirectory(const String&);
PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
+
+ void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString);
+ void clearPluginClientPolicies();
#endif
#if ENABLE(NETWORK_PROCESS)
@@ -540,6 +543,10 @@
#if ENABLE(CONTENT_EXTENSIONS)
HashMap<String, String> m_encodedContentExtensions;
#endif
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ HashMap<String, HashMap<String, HashMap<String, uint8_t>>> m_pluginLoadClientPolicies;
+#endif
};
template<typename T>
Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm 2015-03-16 17:13:04 UTC (rev 181562)
@@ -539,6 +539,7 @@
PluginInfo info;
info.name = builtInPDFPluginName();
info.isApplicationPlugin = true;
+ info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
MimeClassInfo pdfMimeClassInfo;
pdfMimeClassInfo.type = "application/pdf";
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -1447,8 +1447,11 @@
{
ASSERT(extension.lower() == extension);
- for (size_t i = 0; i < pluginData.mimes().size(); ++i) {
- const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ for (size_t i = 0; i < mimes.size(); ++i) {
+ const MimeClassInfo& mimeClassInfo = mimes[i];
if (mimeClassInfo.extensions.contains(extension))
return true;
@@ -1483,9 +1486,9 @@
bool plugInSupportsMIMEType = false;
if (WebPage* webPage = m_frame->page()) {
const PluginData& pluginData = webPage->corePage()->pluginData();
- if (pluginData.supportsMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
+ if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
plugInSupportsMIMEType = true;
- else if (pluginData.supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins))
+ else if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins))
plugInSupportsMIMEType = true;
}
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2011, 2012, 2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -44,6 +44,7 @@
#include "WebProcess.h"
#include "WebProcessProxyMessages.h"
#include <WebCore/Color.h>
+#include <WebCore/DocumentLoader.h>
#include <WebCore/IDBFactoryBackendInterface.h>
#include <WebCore/LoaderStrategy.h>
#include <WebCore/MainFrame.h>
@@ -266,7 +267,8 @@
void WebPlatformStrategies::getPluginInfo(const WebCore::Page* page, Vector<WebCore::PluginInfo>& plugins)
{
#if ENABLE(NETSCAPE_PLUGIN_API)
- populatePluginCache();
+ ASSERT_ARG(page, page);
+ populatePluginCache(*page);
if (page->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin)) {
plugins = m_cachedPlugins;
@@ -280,21 +282,104 @@
#endif // ENABLE(NETSCAPE_PLUGIN_API)
}
+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
+{
+ ASSERT_ARG(page, page);
+ ASSERT_ARG(plugins, plugins.isEmpty());
+
+ getPluginInfo(page, plugins);
+
+#if PLATFORM(MAC)
+ for (int32_t i = plugins.size() - 1; i >= 0; --i) {
+ PluginInfo& info = plugins.at(i);
+ PluginLoadClientPolicy clientPolicy = info.clientLoadPolicy;
+ // Allow built-in plugins. Also tentatively allow plugins that the client might later selectively permit.
+ if (info.isApplicationPlugin || clientPolicy == PluginLoadClientPolicyAsk)
+ continue;
+
+ if (clientPolicy == PluginLoadClientPolicyBlock)
+ plugins.remove(i);
+ }
+#endif
+}
+
+#if PLATFORM(MAC)
+void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy clientPolicy, const String& host, const String& bundleIdentifier, const String& versionString)
+{
+ String hostToSet = host.isNull() || !host.length() ? "*" : host;
+ String bundleIdentifierToSet = bundleIdentifier.isNull() || !bundleIdentifier.length() ? "*" : bundleIdentifier;
+ String versionStringToSet = versionString.isNull() || !versionString.length() ? "*" : versionString;
+
+ PluginPolicyMapsByIdentifier policiesByIdentifier;
+ if (m_hostsToPluginIdentifierData.contains(hostToSet))
+ policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToSet);
+
+ PluginLoadClientPoliciesByBundleVersion versionsToPolicies;
+ if (policiesByIdentifier.contains(bundleIdentifierToSet))
+ versionsToPolicies = policiesByIdentifier.get(bundleIdentifierToSet);
+
+ versionsToPolicies.set(versionStringToSet, clientPolicy);
+ policiesByIdentifier.set(bundleIdentifierToSet, versionsToPolicies);
+ m_hostsToPluginIdentifierData.set(hostToSet, policiesByIdentifier);
+}
+
+void WebPlatformStrategies::clearPluginClientPolicies()
+{
+ m_hostsToPluginIdentifierData.clear();
+}
+
+#endif
+
#if ENABLE(NETSCAPE_PLUGIN_API)
-void WebPlatformStrategies::populatePluginCache()
+#if PLATFORM(MAC)
+bool WebPlatformStrategies::pluginLoadClientPolicyForHost(const String& host, const PluginInfo& info, PluginLoadClientPolicy& policy) const
{
- if (m_pluginCacheIsPopulated)
- return;
+ String hostToLookUp = host;
+ if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+ hostToLookUp = "*";
+ if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+ return false;
- ASSERT(m_cachedPlugins.isEmpty());
-
- // FIXME: Should we do something in case of error here?
- if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins), 0))
- return;
+ PluginPolicyMapsByIdentifier policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToLookUp);
+ String identifier = info.bundleIdentifier;
+ if (!identifier || !policiesByIdentifier.contains(identifier))
+ identifier = "*";
+ if (!policiesByIdentifier.contains(identifier))
+ return false;
- m_shouldRefreshPlugins = false;
- m_pluginCacheIsPopulated = true;
+ PluginLoadClientPoliciesByBundleVersion versionsToPolicies = policiesByIdentifier.get(identifier);
+ String version = info.versionString;
+ if (!version || !versionsToPolicies.contains(version))
+ version = "*";
+ if (!versionsToPolicies.contains(version))
+ return false;
+
+ policy = versionsToPolicies.get(version);
+ return true;
}
+#endif // PLATFORM(MAC)
+
+void WebPlatformStrategies::populatePluginCache(const WebCore::Page& page)
+{
+ if (!m_pluginCacheIsPopulated) {
+ if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins), 0))
+ return;
+
+ m_shouldRefreshPlugins = false;
+ m_pluginCacheIsPopulated = true;
+ }
+
+#if PLATFORM(MAC)
+ String pageHost = page.mainFrame().loader().documentLoader()->responseURL().host();
+ for (PluginInfo& info : m_cachedPlugins) {
+ PluginLoadClientPolicy clientPolicy;
+ if (pluginLoadClientPolicyForHost(pageHost, info, clientPolicy))
+ info.clientLoadPolicy = clientPolicy;
+ }
+#else
+ UNUSED_PARAM(page);
+#endif // not PLATFORM(MAC)
+}
#endif // ENABLE(NETSCAPE_PLUGIN_API)
#if PLATFORM(COCOA)
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -31,6 +31,7 @@
#include <WebCore/PasteboardStrategy.h>
#include <WebCore/PlatformStrategies.h>
#include <WebCore/PluginStrategy.h>
+#include <wtf/HashMap.h>
#include <wtf/NeverDestroyed.h>
namespace WebKit {
@@ -67,7 +68,16 @@
// WebCore::PluginStrategy
virtual void refreshPlugins() override;
virtual void getPluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
+ virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
+#if PLATFORM(MAC)
+ typedef HashMap<String, WebCore::PluginLoadClientPolicy> PluginLoadClientPoliciesByBundleVersion;
+ typedef HashMap<String, PluginLoadClientPoliciesByBundleVersion> PluginPolicyMapsByIdentifier;
+
+ virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString) override;
+ virtual void clearPluginClientPolicies() override;
+#endif
+
// WebCore::PasteboardStrategy
#if PLATFORM(IOS)
virtual void writeToPasteboard(const WebCore::PasteboardWebContent&) override;
@@ -99,11 +109,16 @@
#if ENABLE(NETSCAPE_PLUGIN_API)
// WebCore::PluginStrategy implementation.
- void populatePluginCache();
+ void populatePluginCache(const WebCore::Page&);
bool m_pluginCacheIsPopulated;
bool m_shouldRefreshPlugins;
Vector<WebCore::PluginInfo> m_cachedPlugins;
Vector<WebCore::PluginInfo> m_cachedApplicationPlugins;
+
+#if PLATFORM(MAC)
+ HashMap<String, PluginPolicyMapsByIdentifier> m_hostsToPluginIdentifierData;
+ bool pluginLoadClientPolicyForHost(const String&, const WebCore::PluginInfo&, WebCore::PluginLoadClientPolicy&) const;
+#endif // PLATFORM(MAC)
#endif // ENABLE(NETSCAPE_PLUGIN_API)
};
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -4426,11 +4426,11 @@
return true;
const PluginData& pluginData = m_page->pluginData();
- if (pluginData.supportsMimeType(MIMEType, PluginData::AllPlugins) && corePage()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
+ if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::AllPlugins) && corePage()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
return true;
// We can use application plugins even if plugins aren't enabled.
- if (pluginData.supportsMimeType(MIMEType, PluginData::OnlyApplicationPlugins))
+ if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::OnlyApplicationPlugins))
return true;
return false;
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2015-03-16 17:13:04 UTC (rev 181562)
@@ -384,6 +384,15 @@
Inspector::RemoteInspector::singleton().setParentProcessInformation(presenterApplicationPid(), auditData);
}
#endif
+
+#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
+ for (auto hostIter = parameters.pluginLoadClientPolicies.begin(); hostIter != parameters.pluginLoadClientPolicies.end(); ++hostIter) {
+ for (auto bundleIdentifierIter = hostIter->value.begin(); bundleIdentifierIter != hostIter->value.end(); ++bundleIdentifierIter) {
+ for (auto versionIter = bundleIdentifierIter->value.begin(); versionIter != bundleIdentifierIter->value.end(); ++versionIter)
+ platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(versionIter->value), hostIter->key, bundleIdentifierIter->key, versionIter->key);
+ }
+ }
+#endif
}
#if ENABLE(NETWORK_PROCESS)
@@ -862,6 +871,20 @@
parentProcessConnection()->send(Messages::WebProcessPool::PlugInDidReceiveUserInteraction(plugInOriginHash, sessionID), 0);
}
+void WebProcess::setPluginLoadClientPolicy(uint8_t policy, const String& host, const String& bundleIdentifier, const String& versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
+ platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(policy), host, bundleIdentifier, versionString);
+#endif
+}
+
+void WebProcess::clearPluginClientPolicies()
+{
+#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
+ platformStrategies()->pluginStrategy()->clearPluginClientPolicies();
+#endif
+}
+
static void fromCountedSetToHashMap(TypeCountSet* countedSet, HashMap<String, uint64_t>& map)
{
TypeCountSet::const_iterator end = countedSet->end();
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebProcess.h 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h 2015-03-16 17:13:04 UTC (rev 181562)
@@ -123,6 +123,8 @@
bool shouldPlugInAutoStartFromOrigin(WebPage&, const String& pageOrigin, const String& pluginOrigin, const String& mimeType);
void plugInDidStartFromOrigin(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID);
void plugInDidReceiveUserInteraction(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID);
+ void setPluginLoadClientPolicy(uint8_t policy, const String& host, const String& bundleIdentifier, const String& versionString);
+ void clearPluginClientPolicies();
bool fullKeyboardAccessEnabled() const { return m_fullKeyboardAccessEnabled; }
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.messages.in (181561 => 181562)
--- trunk/Source/WebKit2/WebProcess/WebProcess.messages.in 2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.messages.in 2015-03-16 17:13:04 UTC (rev 181562)
@@ -56,6 +56,8 @@
DidAddPlugInAutoStartOriginHash(uint32_t hash, double expirationTime, WebCore::SessionID sessionID)
ResetPlugInAutoStartOriginDefaultHashes(HashMap<uint32_t,double> hashes)
ResetPlugInAutoStartOriginHashes(HashMap<WebCore::SessionID, HashMap<uint32_t,double>> hashes)
+ SetPluginLoadClientPolicy(uint8_t policy, String host, String bundleIdentifier, String versionString)
+ ClearPluginClientPolicies()
void StartMemorySampler(WebKit::SandboxExtension::Handle sampleLogFileHandle, String sampleLogFilePath, double interval);
void StopMemorySampler();