Allow clients to selectively disable plug-ins
authorconrad_shultz@apple.com <conrad_shultz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Mar 2015 18:58:32 +0000 (18:58 +0000)
committerconrad_shultz@apple.com <conrad_shultz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Mar 2015 18:58:32 +0000 (18:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=142506

Reviewed by Anders Carlsson.

Source/WebCore:

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.

Source/WebKit/mac:

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.

Source/WebKit/win:

* WebCoreSupport/WebPlatformStrategies.h:
* WebCoreSupport/WebPlatformStrategies.cpp:
(WebPlatformStrategies::getWebVisiblePluginInfo):
Wrap getPluginInfo();

* WebView.cpp:
(WebView::canShowMIMEType):
Update to reflect function rename.

Source/WebKit2:

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.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@181483 268f45cc-cd09-0410-ab3c-d52691b4dbfc

44 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/DOMImplementation.cpp
Source/WebCore/loader/SubframeLoader.cpp
Source/WebCore/platform/PlatformStrategies.h
Source/WebCore/plugins/DOMMimeType.cpp
Source/WebCore/plugins/DOMMimeType.h
Source/WebCore/plugins/DOMMimeTypeArray.cpp
Source/WebCore/plugins/DOMPlugin.cpp
Source/WebCore/plugins/DOMPlugin.h
Source/WebCore/plugins/DOMPluginArray.cpp
Source/WebCore/plugins/PluginData.cpp
Source/WebCore/plugins/PluginData.h
Source/WebCore/plugins/PluginStrategy.h
Source/WebCore/replay/SerializationMethods.cpp
Source/WebCore/replay/WebInputs.json
Source/WebKit/mac/ChangeLog
Source/WebKit/mac/Plugins/WebBasePluginPackage.mm
Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm
Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h
Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm
Source/WebKit/mac/WebView/WebFrame.mm
Source/WebKit/win/ChangeLog
Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp
Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h
Source/WebKit/win/WebView.cpp
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm
Source/WebKit2/Shared/WebCoreArgumentCoders.cpp
Source/WebKit2/Shared/WebProcessCreationParameters.cpp
Source/WebKit2/Shared/WebProcessCreationParameters.h
Source/WebKit2/UIProcess/API/C/WKAPICast.h
Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h
Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h
Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm
Source/WebKit2/UIProcess/WebProcessPool.cpp
Source/WebKit2/UIProcess/WebProcessPool.h
Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm
Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h
Source/WebKit2/WebProcess/WebPage/WebPage.cpp
Source/WebKit2/WebProcess/WebProcess.cpp
Source/WebKit2/WebProcess/WebProcess.h
Source/WebKit2/WebProcess/WebProcess.messages.in

index 93fe9d4..5ea49e0 100644 (file)
@@ -1,3 +1,134 @@
+2015-03-09  Conrad Shultz  <conrad_shultz@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-13  Chris Dumez  <cdumez@apple.com>
 
         XMLHttpRequests should not prevent a page from entering PageCache
index 40c151b..ae3d842 100644 (file)
@@ -329,7 +329,7 @@ RefPtr<Document> DOMImplementation::createDocument(const String& type, Frame* fr
 
     // 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 @@ RefPtr<Document> DOMImplementation::createDocument(const String& type, Frame* fr
     // 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);
index bcaa98d..b0fd52f 100644 (file)
@@ -167,8 +167,11 @@ static String findPluginMIMETypeFromURL(Page* page, const String& url)
 
     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 @@ static void logPluginRequest(Page* page, const String& mimeType, const String& u
             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 @@ bool SubframeLoader::shouldUsePlugin(const URL& url, const String& mimeType, boo
     // 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;
     }
index 740bcfd..4e625fb 100644 (file)
@@ -88,7 +88,7 @@ private:
     PluginStrategy* m_pluginStrategy;
 };
 
-PlatformStrategies* platformStrategies();
+WEBCORE_EXPORT PlatformStrategies* platformStrategies();
 WEBCORE_EXPORT void setPlatformStrategies(PlatformStrategies*);
 bool hasPlatformStrategies();
     
index 3e1ef9a..e28a8a0 100644 (file)
@@ -42,7 +42,7 @@ DOMMimeType::~DOMMimeType()
 {
 }
 
-const String &DOMMimeType::type() const
+String DOMMimeType::type() const
 {
     return mimeClassInfo().type;
 }
@@ -60,17 +60,28 @@ String DOMMimeType::suffixes() const
     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
index 5083e24..a0903a2 100644 (file)
@@ -37,13 +37,13 @@ public:
     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;
index 6b2c439..0e14fd3 100644 (file)
@@ -48,7 +48,11 @@ unsigned DOMMimeTypeArray::length() const
     PluginData* data = getPluginData();
     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 @@ PassRefPtr<DOMMimeType> DOMMimeTypeArray::item(unsigned index)
     PluginData* data = getPluginData();
     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 @@ bool DOMMimeTypeArray::canGetItemsForName(const AtomicString& propertyName)
     PluginData *data = getPluginData();
     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 @@ PassRefPtr<DOMMimeType> DOMMimeTypeArray::namedItem(const AtomicString& property
     PluginData *data = getPluginData();
     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);
index 3fe917f..f2488bc 100644 (file)
@@ -56,16 +56,23 @@ unsigned DOMPlugin::length() const
     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 @@ PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index)
 
 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 @@ bool DOMPlugin::canGetItemsForName(const AtomicString& propertyName)
 
 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);
