Changeset 181562 in webkit


Ignore:
Timestamp:
Mar 16, 2015, 10:13:04 AM (11 years ago)
Author:
Conrad Shultz
Message:

Allow clients to selectively disable plug-ins
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.

Location:
trunk/Source
Files:
44 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r181553 r181562  
     12015-03-16  Conrad Shultz  <conrad_shultz@apple.com>
     2
     3        Allow clients to selectively disable plug-ins
     4        https://bugs.webkit.org/show_bug.cgi?id=142506
     5
     6        Reviewed by Anders Carlsson.
     7
     8        Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
     9        from the page). As part of this:
     10
     11        1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
     12           set of plug-ins.
     13
     14        2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
     15           down the stack.
     16
     17        3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
     18           a concrete implementation thereof in WebPlatformStrategies in WebKit2.
     19
     20        4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
     21
     22        While currently only used in a very limited manner, the new declarative plug-in policies are written generically
     23        so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
     24
     25        * dom/DOMImplementation.cpp:
     26        (WebCore::DOMImplementation::createDocument):
     27        Update to reflect function rename.
     28
     29        * loader/SubframeLoader.cpp:
     30        (WebCore::findPluginMIMETypeFromURL):
     31        Adopt getWebVisibleMimesAndPluginIndices().
     32        (WebCore::logPluginRequest):
     33        Update to reflect function rename.
     34        (WebCore::SubframeLoader::shouldUsePlugin):
     35        Ditto.
     36
     37        * platform/PlatformStrategies.h:
     38        Export platformStrategies(), since it is now used in WebProcess.cpp.
     39
     40        * plugins/DOMMimeType.cpp:
     41        (WebCore::DOMMimeType::type):
     42        (WebCore::DOMMimeType::description):
     43        (WebCore::DOMMimeType::mimeClassInfo):
     44        Adopt getWebVisibleMimesAndPluginIndices().
     45        (WebCore::DOMMimeType::enabledPlugin):
     46        Ditto.
     47
     48        * plugins/DOMMimeType.h:
     49        Don't return references in a few places where it is no longer safe to do so.
     50        (WebCore::DOMMimeType::mimeClassInfo): Deleted.
     51
     52        * plugins/DOMMimeTypeArray.cpp:
     53        (WebCore::DOMMimeTypeArray::length):
     54        Adopt getWebVisibleMimesAndPluginIndices().
     55        (WebCore::DOMMimeTypeArray::item):
     56        Ditto.
     57        (WebCore::DOMMimeTypeArray::canGetItemsForName):
     58        Ditto.
     59        (WebCore::DOMMimeTypeArray::namedItem):
     60        Ditto.
     61
     62        * plugins/DOMPlugin.cpp:
     63        (WebCore::DOMPlugin::pluginInfo):
     64        Adopt getWebVisiblePlugins().
     65        (WebCore::DOMPlugin::item):
     66        Adopt getWebVisibleMimesAndPluginIndices().
     67        (WebCore::DOMPlugin::canGetItemsForName):
     68        Ditto.
     69        (WebCore::DOMPlugin::namedItem):
     70        Ditto.
     71
     72        * plugins/DOMPlugin.h:
     73        (WebCore::DOMPlugin::pluginInfo): Deleted.
     74
     75        * plugins/DOMPluginArray.cpp:
     76        (WebCore::DOMPluginArray::length):
     77        Adopt getWebVisiblePlugins().
     78        (WebCore::DOMPluginArray::item):
     79        Ditto.
     80        (WebCore::DOMPluginArray::canGetItemsForName):
     81        Ditto.
     82        (WebCore::DOMPluginArray::namedItem):
     83        Ditto.
     84
     85        * plugins/PluginData.cpp:
     86        (WebCore::PluginData::PluginData):
     87        Stash the passed-in Page and call initPlugins().
     88        (WebCore::PluginData::getWebVisiblePlugins):
     89        New member function; call through to PluginStrategy::getWebVisiblePluginInfo().
     90        (WebCore::PluginData::getWebVisibleMimesAndPluginIndices):
     91        New member function; build up the mimes and mimePluginIndices vectors in the same manner as before, but
     92        limited to the web-visible plug-ins.
     93        (WebCore::PluginData::supportsWebVisibleMimeType):
     94        Renamed from supportsMimeType(); update to work in terms of web-visible plug-ins.
     95        (WebCore::PluginData::pluginInfoForWebVisibleMimeType):
     96        Renamed from pluginInfoForMimeType(); ditto.
     97        (WebCore::PluginData::pluginNameForWebVisibleMimeType):
     98        Renamed from pluginNameForMimeType(); ditto.
     99        (WebCore::PluginData::pluginFileForWebVisibleMimeType):
     100        Renamed from pluginFileForMimeType(); ditto.
     101        (WebCore::PluginData::initPlugins):
     102        (WebCore::PluginData::supportsMimeType): Deleted.
     103        (WebCore::PluginData::pluginInfoForMimeType): Deleted.
     104        (WebCore::PluginData::pluginNameForMimeType): Deleted.
     105        (WebCore::PluginData::pluginFileForMimeType): Deleted.
     106
     107        * plugins/PluginData.h:
     108        Add a member variable for the associate Page; declare the PluginLoadClientPolicy enumeration; add
     109        new members to PluginInfo for the clientLoadPolicy and bundle information.
     110        (WebCore::PluginData::PluginData):
     111        Replace some member functions with new ones that will hide plug-ins upon request from the client;
     112        (WebCore::PluginData::mimes): Deleted.
     113        (WebCore::PluginData::mimePluginIndices): Deleted.
     114
     115        * plugins/PluginStrategy.h:
     116        Declare new member functions for retrieving web-visible plug-ins and setting/clearing plug-in policies.
     117
     118        * replay/SerializationMethods.cpp:
     119        (JSC::EncodingTraits<PluginData>::encodeValue):
     120        Remove now-obsolete code for handling MIME types and add a FIXME.
     121        (JSC::DeserializedPluginData::DeserializedPluginData):
     122        (JSC::EncodingTraits<PluginData>::decodeValue):
     123        Ditto.
     124        (JSC::EncodingTraits<PluginInfo>::encodeValue):
     125        Handle the new members in PluginInfo.
     126        (JSC::EncodingTraits<PluginInfo>::decodeValue):
     127        Ditto.
     128
     129        * replay/WebInputs.json:
     130        Teach Replay about PluginLoadClientPolicy.
     131
    11322015-03-16  Max Stepin  <maxstepin@gmail.com>
    2133
  • trunk/Source/WebCore/dom/DOMImplementation.cpp

    r181494 r181562  
    330330    // PDF is one image type for which a plugin can override built-in support.
    331331    // We do not want QuickTime to take over all image types, obviously.
    332     if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->supportsMimeType(type, allowedPluginTypes))
     332    if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes))
    333333        return PluginDocument::create(frame, url);
    334334    if (Image::supportsType(type))
     
    349349    // Disallowing plug-ins to use text/plain prevents plug-ins from hijacking a fundamental type that the browser is expected to handle,
    350350    // and also serves as an optimization to prevent loading the plug-in database in the common case.
    351     if (type != "text/plain" && ((pluginData && pluginData->supportsMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
     351    if (type != "text/plain" && ((pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
    352352        return PluginDocument::create(frame, url);
    353353    if (isTextMIMEType(type))
  • trunk/Source/WebCore/loader/SubframeLoader.cpp

    r181494 r181562  
    168168    const PluginData& pluginData = page->pluginData();
    169169
    170     for (size_t i = 0; i < pluginData.mimes().size(); ++i) {
    171         const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
     170    Vector<MimeClassInfo> mimes;
     171    Vector<size_t> mimePluginIndices;
     172    pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     173    for (size_t i = 0; i < mimes.size(); ++i) {
     174        const MimeClassInfo& mimeClassInfo = mimes[i];
    172175        for (size_t j = 0; j < mimeClassInfo.extensions.size(); ++j) {
    173176            if (equalIgnoringCase(extension, mimeClassInfo.extensions[j]))
     
    192195    }
    193196
    194     String pluginFile = page->pluginData().pluginFileForMimeType(newMIMEType);
     197    String pluginFile = page->pluginData().pluginFileForWebVisibleMimeType(newMIMEType);
    195198    String description = !pluginFile ? newMIMEType : pluginFile;
    196199
     
    368371    // can handle TIFF (which QuickTime can also handle) they probably intended to override QT.
    369372    if (m_frame.page() && (mimeType == "image/tiff" || mimeType == "image/tif" || mimeType == "image/x-tiff")) {
    370         String pluginName = m_frame.page()->pluginData().pluginNameForMimeType(mimeType);
     373        String pluginName = m_frame.page()->pluginData().pluginNameForWebVisibleMimeType(mimeType);
    371374        if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", false))
    372375            return true;
  • trunk/Source/WebCore/platform/PlatformStrategies.h

    r181494 r181562  
    8989};
    9090
    91 PlatformStrategies* platformStrategies();
     91WEBCORE_EXPORT PlatformStrategies* platformStrategies();
    9292WEBCORE_EXPORT void setPlatformStrategies(PlatformStrategies*);
    9393bool hasPlatformStrategies();
  • trunk/Source/WebCore/plugins/DOMMimeType.cpp

    r181494 r181562  
    4343}
    4444
    45 const String &DOMMimeType::type() const
     45String DOMMimeType::type() const
    4646{
    4747    return mimeClassInfo().type;
     
    6161}
    6262
    63 const String &DOMMimeType::description() const
     63String DOMMimeType::description() const
    6464{
    6565    return mimeClassInfo().desc;
     66}
     67
     68MimeClassInfo DOMMimeType::mimeClassInfo() const
     69{
     70    Vector<MimeClassInfo> mimes;
     71    Vector<size_t> mimePluginIndices;
     72    m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     73    return mimes[m_index];
    6674}
    6775
     
    7179        return 0;
    7280
    73     return DOMPlugin::create(m_pluginData.get(), m_frame, m_pluginData->mimePluginIndices()[m_index]);
     81    Vector<MimeClassInfo> mimes;
     82    Vector<size_t> mimePluginIndices;
     83    m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     84    return DOMPlugin::create(m_pluginData.get(), m_frame, mimePluginIndices[m_index]);
    7485}
    7586
  • trunk/Source/WebCore/plugins/DOMMimeType.h

    r181494 r181562  
    3838    ~DOMMimeType();
    3939
    40     const String &type() const;
     40    String type() const;
    4141    String suffixes() const;
    42     const String &description() const;
     42    String description() const;
    4343    PassRefPtr<DOMPlugin> enabledPlugin() const;
    4444
    4545private:
    46     const MimeClassInfo& mimeClassInfo() const { return m_pluginData->mimes()[m_index]; }
     46    MimeClassInfo mimeClassInfo() const;
    4747
    4848    DOMMimeType(PassRefPtr<PluginData>, Frame*, unsigned index);
  • trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp

    r181494 r181562  
    4949    if (!data)
    5050        return 0;
    51     return data->mimes().size();
     51
     52    Vector<MimeClassInfo> mimes;
     53    Vector<size_t> mimePluginIndices;
     54    data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     55    return mimes.size();
    5256}
    5357
     
    5761    if (!data)
    5862        return 0;
    59     const Vector<MimeClassInfo>& mimes = data->mimes();
     63
     64    Vector<MimeClassInfo> mimes;
     65    Vector<size_t> mimePluginIndices;
     66    data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     67
    6068    if (index >= mimes.size())
    6169        return 0;
     
    6876    if (!data)
    6977        return 0;
    70     const Vector<MimeClassInfo>& mimes = data->mimes();
     78
     79    Vector<MimeClassInfo> mimes;
     80    Vector<size_t> mimePluginIndices;
     81    data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
    7182    for (unsigned i = 0; i < mimes.size(); ++i) {
    7283        if (mimes[i].type == propertyName)
     
    8192    if (!data)
    8293        return 0;
    83     const Vector<MimeClassInfo>& mimes = data->mimes();
     94
     95    Vector<MimeClassInfo> mimes;
     96    Vector<size_t> mimePluginIndices;
     97    data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
    8498    for (unsigned i = 0; i < mimes.size(); ++i) {
    8599        if (mimes[i].type == propertyName)
  • trunk/Source/WebCore/plugins/DOMPlugin.cpp

    r181494 r181562  
    5757}
    5858
     59PluginInfo DOMPlugin::pluginInfo() const
     60{
     61    return m_pluginData->webVisiblePlugins()[m_index];
     62}
     63
    5964PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index)
    6065{
     
    6267        return 0;
    6368
    64     const MimeClassInfo& mime = pluginInfo().mimes[index];
     69    MimeClassInfo mime = pluginInfo().mimes[index];
    6570
    66     const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
     71    Vector<MimeClassInfo> mimes;
     72    Vector<size_t> mimePluginIndices;
     73    m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
    6774    for (unsigned i = 0; i < mimes.size(); ++i) {
    68         if (mimes[i] == mime && m_pluginData->mimePluginIndices()[i] == m_index)
     75        if (mimes[i] == mime && mimePluginIndices[i] == m_index)
    6976            return DOMMimeType::create(m_pluginData.get(), m_frame, i);
    7077    }
     
    7481bool DOMPlugin::canGetItemsForName(const AtomicString& propertyName)
    7582{
    76     const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
     83    Vector<MimeClassInfo> mimes;
     84    Vector<size_t> mimePluginIndices;
     85    m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
    7786    for (unsigned i = 0; i < mimes.size(); ++i)
    7887        if (mimes[i].type == propertyName)
     
    8392PassRefPtr<DOMMimeType> DOMPlugin::namedItem(const AtomicString& propertyName)
    8493{
    85     const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
     94    Vector<MimeClassInfo> mimes;
     95    Vector<size_t> mimePluginIndices;
     96    m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
    8697    for (unsigned i = 0; i < mimes.size(); ++i)
    8798        if (mimes[i].type == propertyName)
  • trunk/Source/WebCore/plugins/DOMPlugin.h

    r181494 r181562  
    4949
    5050private:
    51     const PluginInfo& pluginInfo() const { return m_pluginData->plugins()[m_index]; }
     51    PluginInfo pluginInfo() const;
    5252
    5353    DOMPlugin(PluginData*, Frame*, unsigned index);
  • trunk/Source/WebCore/plugins/DOMPluginArray.cpp

    r181494 r181562  
    4949    if (!data)
    5050        return 0;
    51     return data->plugins().size();
     51
     52    return data->webVisiblePlugins().size();
    5253}
    5354
     
    5758    if (!data)
    5859        return 0;
    59     const Vector<PluginInfo>& plugins = data->plugins();
     60
     61    const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
    6062    if (index >= plugins.size())
    6163        return 0;
     
    6870    if (!data)
    6971        return 0;
    70     const Vector<PluginInfo>& plugins = data->plugins();
     72
     73    const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
    7174    for (unsigned i = 0; i < plugins.size(); ++i) {
    7275        if (plugins[i].name == propertyName)
     
    8184    if (!data)
    8285        return 0;
    83     const Vector<PluginInfo>& plugins = data->plugins();
     86
     87    const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
    8488    for (unsigned i = 0; i < plugins.size(); ++i) {
    8589        if (plugins[i].name == propertyName)
  • trunk/Source/WebCore/plugins/PluginData.cpp

    r181494 r181562  
    33    Copyright (C) 2000 Daniel Molkentin (molkentin@kde.org)
    44    Copyright (C) 2000 Stefan Schimanski (schimmi@kde.org)
    5     Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All Rights Reserved.
     5    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2015 Apple Inc. All Rights Reserved.
    66    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
    77
     
    3232PluginData::PluginData(const Page* page)
    3333{
    34     initPlugins(page);
     34    ASSERT_ARG(page, page);
    3535
    36     for (unsigned i = 0; i < m_plugins.size(); ++i) {
    37         const PluginInfo& plugin = m_plugins[i];
     36    m_page = page;
     37    initPlugins();
     38}
     39
     40Vector<PluginInfo> PluginData::webVisiblePlugins() const
     41{
     42    Vector<PluginInfo> plugins;
     43    platformStrategies()->pluginStrategy()->getWebVisiblePluginInfo(m_page, plugins);
     44    return plugins;
     45}
     46
     47void PluginData::getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const
     48{
     49    ASSERT_ARG(mimes, mimes.isEmpty());
     50    ASSERT_ARG(mimePluginIndices, mimePluginIndices.isEmpty());
     51
     52    const Vector<PluginInfo>& plugins = webVisiblePlugins();
     53    for (unsigned i = 0; i < plugins.size(); ++i) {
     54        const PluginInfo& plugin = plugins[i];
    3855        for (unsigned j = 0; j < plugin.mimes.size(); ++j) {
    39             m_mimes.append(plugin.mimes[j]);
    40             m_mimePluginIndices.append(i);
     56            mimes.append(plugin.mimes[j]);
     57            mimePluginIndices.append(i);
    4158        }
    4259    }
    4360}
    4461
    45 bool PluginData::supportsMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const
     62bool PluginData::supportsWebVisibleMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const
    4663{
    47     for (unsigned i = 0; i < m_mimes.size(); ++i) {
    48         if (m_mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || m_plugins[m_mimePluginIndices[i]].isApplicationPlugin))
     64    Vector<MimeClassInfo> mimes;
     65    Vector<size_t> mimePluginIndices;
     66    const Vector<PluginInfo>& plugins = webVisiblePlugins();
     67    getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     68
     69    for (unsigned i = 0; i < mimes.size(); ++i) {
     70        if (mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || plugins[mimePluginIndices[i]].isApplicationPlugin))
    4971            return true;
    5072    }
     
    5274}
    5375
    54 const PluginInfo* PluginData::pluginInfoForMimeType(const String& mimeType) const
     76bool PluginData::getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo& pluginInfoRef) const
    5577{
    56     for (unsigned i = 0; i < m_mimes.size(); ++i) {
    57         const MimeClassInfo& info = m_mimes[i];
    58    
    59         if (info.type == mimeType)
    60             return &m_plugins[m_mimePluginIndices[i]];
     78    Vector<MimeClassInfo> mimes;
     79    Vector<size_t> mimePluginIndices;
     80    const Vector<PluginInfo>& plugins = webVisiblePlugins();
     81    getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     82
     83    for (unsigned i = 0; i < mimes.size(); ++i) {
     84        const MimeClassInfo& info = mimes[i];
     85
     86        if (info.type == mimeType) {
     87            pluginInfoRef = plugins[mimePluginIndices[i]];
     88            return true;
     89        }
    6190    }
    6291
    63     return 0;
     92    return false;
    6493}
    6594
    66 String PluginData::pluginNameForMimeType(const String& mimeType) const
     95String PluginData::pluginNameForWebVisibleMimeType(const String& mimeType) const
    6796{
    68     if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
    69         return info->name;
     97    PluginInfo info;
     98    if (getPluginInfoForWebVisibleMimeType(mimeType, info))
     99        return info.name;
    70100    return String();
    71101}
    72102
    73 String PluginData::pluginFileForMimeType(const String& mimeType) const
     103String PluginData::pluginFileForWebVisibleMimeType(const String& mimeType) const
    74104{
    75     if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
    76         return info->file;
     105    PluginInfo info;
     106    if (getPluginInfoForWebVisibleMimeType(mimeType, info))
     107        return info.file;
    77108    return String();
    78109}
     
    83114}
    84115
    85 void PluginData::initPlugins(const Page* page)
     116void PluginData::initPlugins()
    86117{
    87118    ASSERT(m_plugins.isEmpty());
    88    
    89     platformStrategies()->pluginStrategy()->getPluginInfo(page, m_plugins);
     119
     120    platformStrategies()->pluginStrategy()->getPluginInfo(m_page, m_plugins);
    90121}
    91122
  • trunk/Source/WebCore/plugins/PluginData.h

    r181494 r181562  
    3030struct PluginInfo;
    3131
     32enum PluginLoadClientPolicy : uint8_t {
     33    // No client-specific plug-in load policy has been defined. The plug-in should be visible in navigator.plugins and WebKit should synchronously
     34    // ask the client whether the plug-in should be loaded.
     35    PluginLoadClientPolicyUndefined = 0,
     36
     37    // The plug-in module should be blocked from being instantiated. The plug-in should be hidden in navigator.plugins.
     38    PluginLoadClientPolicyBlock,
     39
     40    // WebKit should synchronously ask the client whether the plug-in should be loaded. The plug-in should be visible in navigator.plugins.
     41    PluginLoadClientPolicyAsk,
     42
     43    // The plug-in module may be loaded if WebKit is not blocking it.
     44    PluginLoadClientPolicyAllow,
     45
     46    // The plug-in module should be loaded irrespective of whether WebKit has asked it to be blocked.
     47    PluginLoadClientPolicyAllowAlways,
     48};
     49
    3250struct MimeClassInfo {
    3351    String type;
     
    4765    Vector<MimeClassInfo> mimes;
    4866    bool isApplicationPlugin;
     67
     68    PluginLoadClientPolicy clientLoadPolicy;
     69
     70#if PLATFORM(MAC)
     71    String bundleIdentifier;
     72    String versionString;
     73#endif
    4974};
    5075
     
    5580
    5681    const Vector<PluginInfo>& plugins() const { return m_plugins; }
    57     const Vector<MimeClassInfo>& mimes() const { return m_mimes; }
    58     const Vector<size_t>& mimePluginIndices() const { return m_mimePluginIndices; }
     82    Vector<PluginInfo> webVisiblePlugins() const;
     83    WEBCORE_EXPORT void getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>&, Vector<size_t>&) const;
    5984
    6085    enum AllowedPluginTypes {
     
    6388    };
    6489
    65     WEBCORE_EXPORT bool supportsMimeType(const String& mimeType, const AllowedPluginTypes) const;
    66     String pluginNameForMimeType(const String& mimeType) const;
    67     String pluginFileForMimeType(const String& mimeType) const;
     90    WEBCORE_EXPORT bool supportsWebVisibleMimeType(const String& mimeType, const AllowedPluginTypes) const;
     91    String pluginNameForWebVisibleMimeType(const String& mimeType) const;
     92    String pluginFileForWebVisibleMimeType(const String& mimeType) const;
    6893
    6994    static void refresh();
     
    7196private:
    7297    explicit PluginData(const Page*);
    73     void initPlugins(const Page*);
    74     const PluginInfo* pluginInfoForMimeType(const String& mimeType) const;
     98    void initPlugins();
     99    bool getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo&) const;
    75100
    76101protected:
    77102#if defined ENABLE_WEB_REPLAY && ENABLE_WEB_REPLAY
    78     PluginData(Vector<PluginInfo> plugins, Vector<MimeClassInfo> mimes, Vector<size_t> indices)
     103    PluginData(Vector<PluginInfo> plugins)
    79104        : m_plugins(plugins)
    80         , m_mimes(mimes)
    81         , m_mimePluginIndices(indices)
    82105    {
    83106    }
    84107#endif
    85108
     109    const Page* m_page;
    86110    Vector<PluginInfo> m_plugins;
    87     Vector<MimeClassInfo> m_mimes;
    88     Vector<size_t> m_mimePluginIndices;
    89111};
    90112
  • trunk/Source/WebCore/plugins/PluginStrategy.h

    r181494 r181562  
    3737    virtual void refreshPlugins() = 0;
    3838    virtual void getPluginInfo(const Page*, Vector<PluginInfo>&) = 0;
     39    virtual void getWebVisiblePluginInfo(const Page*, Vector<PluginInfo>&) = 0;
     40#if PLATFORM(MAC)
     41    virtual void setPluginLoadClientPolicy(PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString) = 0;
     42    virtual void clearPluginClientPolicies() = 0;
     43#endif
    3944
    4045protected:
  • trunk/Source/WebCore/replay/SerializationMethods.cpp

    r181494 r181562  
    5454using WebCore::PlatformWheelEventGranularity;
    5555using WebCore::PluginData;
     56using WebCore::PluginLoadClientPolicy;
    5657using WebCore::PluginInfo;
    5758using WebCore::SecurityOrigin;
     
    438439EncodedValue EncodingTraits<PluginData>::encodeValue(RefPtr<PluginData> input)
    439440{
     441    // FIXME: This needs to work in terms of web-visible plug-ins.
    440442    EncodedValue encodedData = EncodedValue::createObject();
    441443
    442     Vector<uint32_t> castedMimePluginIndices(input->mimePluginIndices().size());
    443     for (uint32_t index : input->mimePluginIndices())
    444         castedMimePluginIndices.append(WTF::safeCast<uint32_t>(index));
    445 
    446444    ENCODE_TYPE_WITH_KEY(encodedData, Vector<PluginInfo>, plugins, input->plugins());
    447     ENCODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes, input->mimes());
    448     ENCODE_TYPE_WITH_KEY(encodedData, Vector<uint32_t>, mimePluginIndices, castedMimePluginIndices);
    449445
    450446    return encodedData;
     
    453449class DeserializedPluginData : public PluginData {
    454450public:
    455     DeserializedPluginData(Vector<PluginInfo> plugins, Vector<MimeClassInfo> mimes, Vector<size_t> indices)
    456         : PluginData(plugins, mimes, indices)
     451    DeserializedPluginData(Vector<PluginInfo> plugins)
     452        : PluginData(plugins)
    457453    {
    458454    }
     
    462458{
    463459    DECODE_TYPE_WITH_KEY(encodedData, Vector<PluginInfo>, plugins);
    464     DECODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes);
    465     DECODE_TYPE_WITH_KEY(encodedData, Vector<uint32_t>, mimePluginIndices);
    466 
    467     Vector<size_t> castedMimePluginIndices(mimePluginIndices.size());
    468     for (uint32_t index : mimePluginIndices)
    469         castedMimePluginIndices.append(WTF::safeCast<size_t>(index));
    470 
    471     input = adoptRef(new DeserializedPluginData(plugins, mimes, castedMimePluginIndices));
     460
     461    // FIXME: This needs to work in terms of web-visible plug-ins.
     462    input = adoptRef(new DeserializedPluginData(plugins));
    472463
    473464    return true;
     
    484475    ENCODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes, input.mimes);
    485476    ENCODE_TYPE_WITH_KEY(encodedData, bool, isApplicationPlugin, input.isApplicationPlugin);
     477    ENCODE_TYPE_WITH_KEY(encodedData, PluginLoadClientPolicy, clientLoadPolicy, static_cast<PluginLoadClientPolicy>(input.clientLoadPolicy));
     478#if PLATFORM(MAC)
     479    ENCODE_TYPE_WITH_KEY(encodedData, String, bundleIdentifier, input.bundleIdentifier);
     480    ENCODE_TYPE_WITH_KEY(encodedData, String, versionString, input.versionString);
     481#endif
    486482
    487483    return encodedData;
     
    498494    DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, Vector<MimeClassInfo>, mimes, info.mimes);
    499495    DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, bool, isApplicationPlugin, info.isApplicationPlugin);
     496    DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, PluginLoadClientPolicy, clientLoadPolicy, info.clientLoadPolicy);
     497#if PLATFORM(MAC)
     498    DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, String, bundleIdentifier, input.bundleIdentifier);
     499    DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, String, versionString, input.versionString);
     500#endif
    500501
    501502    input = info;
  • trunk/Source/WebCore/replay/WebInputs.json

    r181494 r181562  
    6767                "header": "plugins/PluginData.h"
    6868            },
     69            {
     70                "name": "PluginLoadClientPolicy", "mode": "SCALAR", "storage": "uint8_t",
     71                "flags": ["ENUM"],
     72                "values": ["PluginLoadClientPolicyUndefined", "PluginLoadClientPolicyBlock", "PluginLoadClientPolicyAsk", "PluginLoadClientPolicyAllow", "PluginLoadClientPolicyAllowAlways"],
     73                "header": "plugins/PluginData.h"
     74            },
     75
    6976            {
    7077                "name": "ScrollDirection", "mode": "SCALAR", "storage": "uint8_t",
  • trunk/Source/WebKit/mac/ChangeLog

    r181502 r181562  
     12015-03-16  Conrad Shultz  <conrad_shultz@apple.com>
     2
     3        Allow clients to selectively disable plug-ins
     4        https://bugs.webkit.org/show_bug.cgi?id=142506
     5
     6        Reviewed by Anders Carlsson.
     7
     8        Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
     9        from the page). As part of this:
     10
     11        1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
     12           set of plug-ins.
     13
     14        2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
     15           down the stack.
     16
     17        3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
     18           a concrete implementation thereof in WebPlatformStrategies in WebKit2.
     19
     20        4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
     21
     22        While currently only used in a very limited manner, the new declarative plug-in policies are written generically
     23        so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
     24
     25        * Plugins/WebBasePluginPackage.mm:
     26        (-[WebBasePluginPackage getPluginInfoFromPLists]):
     27        Set new members in PluginInfo.
     28
     29        * Plugins/WebNetscapePluginPackage.mm:
     30        (-[WebNetscapePluginPackage getPluginInfoFromResources]):
     31        Set new members in PluginInfo.
     32
     33        * WebCoreSupport/WebPlatformStrategies.h:
     34        * WebCoreSupport/WebPlatformStrategies.mm:
     35        (WebPlatformStrategies::getWebVisiblePluginInfo):
     36        Override to wrap getPluginInfo().
     37        (WebPlatformStrategies::setPluginLoadClientPolicy):
     38        Override to do nothing.
     39        (WebPlatformStrategies::clearPluginClientPolicies):
     40        Ditto.
     41
     42        * WebView/WebFrame.mm:
     43        (-[WebFrame _canProvideDocumentSource]):
     44        Update to reflect function rename.
     45
    1462015-03-14  Dean Jackson  <dino@apple.com>
    247
  • trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm

    r181494 r181562  
    250250
    251251    pluginInfo.isApplicationPlugin = false;
     252    pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
     253#if PLATFORM(MAC)
     254    pluginInfo.bundleIdentifier = self.bundleIdentifier;
     255    pluginInfo.versionString = self.bundleVersion;
     256#endif
    252257
    253258    return YES;
  • trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm

    r181494 r181562  
    147147
    148148    pluginInfo.isApplicationPlugin = false;
    149    
     149    pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
     150#if PLATFORM(MAC)
     151    pluginInfo.bundleIdentifier = self.bundleIdentifier;
     152    pluginInfo.versionString = self.bundleVersion;
     153#endif
     154
    150155    [self closeResourceFile:resRef];
    151156   
  • trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h

    r181494 r181562  
    6363    virtual void refreshPlugins() override;
    6464    virtual void getPluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
     65    virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
     66#if PLATFORM(MAC)
     67    virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String&, const String&, const String&) override;
     68    virtual void clearPluginClientPolicies() override;
     69#endif
    6570
    6671    // WebCore::LoaderStrategy
  • trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm

    r181494 r181562  
    129129}
    130130
     131void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
     132{
     133    getPluginInfo(page, plugins);
     134}
     135
     136#if PLATFORM(MAC)
     137void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy, const String&, const String&, const String&)
     138{
     139}
     140
     141void WebPlatformStrategies::clearPluginClientPolicies()
     142{
     143}
     144#endif
     145
    131146void WebPlatformStrategies::getTypes(Vector<String>& types, const String& pasteboardName)
    132147{
  • trunk/Source/WebKit/mac/WebView/WebFrame.mm

    r181494 r181562  
    980980    if (WebCore::DOMImplementation::isTextMIMEType(mimeType)
    981981        || Image::supportsType(mimeType)
    982         || (pluginData && pluginData->supportsMimeType(mimeType, PluginData::AllPlugins) && frame->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
    983         || (pluginData && pluginData->supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
     982        || (pluginData && pluginData->supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && frame->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
     983        || (pluginData && pluginData->supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
    984984        return NO;
    985985
  • trunk/Source/WebKit/win/ChangeLog

    r181494 r181562  
     12015-03-16  Conrad Shultz  <conrad_shultz@apple.com>
     2
     3        Allow clients to selectively disable plug-ins
     4        https://bugs.webkit.org/show_bug.cgi?id=142506
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * WebCoreSupport/WebPlatformStrategies.h:
     9        * WebCoreSupport/WebPlatformStrategies.cpp:
     10        (WebPlatformStrategies::getWebVisiblePluginInfo):
     11        Wrap getPluginInfo();
     12
     13        * WebView.cpp:
     14        (WebView::canShowMIMEType):
     15        Update to reflect function rename.
     16
    1172015-03-13  Commit Queue  <commit-queue@webkit.org>
    218
  • trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp

    r181494 r181562  
    135135    }
    136136}
     137
     138void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
     139{
     140    getPluginInfo(page, plugins);
     141}
  • trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h

    r181494 r181562  
    5656    virtual void refreshPlugins();
    5757    virtual void getPluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&);
     58    virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&);
    5859};
    5960
  • trunk/Source/WebKit/win/WebView.cpp

    r181494 r181562  
    26302630
    26312631    if (!canShow && m_page) {
    2632         canShow = (m_page->pluginData().supportsMimeType(mimeType, PluginData::AllPlugins) && allowPlugins)
    2633             || m_page->pluginData().supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins);
     2632        canShow = (m_page->pluginData().supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && allowPlugins)
     2633            || m_page->pluginData().supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins);
    26342634    }
    26352635
  • trunk/Source/WebKit2/ChangeLog

    r181555 r181562  
     12015-03-16  Conrad Shultz  <conrad_shultz@apple.com>
     2
     3        Allow clients to selectively disable plug-ins
     4        https://bugs.webkit.org/show_bug.cgi?id=142506
     5
     6        Reviewed by Anders Carlsson.
     7
     8        Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
     9        from the page). As part of this:
     10
     11        1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
     12           set of plug-ins.
     13
     14        2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
     15           down the stack.
     16
     17        3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
     18           a concrete implementation thereof in WebPlatformStrategies in WebKit2.
     19
     20        4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
     21
     22        While currently only used in a very limited manner, the new declarative plug-in policies are written generically
     23        so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
     24
     25        * Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm:
     26        (WebKit::NetscapePluginModule::getPluginInfo):
     27        Set new PluginInfo members.
     28
     29        * Shared/WebCoreArgumentCoders.cpp:
     30        (IPC::ArgumentCoder<PluginInfo>::encode):
     31        Handle new PluginInfo members.
     32        (IPC::ArgumentCoder<PluginInfo>::decode):
     33        Ditto.
     34
     35        * Shared/WebProcessCreationParameters.h:
     36        Declare a member to store client plug-in policies.
     37
     38        * Shared/WebProcessCreationParameters.cpp:
     39        (WebKit::WebProcessCreationParameters::encode):
     40        Encode the policies.
     41        (WebKit::WebProcessCreationParameters::decode):
     42        Decode the policies.
     43
     44        * UIProcess/API/C/WKAPICast.h:
     45        (WebKit::toWKPluginLoadClientPolicy):
     46        Teach how to cast between WebCore and WebKit2 policy definitions.
     47        (WebKit::toPluginLoadClientPolicy):
     48        Ditto.
     49
     50        * UIProcess/API/C/WKPluginLoadPolicy.h:
     51        Declare WKPluginLoadClientPolicy, matching PluginLoadClientPolicy in WebCore.
     52
     53        * UIProcess/API/C/mac/WKContextPrivateMac.h:
     54        * UIProcess/API/C/mac/WKContextPrivateMac.mm:
     55        (WKContextSetPluginLoadClientPolicy):
     56        New function; wrap WebProcessPool::setPluginLoadClientPolicy().
     57        (WKContextClearPluginClientPolicies):
     58        New function; wrap WebProcessPool::clearPluginClientPolicies().
     59
     60        * UIProcess/WebProcessPool.h:
     61        * UIProcess/WebProcessPool.cpp:
     62        (WebKit::WebProcessPool::createNewWebProcess):
     63        Copy any client plug-in policies to the new process' creation parameters.
     64        (WebKit::WebProcessPool::setPluginLoadClientPolicy):
     65        Send SetPluginLoadClientPolicy to all processes and stash the passed-in policy info.
     66        (WebKit::WebProcessPool::clearPluginClientPolicies):
     67        Send ClearPluginClientPolicies to all processes and clear any stashed policy info.
     68
     69        * WebProcess/Plugins/PDF/PDFPlugin.mm:
     70        (WebKit::PDFPlugin::pluginInfo):
     71        Set new PluginInfo member.
     72
     73        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     74        (WebKit::pluginSupportsExtension):
     75        Adopt getWebVisibleMimesAndPluginIndices().
     76        (WebKit::WebFrameLoaderClient::objectContentType):
     77        Update to reflect reflect function rename.
     78
     79        * WebProcess/WebCoreSupport/WebPlatformStrategies.h:
     80        * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
     81        (WebKit::WebPlatformStrategies::getPluginInfo):
     82        Pass the Page to populatePluginCache().
     83        (WebKit::WebPlatformStrategies::getWebVisiblePluginInfo):
     84        New member function; wrap getPluginInfo(); if appropriate, filter out plug-ins the client has asked
     85        to block on the current page.
     86        (WebKit::WebPlatformStrategies::setPluginLoadClientPolicy):
     87        New member function; map empty inputs to a wildcard character and insert the new policy into the nested map.
     88        (WebKit::WebPlatformStrategies::clearPluginClientPolicies):
     89        New member function; empty m_hostsToPluginIdentifierData.
     90        (WebKit::WebPlatformStrategies::pluginLoadClientPolicyForHost):
     91        New member function; look up the most specific policy for the given plug-in and host.
     92        (WebKit::WebPlatformStrategies::populatePluginCache):
     93        If appropriate, set the client load policy on the plug-ins; do this irrespective of whether the cache has
     94        been populated since the Page, and therefore host, may change.
     95
     96        * WebProcess/WebPage/WebPage.cpp:
     97        (WebKit::WebPage::canShowMIMEType):
     98        Update to reflect function rename.
     99
     100        * WebProcess/WebProcess.h:
     101        * WebProcess/WebProcess.cpp:
     102        (WebKit::WebProcess::initializeWebProcess):
     103        Enumerate and process the client plug-in policies in the creation parameters.
     104        (WebKit::WebProcess::setPluginLoadClientPolicy):
     105        New member function; wrap PluginStrategy::setPluginLoadClientPolicy.
     106        (WebKit::WebProcess::clearPluginClientPolicies):
     107        New member function; wrap PluginStrategy::clearPluginClientPolicies().
     108
     109        * WebProcess/WebProcess.messages.in:
     110        Add messages for setting and clearing policies.
     111
    11122015-03-16  Carlos Garcia Campos  <cgarcia@igalia.com>
    2113
  • trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm

    r181494 r181562  
    400400
    401401    plugin.info.isApplicationPlugin = false;
    402    
     402    plugin.info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
     403#if PLATFORM(MAC)
     404    plugin.info.bundleIdentifier = plugin.bundleIdentifier;
     405    plugin.info.versionString = plugin.versionString;
     406#endif
     407
    403408    return true;
    404409}
  • trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp

    r181494 r181562  
    567567void ArgumentCoder<PluginInfo>::encode(ArgumentEncoder& encoder, const PluginInfo& pluginInfo)
    568568{
    569     encoder << pluginInfo.name << pluginInfo.file << pluginInfo.desc << pluginInfo.mimes << pluginInfo.isApplicationPlugin;
    570 }
    571    
     569    encoder << pluginInfo.name;
     570    encoder << pluginInfo.file;
     571    encoder << pluginInfo.desc;
     572    encoder << pluginInfo.mimes;
     573    encoder << pluginInfo.isApplicationPlugin;
     574    encoder.encodeEnum(pluginInfo.clientLoadPolicy);
     575#if PLATFORM(MAC)
     576    encoder << pluginInfo.bundleIdentifier;
     577    encoder << pluginInfo.versionString;
     578#endif
     579}
     580
    572581bool ArgumentCoder<PluginInfo>::decode(ArgumentDecoder& decoder, PluginInfo& pluginInfo)
    573582{
     
    582591    if (!decoder.decode(pluginInfo.isApplicationPlugin))
    583592        return false;
     593    PluginLoadClientPolicy clientLoadPolicy;
     594    if (!decoder.decodeEnum(clientLoadPolicy))
     595        return false;
     596#if PLATFORM(MAC)
     597    if (!decoder.decode(pluginInfo.bundleIdentifier))
     598        return false;
     599    if (!decoder.decode(pluginInfo.versionString))
     600        return false;
     601#endif
    584602
    585603    return true;
  • trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp

    r181494 r181562  
    145145    encoder << hasRichContentServices;
    146146#endif
     147
     148#if ENABLE(NETSCAPE_PLUGIN_API)
     149    encoder << pluginLoadClientPolicies;
     150#endif
    147151}
    148152
     
    303307#endif
    304308
     309#if ENABLE(NETSCAPE_PLUGIN_API)
     310    if (!decoder.decode(parameters.pluginLoadClientPolicies))
     311        return false;
     312#endif
     313
    305314    return true;
    306315}
  • trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h

    r181494 r181562  
    168168    bool hasRichContentServices;
    169169#endif
     170
     171#if ENABLE(NETSCAPE_PLUGIN_API)
     172    HashMap<String, HashMap<String, HashMap<String, uint8_t>>> pluginLoadClientPolicies;
     173#endif
    170174};
    171175
  • trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h

    r181494 r181562  
    4848#include <WebCore/Credential.h>
    4949#include <WebCore/FrameLoaderTypes.h>
     50#include <WebCore/PluginData.h>
    5051#include <WebCore/ProtectionSpace.h>
    5152#include <WebCore/Settings.h>
     
    483484}
    484485
     486inline WKPluginLoadClientPolicy toWKPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy PluginLoadClientPolicy)
     487{
     488    switch (PluginLoadClientPolicy) {
     489    case WebCore::PluginLoadClientPolicyUndefined:
     490        return kWKPluginLoadClientPolicyUndefined;
     491    case WebCore::PluginLoadClientPolicyBlock:
     492        return kWKPluginLoadClientPolicyBlock;
     493    case WebCore::PluginLoadClientPolicyAsk:
     494        return kWKPluginLoadClientPolicyAsk;
     495    case WebCore::PluginLoadClientPolicyAllow:
     496        return kWKPluginLoadClientPolicyAllow;
     497    case WebCore::PluginLoadClientPolicyAllowAlways:
     498        return kWKPluginLoadClientPolicyAllowAlways;
     499    }
     500
     501    ASSERT_NOT_REACHED();
     502    return kWKPluginLoadClientPolicyBlock;
     503}
     504
    485505inline PluginModuleLoadPolicy toPluginModuleLoadPolicy(WKPluginLoadPolicy pluginLoadPolicy)
    486506{
     
    498518}
    499519
     520inline WebCore::PluginLoadClientPolicy toPluginLoadClientPolicy(WKPluginLoadClientPolicy pluginLoadClientPolicy)
     521{
     522    switch (pluginLoadClientPolicy) {
     523    case kWKPluginLoadClientPolicyUndefined:
     524        return WebCore::PluginLoadClientPolicyUndefined;
     525    case kWKPluginLoadClientPolicyBlock:
     526        return WebCore::PluginLoadClientPolicyBlock;
     527    case kWKPluginLoadClientPolicyAsk:
     528        return WebCore::PluginLoadClientPolicyAsk;
     529    case kWKPluginLoadClientPolicyAllow:
     530        return WebCore::PluginLoadClientPolicyAllow;
     531    case kWKPluginLoadClientPolicyAllowAlways:
     532        return WebCore::PluginLoadClientPolicyAllowAlways;
     533    }
     534
     535    ASSERT_NOT_REACHED();
     536    return WebCore::PluginLoadClientPolicyBlock;
     537}
     538
    500539inline WebCore::WebGLLoadPolicy toWebGLLoadPolicy(WKWebGLLoadPolicy webGLLoadPolicy)
    501540{
  • trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h

    r181494 r181562  
    4141typedef uint32_t WKPluginLoadPolicy;
    4242
     43enum WKPluginLoadClientPolicy {
     44    kWKPluginLoadClientPolicyUndefined = 0,
     45    kWKPluginLoadClientPolicyBlock,
     46    kWKPluginLoadClientPolicyAsk,
     47    kWKPluginLoadClientPolicyAllow,
     48    kWKPluginLoadClientPolicyAllowAlways,
     49};
     50
    4351#ifdef __cplusplus
    4452}
  • trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h

    r181494 r181562  
    2828
    2929#include <WebKit/WKBase.h>
     30#include <WebKit/WKPluginLoadPolicy.h>
    3031
    3132#ifdef __cplusplus
     
    3738
    3839WK_EXPORT bool WKContextIsPlugInUpdateAvailable(WKContextRef context, WKStringRef plugInBundleIdentifier);
     40
     41WK_EXPORT void WKContextSetPluginLoadClientPolicy(WKContextRef context, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString);
     42WK_EXPORT void WKContextClearPluginClientPolicies(WKContextRef context);
    3943
    4044WK_EXPORT WKDictionaryRef WKContextCopyPlugInInfoForBundleIdentifier(WKContextRef context, WKStringRef plugInBundleIdentifier);
  • trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm

    r181494 r181562  
    5050#else
    5151    return WKIsPluginUpdateAvailable((NSString *)adoptCF(WKStringCopyCFString(kCFAllocatorDefault, plugInBundleIdentifierRef)).get());
     52#endif
     53}
     54
     55void WKContextSetPluginLoadClientPolicy(WKContextRef contextRef, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString)
     56{
     57#if ENABLE(NETSCAPE_PLUGIN_API)
     58    toImpl(contextRef)->setPluginLoadClientPolicy(toPluginLoadClientPolicy(policy), toWTFString(host), toWTFString(bundleIdentifier), toWTFString(versionString));
     59#endif
     60}
     61
     62void WKContextClearPluginClientPolicies(WKContextRef contextRef)
     63{
     64#if ENABLE(NETSCAPE_PLUGIN_API)
     65    toImpl(contextRef)->clearPluginClientPolicies();
    5266#endif
    5367}
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp

    r181494 r181562  
    684684#endif
    685685
     686#if ENABLE(NETSCAPE_PLUGIN_API)
     687    parameters.pluginLoadClientPolicies = m_pluginLoadClientPolicies;
     688#endif
     689
    686690#if OS(LINUX)
    687691    parameters.shouldEnableMemoryPressureReliefLogging = true;
     
    14191423    m_client.plugInInformationBecameAvailable(this, API::Array::create(WTF::move(plugins)).get());
    14201424}
     1425
     1426void WebProcessPool::setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy policy, const String& host, const String& bundleIdentifier, const String& versionString)
     1427{
     1428#if ENABLE(NETSCAPE_PLUGIN_API)
     1429    HashMap<String, HashMap<String, uint8_t>> policiesByIdentifier;
     1430    if (m_pluginLoadClientPolicies.contains(host))
     1431        policiesByIdentifier = m_pluginLoadClientPolicies.get(host);
     1432
     1433    HashMap<String, uint8_t> versionsToPolicies;
     1434    if (policiesByIdentifier.contains(bundleIdentifier))
     1435        versionsToPolicies = policiesByIdentifier.get(bundleIdentifier);
     1436
     1437    versionsToPolicies.set(versionString, policy);
     1438    policiesByIdentifier.set(bundleIdentifier, versionsToPolicies);
     1439    m_pluginLoadClientPolicies.set(host, policiesByIdentifier);
     1440#endif
     1441
     1442    sendToAllProcesses(Messages::WebProcess::SetPluginLoadClientPolicy(policy, host, bundleIdentifier, versionString));
     1443}
     1444
     1445void WebProcessPool::clearPluginClientPolicies()
     1446{
     1447#if ENABLE(NETSCAPE_PLUGIN_API)
     1448    m_pluginLoadClientPolicies.clear();
     1449#endif
     1450    sendToAllProcesses(Messages::WebProcess::ClearPluginClientPolicies());
     1451}
    14211452#endif
    14221453   
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.h

    r181494 r181562  
    184184
    185185    PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
     186
     187    void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString);
     188    void clearPluginClientPolicies();
    186189#endif
    187190
     
    541544    HashMap<String, String> m_encodedContentExtensions;
    542545#endif
     546
     547#if ENABLE(NETSCAPE_PLUGIN_API)
     548    HashMap<String, HashMap<String, HashMap<String, uint8_t>>> m_pluginLoadClientPolicies;
     549#endif
    543550};
    544551
  • trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm

    r181494 r181562  
    540540    info.name = builtInPDFPluginName();
    541541    info.isApplicationPlugin = true;
     542    info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
    542543
    543544    MimeClassInfo pdfMimeClassInfo;
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r181494 r181562  
    14481448    ASSERT(extension.lower() == extension);
    14491449
    1450     for (size_t i = 0; i < pluginData.mimes().size(); ++i) {
    1451         const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
     1450    Vector<MimeClassInfo> mimes;
     1451    Vector<size_t> mimePluginIndices;
     1452    pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
     1453    for (size_t i = 0; i < mimes.size(); ++i) {
     1454        const MimeClassInfo& mimeClassInfo = mimes[i];
    14521455
    14531456        if (mimeClassInfo.extensions.contains(extension))
     
    14841487    if (WebPage* webPage = m_frame->page()) {
    14851488        const PluginData& pluginData = webPage->corePage()->pluginData();
    1486         if (pluginData.supportsMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
     1489        if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
    14871490            plugInSupportsMIMEType = true;
    1488         else if (pluginData.supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins))
     1491        else if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins))
    14891492            plugInSupportsMIMEType = true;
    14901493    }
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp

    r181494 r181562  
    11/*
    2  * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
     2 * Copyright (C) 2010, 2011, 2012, 2015 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    4545#include "WebProcessProxyMessages.h"
    4646#include <WebCore/Color.h>
     47#include <WebCore/DocumentLoader.h>
    4748#include <WebCore/IDBFactoryBackendInterface.h>
    4849#include <WebCore/LoaderStrategy.h>
     
    267268{
    268269#if ENABLE(NETSCAPE_PLUGIN_API)
    269     populatePluginCache();
     270    ASSERT_ARG(page, page);
     271    populatePluginCache(*page);
    270272
    271273    if (page->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin)) {
     
    281283}
    282284
     285void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector<PluginInfo>& plugins)
     286{
     287    ASSERT_ARG(page, page);
     288    ASSERT_ARG(plugins, plugins.isEmpty());
     289
     290    getPluginInfo(page, plugins);
     291
     292#if PLATFORM(MAC)
     293    for (int32_t i = plugins.size() - 1; i >= 0; --i) {
     294        PluginInfo& info = plugins.at(i);
     295        PluginLoadClientPolicy clientPolicy = info.clientLoadPolicy;
     296        // Allow built-in plugins. Also tentatively allow plugins that the client might later selectively permit.
     297        if (info.isApplicationPlugin || clientPolicy == PluginLoadClientPolicyAsk)
     298            continue;
     299
     300        if (clientPolicy == PluginLoadClientPolicyBlock)
     301            plugins.remove(i);
     302    }
     303#endif
     304}
     305
     306#if PLATFORM(MAC)
     307void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy clientPolicy, const String& host, const String& bundleIdentifier, const String& versionString)
     308{
     309    String hostToSet = host.isNull() || !host.length() ? "*" : host;
     310    String bundleIdentifierToSet = bundleIdentifier.isNull() || !bundleIdentifier.length() ? "*" : bundleIdentifier;
     311    String versionStringToSet = versionString.isNull() || !versionString.length() ? "*" : versionString;
     312
     313    PluginPolicyMapsByIdentifier policiesByIdentifier;
     314    if (m_hostsToPluginIdentifierData.contains(hostToSet))
     315        policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToSet);
     316
     317    PluginLoadClientPoliciesByBundleVersion versionsToPolicies;
     318    if (policiesByIdentifier.contains(bundleIdentifierToSet))
     319        versionsToPolicies = policiesByIdentifier.get(bundleIdentifierToSet);
     320
     321    versionsToPolicies.set(versionStringToSet, clientPolicy);
     322    policiesByIdentifier.set(bundleIdentifierToSet, versionsToPolicies);
     323    m_hostsToPluginIdentifierData.set(hostToSet, policiesByIdentifier);
     324}
     325
     326void WebPlatformStrategies::clearPluginClientPolicies()
     327{
     328    m_hostsToPluginIdentifierData.clear();
     329}
     330
     331#endif
     332
    283333#if ENABLE(NETSCAPE_PLUGIN_API)
    284 void WebPlatformStrategies::populatePluginCache()
    285 {
    286     if (m_pluginCacheIsPopulated)
    287         return;
    288 
    289     ASSERT(m_cachedPlugins.isEmpty());
    290    
    291     // FIXME: Should we do something in case of error here?
    292     if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins), 0))
    293         return;
    294 
    295     m_shouldRefreshPlugins = false;
    296     m_pluginCacheIsPopulated = true;
     334#if PLATFORM(MAC)
     335bool WebPlatformStrategies::pluginLoadClientPolicyForHost(const String& host, const PluginInfo& info, PluginLoadClientPolicy& policy) const
     336{
     337    String hostToLookUp = host;
     338    if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
     339        hostToLookUp = "*";
     340    if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
     341        return false;
     342
     343    PluginPolicyMapsByIdentifier policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToLookUp);
     344    String identifier = info.bundleIdentifier;
     345    if (!identifier || !policiesByIdentifier.contains(identifier))
     346        identifier = "*";
     347    if (!policiesByIdentifier.contains(identifier))
     348        return false;
     349
     350    PluginLoadClientPoliciesByBundleVersion versionsToPolicies = policiesByIdentifier.get(identifier);
     351    String version = info.versionString;
     352    if (!version || !versionsToPolicies.contains(version))
     353        version = "*";
     354    if (!versionsToPolicies.contains(version))
     355        return false;
     356
     357    policy = versionsToPolicies.get(version);
     358    return true;
     359}
     360#endif // PLATFORM(MAC)
     361
     362void WebPlatformStrategies::populatePluginCache(const WebCore::Page& page)
     363{
     364    if (!m_pluginCacheIsPopulated) {
     365        if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins), 0))
     366            return;
     367
     368        m_shouldRefreshPlugins = false;
     369        m_pluginCacheIsPopulated = true;
     370    }
     371
     372#if PLATFORM(MAC)
     373    String pageHost = page.mainFrame().loader().documentLoader()->responseURL().host();
     374    for (PluginInfo& info : m_cachedPlugins) {
     375        PluginLoadClientPolicy clientPolicy;
     376        if (pluginLoadClientPolicyForHost(pageHost, info, clientPolicy))
     377            info.clientLoadPolicy = clientPolicy;
     378    }
     379#else
     380    UNUSED_PARAM(page);
     381#endif // not PLATFORM(MAC)
    297382}
    298383#endif // ENABLE(NETSCAPE_PLUGIN_API)
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h

    r181494 r181562  
    3232#include <WebCore/PlatformStrategies.h>
    3333#include <WebCore/PluginStrategy.h>
     34#include <wtf/HashMap.h>
    3435#include <wtf/NeverDestroyed.h>
    3536
     
    6869    virtual void refreshPlugins() override;
    6970    virtual void getPluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
     71    virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
     72
     73#if PLATFORM(MAC)
     74    typedef HashMap<String, WebCore::PluginLoadClientPolicy> PluginLoadClientPoliciesByBundleVersion;
     75    typedef HashMap<String, PluginLoadClientPoliciesByBundleVersion> PluginPolicyMapsByIdentifier;
     76
     77    virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString) override;
     78    virtual void clearPluginClientPolicies() override;
     79#endif
    7080
    7181    // WebCore::PasteboardStrategy
     
    100110#if ENABLE(NETSCAPE_PLUGIN_API)
    101111    // WebCore::PluginStrategy implementation.
    102     void populatePluginCache();
     112    void populatePluginCache(const WebCore::Page&);
    103113    bool m_pluginCacheIsPopulated;
    104114    bool m_shouldRefreshPlugins;
    105115    Vector<WebCore::PluginInfo> m_cachedPlugins;
    106116    Vector<WebCore::PluginInfo> m_cachedApplicationPlugins;
     117
     118#if PLATFORM(MAC)
     119    HashMap<String, PluginPolicyMapsByIdentifier> m_hostsToPluginIdentifierData;
     120    bool pluginLoadClientPolicyForHost(const String&, const WebCore::PluginInfo&, WebCore::PluginLoadClientPolicy&) const;
     121#endif // PLATFORM(MAC)
    107122#endif // ENABLE(NETSCAPE_PLUGIN_API)
    108123};
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r181494 r181562  
    44274427
    44284428    const PluginData& pluginData = m_page->pluginData();
    4429     if (pluginData.supportsMimeType(MIMEType, PluginData::AllPlugins) && corePage()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
     4429    if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::AllPlugins) && corePage()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
    44304430        return true;
    44314431
    44324432    // We can use application plugins even if plugins aren't enabled.
    4433     if (pluginData.supportsMimeType(MIMEType, PluginData::OnlyApplicationPlugins))
     4433    if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::OnlyApplicationPlugins))
    44344434        return true;
    44354435
  • trunk/Source/WebKit2/WebProcess/WebProcess.cpp

    r181494 r181562  
    385385    }
    386386#endif
     387
     388#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
     389    for (auto hostIter = parameters.pluginLoadClientPolicies.begin(); hostIter != parameters.pluginLoadClientPolicies.end(); ++hostIter) {
     390        for (auto bundleIdentifierIter = hostIter->value.begin(); bundleIdentifierIter != hostIter->value.end(); ++bundleIdentifierIter) {
     391            for (auto versionIter = bundleIdentifierIter->value.begin(); versionIter != bundleIdentifierIter->value.end(); ++versionIter)
     392                platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(versionIter->value), hostIter->key, bundleIdentifierIter->key, versionIter->key);
     393        }
     394    }
     395#endif
    387396}
    388397
     
    861870
    862871    parentProcessConnection()->send(Messages::WebProcessPool::PlugInDidReceiveUserInteraction(plugInOriginHash, sessionID), 0);
     872}
     873
     874void WebProcess::setPluginLoadClientPolicy(uint8_t policy, const String& host, const String& bundleIdentifier, const String& versionString)
     875{
     876#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
     877    platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(policy), host, bundleIdentifier, versionString);
     878#endif
     879}
     880
     881void WebProcess::clearPluginClientPolicies()
     882{
     883#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
     884    platformStrategies()->pluginStrategy()->clearPluginClientPolicies();
     885#endif
    863886}
    864887
  • trunk/Source/WebKit2/WebProcess/WebProcess.h

    r181494 r181562  
    124124    void plugInDidStartFromOrigin(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID);
    125125    void plugInDidReceiveUserInteraction(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID);
     126    void setPluginLoadClientPolicy(uint8_t policy, const String& host, const String& bundleIdentifier, const String& versionString);
     127    void clearPluginClientPolicies();
    126128
    127129    bool fullKeyboardAccessEnabled() const { return m_fullKeyboardAccessEnabled; }
  • trunk/Source/WebKit2/WebProcess/WebProcess.messages.in

    r181494 r181562  
    5757    ResetPlugInAutoStartOriginDefaultHashes(HashMap<uint32_t,double> hashes)
    5858    ResetPlugInAutoStartOriginHashes(HashMap<WebCore::SessionID, HashMap<uint32_t,double>> hashes)
     59    SetPluginLoadClientPolicy(uint8_t policy, String host, String bundleIdentifier, String versionString)
     60    ClearPluginClientPolicies()
    5961
    6062    void StartMemorySampler(WebKit::SandboxExtension::Handle sampleLogFileHandle, String sampleLogFilePath, double interval);
Note: See TracChangeset for help on using the changeset viewer.