index 125ca26..522098e 100644 (file)
@@ -48,7 +48,7 @@ public:
     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;
index 815ea25..12e51a9 100644 (file)
@@ -48,7 +48,8 @@ unsigned DOMPluginArray::length() const
     PluginData* data = pluginData();
     if (!data)
         return 0;
-    return data->plugins().size();
+
+    return data->webVisiblePlugins().size();
 }
 
 PassRefPtr<DOMPlugin> DOMPluginArray::item(unsigned index)
@@ -56,7 +57,8 @@ PassRefPtr<DOMPlugin> DOMPluginArray::item(unsigned index)
     PluginData* data = pluginData();
     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 @@ bool DOMPluginArray::canGetItemsForName(const AtomicString& propertyName)
     PluginData* data = pluginData();
     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 @@ PassRefPtr<DOMPlugin> DOMPluginArray::namedItem(const AtomicString& propertyName
     PluginData* data = pluginData();
     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);
index 6dd4eaa..d2821ab 100644 (file)
@@ -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
@@ -31,48 +31,75 @@ namespace WebCore {
 
 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
+const PluginInfo* PluginData::pluginInfoForWebVisibleMimeType(const String& mimeType) const
 {
-    for (unsigned i = 0; i < m_mimes.size(); ++i) {
-        const MimeClassInfo& info = m_mimes[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)
-            return &m_plugins[m_mimePluginIndices[i]];
+            return &plugins[mimePluginIndices[i]];
     }
 
     return 0;
 }
 
-String PluginData::pluginNameForMimeType(const String& mimeType) const
+String PluginData::pluginNameForWebVisibleMimeType(const String& mimeType) const
 {
-    if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
+    if (const PluginInfo* info = pluginInfoForWebVisibleMimeType(mimeType))
         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))
+    if (const PluginInfo* info = pluginInfoForWebVisibleMimeType(mimeType))
         return info->file;
     return String();
 }
@@ -82,11 +109,11 @@ void PluginData::refresh()
     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);
 }
 
 }
index 1f26679..981684d 100644 (file)
@@ -29,6 +29,24 @@ namespace WebCore {
 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 @@ struct PluginInfo {
     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 @@ public:
     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();
+    const PluginInfo* pluginInfoForWebVisibleMimeType(const String& mimeType) 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;
 };
 
 }
index 05d199f..3a40ceb 100644 (file)
@@ -36,6 +36,11 @@ class PluginStrategy {
 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() { }
index 669a101..7236ac1 100644 (file)
@@ -53,6 +53,7 @@ using WebCore::PlatformMouseEvent;
 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 @@ bool EncodingTraits<PlatformWheelEvent>::decodeValue(EncodedValue& encodedData,
 
 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,14 +457,9 @@ public:
 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));
 
-    input = adoptRef(new DeserializedPluginData(plugins, mimes, castedMimePluginIndices));
+    // FIXME: This needs to work in terms of web-visible plug-ins.
+    input = adoptRef(new DeserializedPluginData(plugins));
 
     return true;
 }
@@ -483,6 +474,11 @@ EncodedValue EncodingTraits<PluginInfo>::encodeValue(const PluginInfo& input)
     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 @@ bool EncodingTraits<PluginInfo>::decodeValue(EncodedValue& encodedData, PluginIn
     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;
index b17231e..7d9b544 100644 (file)
                 "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"],
index 1287e36..eae15e9 100644 (file)
@@ -1,3 +1,48 @@
+2015-03-10  Conrad Shultz  <conrad_shultz@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-10  Sam Weinig  <sam@webkit.org>
 
         Allow adding a button in input elements for auto fill related functionality
index a4820d8..9dd5aaa 100644 (file)
@@ -249,6 +249,11 @@ static NSString *pathByResolvingSymlinksAndAliases(NSString *thePath)
     pluginInfo.desc = description;
 
     pluginInfo.isApplicationPlugin = false;
+    pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+    pluginInfo.bundleIdentifier = self.bundleIdentifier;
+    pluginInfo.versionString = self.bundleVersion;
+#endif
 
     return YES;
 }
index 1906ef3..5e45c1a 100644 (file)
@@ -146,7 +146,12 @@ using namespace WebCore;
     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;
index 3d568fd..8e48d8f 100644 (file)
@@ -62,6 +62,11 @@ private:
     // 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.
index e75f0c7..9bb3442 100644 (file)
@@ -128,6 +128,21 @@ void WebPlatformStrategies::getPluginInfo(const Page* page, Vector<PluginInfo>&
     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);
index f9840be..97a21e2 100644 (file)
@@ -979,8 +979,8 @@ static inline WebDataSource *dataSource(DocumentLoader* loader)
 
     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;
index 6ecf412..3bcf7bc 100644 (file)
@@ -1,3 +1,19 @@
+2015-03-10  Conrad Shultz  <conrad_shultz@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-04  Brent Fulgham  <bfulgham@apple.com>
 
         [Win] AX: Implement support for ARIA 1.1 'switch' role
index a32099b..b1e4d54 100644 (file)
@@ -134,3 +134,8 @@ void WebPlatformStrategies::getPluginInfo(const WebCore::Page*, Vector<WebCore::
         outPlugins[i] = info;
     }
 }
+
+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
+{
+    getPluginInfo(page, plugins);
+}
index 8a7cd0f..e617a36 100644 (file)
@@ -55,6 +55,7 @@ private:
     // 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
index 3581849..e905f83 100644 (file)
@@ -2629,8 +2629,8 @@ bool WebView::canShowMIMEType(const String& mimeType)
         || 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)
index a697ad6..d6c773a 100644 (file)
@@ -1,3 +1,114 @@
+2015-03-10  Conrad Shultz  <conrad_shultz@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-12  Jon Honeycutt  <jhoneycutt@apple.com>
 
         Use UIDocumentMenuViewController to allow selection of files from
index a50c50e..e6cf81a 100644 (file)
@@ -399,7 +399,12 @@ bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginModuleI
         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;
 }
 
index 4ce9bf0..de442e8 100644 (file)
@@ -566,9 +566,18 @@ bool ArgumentCoder<MimeClassInfo>::decode(ArgumentDecoder& decoder, MimeClassInf
 
 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 @@ bool ArgumentCoder<PluginInfo>::decode(ArgumentDecoder& decoder, PluginInfo& plu
         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;
 }
index 6df5a47..91a3361 100644 (file)
@@ -144,6 +144,10 @@ void WebProcessCreationParameters::encode(IPC::ArgumentEncoder& encoder) const
     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 @@ bool WebProcessCreationParameters::decode(IPC::ArgumentDecoder& decoder, WebProc
         return false;
 #endif
 
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    if (!decoder.decode(parameters.pluginLoadClientPolicies))
+        return false;
+#endif
+
     return true;
 }
 
index 8664823..c99c3f2 100644 (file)
@@ -167,6 +167,10 @@ struct WebProcessCreationParameters {
     bool hasSelectionServices;
     bool hasRichContentServices;
 #endif
+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    HashMap<String, HashMap<String, HashMap<String, uint8_t>>> pluginLoadClientPolicies;
+#endif
 };
 
 } // namespace WebKit
index 4885bdd..f18e8b9 100644 (file)
@@ -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 @@ inline WKPluginLoadPolicy toWKPluginLoadPolicy(PluginModuleLoadPolicy pluginModu
     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 @@ inline PluginModuleLoadPolicy toPluginModuleLoadPolicy(WKPluginLoadPolicy plugin
     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) {
index 715935a..ac8299d 100644 (file)
@@ -40,6 +40,14 @@ enum {
 };
 typedef uint32_t WKPluginLoadPolicy;
 
+enum WKPluginLoadClientPolicy {
+    kWKPluginLoadClientPolicyUndefined = 0,
+    kWKPluginLoadClientPolicyBlock,
+    kWKPluginLoadClientPolicyAsk,
+    kWKPluginLoadClientPolicyAllow,
+    kWKPluginLoadClientPolicyAllowAlways,
+};
+
 #ifdef __cplusplus
 }
 #endif
index 6b3fdf2..3c5101b 100644 (file)
@@ -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 void WKContextSetProcessSuppressionEnabled(WKContextRef context, bool
 
 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);
index 7a76238..ef2e24d 100644 (file)
@@ -52,6 +52,20 @@ bool WKContextIsPlugInUpdateAvailable(WKContextRef contextRef, WKStringRef plugI
 #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)
index 8f3f918..ef096f1 100644 (file)
@@ -683,6 +683,10 @@ WebProcessProxy& WebProcessPool::createNewWebProcess()
     serviceController.refreshExistingServices();
 #endif
 
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    parameters.pluginLoadClientPolicies = m_pluginLoadClientPolicies;
+#endif
+
 #if OS(LINUX)
     parameters.shouldEnableMemoryPressureReliefLogging = true;
 #endif
@@ -1418,6 +1422,33 @@ void WebProcessPool::pluginInfoStoreDidLoadPlugins(PluginInfoStore* store)
 
     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)
index 0960531..435f517 100644 (file)
@@ -183,6 +183,9 @@ public:
     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 @@ private:
 #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>
index 0ac9192..3c96558 100644 (file)
@@ -539,6 +539,7 @@ PluginInfo PDFPlugin::pluginInfo()
     PluginInfo info;
     info.name = builtInPDFPluginName();
     info.isApplicationPlugin = true;
+    info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
 
     MimeClassInfo pdfMimeClassInfo;
     pdfMimeClassInfo.type = "application/pdf";
index 6386b36..9e8572e 100644 (file)
@@ -1447,8 +1447,11 @@ static bool pluginSupportsExtension(const PluginData& pluginData, const String&
 {
     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 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
     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;
     }
     
index e3f42df..236880a 100644 (file)
@@ -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::refreshPlugins()
 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,20 +282,103 @@ void WebPlatformStrategies::getPluginInfo(const WebCore::Page* page, Vector<WebC
 #endif // ENABLE(NETSCAPE_PLUGIN_API)
 }
 
-#if ENABLE(NETSCAPE_PLUGIN_API)
-void WebPlatformStrategies::populatePluginCache()
+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
 {
-    if (m_pluginCacheIsPopulated)
-        return;
+    ASSERT_ARG(page, page);
+    ASSERT_ARG(plugins, plugins.isEmpty());
 
-    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;
+    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);
 
-    m_shouldRefreshPlugins = false;
-    m_pluginCacheIsPopulated = true;
+    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)
+#if PLATFORM(MAC)
+bool WebPlatformStrategies::pluginLoadClientPolicyForHost(const String& host, const PluginInfo& info, PluginLoadClientPolicy& policy) const
+{
+    String hostToLookUp = host;
+    if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+        hostToLookUp = "*";
+    if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+        return false;
+
+    PluginPolicyMapsByIdentifier policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToLookUp);
+    String identifier = info.bundleIdentifier;
+    if (!identifier || !policiesByIdentifier.contains(identifier))
+        identifier = "*";
+    if (!policiesByIdentifier.contains(identifier))
+        return false;
+
+    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)
 
index afa0ba1..3b2fcb1 100644 (file)
@@ -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,6 +68,15 @@ private:
     // 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)
@@ -99,11 +109,16 @@ private:
 
 #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)
 };
 
index e9dc781..8f3fba5 100644 (file)
@@ -4426,11 +4426,11 @@ bool WebPage::canShowMIMEType(const String& MIMEType) const
         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;
index f180c9a..6bce63d 100644 (file)
@@ -384,6 +384,15 @@ void WebProcess::initializeWebProcess(WebProcessCreationParameters&& parameters)
         Inspector::RemoteInspector::singleton().setParentProcessInformation(presenterApplicationPid(), auditData);
     }
 #endif
+
+#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
+    for (const auto& hostKeyValue : parameters.pluginLoadClientPolicies) {
+        for (const auto& bundleIdentifierKeyValue : hostKeyValue.value) {
+            for (const auto& versionStringKeyValue : bundleIdentifierKeyValue.value)
+                platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(versionStringKeyValue.value), hostKeyValue.key, bundleIdentifierKeyValue.key, versionStringKeyValue.key);
+        }
+    }
+#endif
 }
 
 #if ENABLE(NETWORK_PROCESS)
@@ -862,6 +871,20 @@ void WebProcess::plugInDidReceiveUserInteraction(const String& pageOrigin, const
     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();
index 9d6c5e1..a620692 100644 (file)
@@ -123,6 +123,8 @@ public:
     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; }
 
index 677d4ba..a137681 100644 (file)
@@ -56,6 +56,8 @@ messages -> WebProcess LegacyReceiver {
     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();