<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[181562] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/181562">181562</a></dd>
<dt>Author</dt> <dd>conrad_shultz@apple.com</dd>
<dt>Date</dt> <dd>2015-03-16 10:13:04 -0700 (Mon, 16 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>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&lt;PluginData&gt;::encodeValue):
Remove now-obsolete code for handling MIME types and add a FIXME.
(JSC::DeserializedPluginData::DeserializedPluginData):
(JSC::EncodingTraits&lt;PluginData&gt;::decodeValue):
Ditto.
(JSC::EncodingTraits&lt;PluginInfo&gt;::encodeValue):
Handle the new members in PluginInfo.
(JSC::EncodingTraits&lt;PluginInfo&gt;::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&lt;PluginInfo&gt;::encode):
Handle new PluginInfo members.
(IPC::ArgumentCoder&lt;PluginInfo&gt;::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.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDOMImplementationcpp">trunk/Source/WebCore/dom/DOMImplementation.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderSubframeLoadercpp">trunk/Source/WebCore/loader/SubframeLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformPlatformStrategiesh">trunk/Source/WebCore/platform/PlatformStrategies.h</a></li>
<li><a href="#trunkSourceWebCorepluginsDOMMimeTypecpp">trunk/Source/WebCore/plugins/DOMMimeType.cpp</a></li>
<li><a href="#trunkSourceWebCorepluginsDOMMimeTypeh">trunk/Source/WebCore/plugins/DOMMimeType.h</a></li>
<li><a href="#trunkSourceWebCorepluginsDOMMimeTypeArraycpp">trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp</a></li>
<li><a href="#trunkSourceWebCorepluginsDOMPlugincpp">trunk/Source/WebCore/plugins/DOMPlugin.cpp</a></li>
<li><a href="#trunkSourceWebCorepluginsDOMPluginh">trunk/Source/WebCore/plugins/DOMPlugin.h</a></li>
<li><a href="#trunkSourceWebCorepluginsDOMPluginArraycpp">trunk/Source/WebCore/plugins/DOMPluginArray.cpp</a></li>
<li><a href="#trunkSourceWebCorepluginsPluginDatacpp">trunk/Source/WebCore/plugins/PluginData.cpp</a></li>
<li><a href="#trunkSourceWebCorepluginsPluginDatah">trunk/Source/WebCore/plugins/PluginData.h</a></li>
<li><a href="#trunkSourceWebCorepluginsPluginStrategyh">trunk/Source/WebCore/plugins/PluginStrategy.h</a></li>
<li><a href="#trunkSourceWebCorereplaySerializationMethodscpp">trunk/Source/WebCore/replay/SerializationMethods.cpp</a></li>
<li><a href="#trunkSourceWebCorereplayWebInputsjson">trunk/Source/WebCore/replay/WebInputs.json</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacPluginsWebBasePluginPackagemm">trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm</a></li>
<li><a href="#trunkSourceWebKitmacPluginsWebNetscapePluginPackagemm">trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebPlatformStrategiesh">trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h</a></li>
<li><a href="#trunkSourceWebKitmacWebCoreSupportWebPlatformStrategiesmm">trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebFramemm">trunk/Source/WebKit/mac/WebView/WebFrame.mm</a></li>
<li><a href="#trunkSourceWebKitwinChangeLog">trunk/Source/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitwinWebCoreSupportWebPlatformStrategiescpp">trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp</a></li>
<li><a href="#trunkSourceWebKitwinWebCoreSupportWebPlatformStrategiesh">trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h</a></li>
<li><a href="#trunkSourceWebKitwinWebViewcpp">trunk/Source/WebKit/win/WebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedPluginsNetscapemacNetscapePluginModuleMacmm">trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCoderscpp">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebProcessCreationParameterscpp">trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebProcessCreationParametersh">trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKAPICasth">trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPluginLoadPolicyh">trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICmacWKContextPrivateMach">trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICmacWKContextPrivateMacmm">trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebProcessPoolcpp">trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebProcessPoolh">trunk/Source/WebKit2/UIProcess/WebProcessPool.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsPDFPDFPluginmm">trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebPlatformStrategiescpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebPlatformStrategiesh">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcesscpp">trunk/Source/WebKit2/WebProcess/WebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessh">trunk/Source/WebKit2/WebProcess/WebProcess.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessmessagesin">trunk/Source/WebKit2/WebProcess/WebProcess.messages.in</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/ChangeLog        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -1,3 +1,134 @@
</span><ins>+2015-03-16  Conrad Shultz  &lt;conrad_shultz@apple.com&gt;
+
+        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&lt;PluginData&gt;::encodeValue):
+        Remove now-obsolete code for handling MIME types and add a FIXME.
+        (JSC::DeserializedPluginData::DeserializedPluginData):
+        (JSC::EncodingTraits&lt;PluginData&gt;::decodeValue):
+        Ditto.
+        (JSC::EncodingTraits&lt;PluginInfo&gt;::encodeValue):
+        Handle the new members in PluginInfo.
+        (JSC::EncodingTraits&lt;PluginInfo&gt;::decodeValue):
+        Ditto.
+
+        * replay/WebInputs.json:
+        Teach Replay about PluginLoadClientPolicy.
+
</ins><span class="cx"> 2015-03-16  Max Stepin  &lt;maxstepin@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add APNG support
</span></span></pre></div>
<a id="trunkSourceWebCoredomDOMImplementationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DOMImplementation.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DOMImplementation.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/dom/DOMImplementation.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -329,7 +329,7 @@
</span><span class="cx"> 
</span><span class="cx">     // PDF is one image type for which a plugin can override built-in support.
</span><span class="cx">     // We do not want QuickTime to take over all image types, obviously.
</span><del>-    if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) &amp;&amp; pluginData &amp;&amp; pluginData-&gt;supportsMimeType(type, allowedPluginTypes))
</del><ins>+    if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) &amp;&amp; pluginData &amp;&amp; pluginData-&gt;supportsWebVisibleMimeType(type, allowedPluginTypes))
</ins><span class="cx">         return PluginDocument::create(frame, url);
</span><span class="cx">     if (Image::supportsType(type))
</span><span class="cx">         return ImageDocument::create(*frame, url);
</span><span class="lines">@@ -348,7 +348,7 @@
</span><span class="cx">     // Everything else except text/plain can be overridden by plugins. In particular, Adobe SVG Viewer should be used for SVG, if installed.
</span><span class="cx">     // Disallowing plug-ins to use text/plain prevents plug-ins from hijacking a fundamental type that the browser is expected to handle,
</span><span class="cx">     // and also serves as an optimization to prevent loading the plug-in database in the common case.
</span><del>-    if (type != &quot;text/plain&quot; &amp;&amp; ((pluginData &amp;&amp; pluginData-&gt;supportsMimeType(type, allowedPluginTypes)) || (frame &amp;&amp; frame-&gt;loader().client().shouldAlwaysUsePluginDocument(type))))
</del><ins>+    if (type != &quot;text/plain&quot; &amp;&amp; ((pluginData &amp;&amp; pluginData-&gt;supportsWebVisibleMimeType(type, allowedPluginTypes)) || (frame &amp;&amp; frame-&gt;loader().client().shouldAlwaysUsePluginDocument(type))))
</ins><span class="cx">         return PluginDocument::create(frame, url);
</span><span class="cx">     if (isTextMIMEType(type))
</span><span class="cx">         return TextDocument::create(frame, url);
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderSubframeLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/SubframeLoader.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/SubframeLoader.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/loader/SubframeLoader.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -167,8 +167,11 @@
</span><span class="cx"> 
</span><span class="cx">     const PluginData&amp; pluginData = page-&gt;pluginData();
</span><span class="cx"> 
</span><del>-    for (size_t i = 0; i &lt; pluginData.mimes().size(); ++i) {
-        const MimeClassInfo&amp; mimeClassInfo = pluginData.mimes()[i];
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+    for (size_t i = 0; i &lt; mimes.size(); ++i) {
+        const MimeClassInfo&amp; mimeClassInfo = mimes[i];
</ins><span class="cx">         for (size_t j = 0; j &lt; mimeClassInfo.extensions.size(); ++j) {
</span><span class="cx">             if (equalIgnoringCase(extension, mimeClassInfo.extensions[j]))
</span><span class="cx">                 return mimeClassInfo.type;
</span><span class="lines">@@ -191,7 +194,7 @@
</span><span class="cx">             return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    String pluginFile = page-&gt;pluginData().pluginFileForMimeType(newMIMEType);
</del><ins>+    String pluginFile = page-&gt;pluginData().pluginFileForWebVisibleMimeType(newMIMEType);
</ins><span class="cx">     String description = !pluginFile ? newMIMEType : pluginFile;
</span><span class="cx"> 
</span><span class="cx">     DiagnosticLoggingClient&amp; diagnosticLoggingClient = page-&gt;mainFrame().diagnosticLoggingClient();
</span><span class="lines">@@ -367,7 +370,7 @@
</span><span class="cx">     // Allow other plug-ins to win over QuickTime because if the user has installed a plug-in that
</span><span class="cx">     // can handle TIFF (which QuickTime can also handle) they probably intended to override QT.
</span><span class="cx">     if (m_frame.page() &amp;&amp; (mimeType == &quot;image/tiff&quot; || mimeType == &quot;image/tif&quot; || mimeType == &quot;image/x-tiff&quot;)) {
</span><del>-        String pluginName = m_frame.page()-&gt;pluginData().pluginNameForMimeType(mimeType);
</del><ins>+        String pluginName = m_frame.page()-&gt;pluginData().pluginNameForWebVisibleMimeType(mimeType);
</ins><span class="cx">         if (!pluginName.isEmpty() &amp;&amp; !pluginName.contains(&quot;QuickTime&quot;, false)) 
</span><span class="cx">             return true;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformPlatformStrategiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/PlatformStrategies.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/PlatformStrategies.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/platform/PlatformStrategies.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -88,7 +88,7 @@
</span><span class="cx">     PluginStrategy* m_pluginStrategy;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-PlatformStrategies* platformStrategies();
</del><ins>+WEBCORE_EXPORT PlatformStrategies* platformStrategies();
</ins><span class="cx"> WEBCORE_EXPORT void setPlatformStrategies(PlatformStrategies*);
</span><span class="cx"> bool hasPlatformStrategies();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsDOMMimeTypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/DOMMimeType.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/DOMMimeType.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMMimeType.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const String &amp;DOMMimeType::type() const
</del><ins>+String DOMMimeType::type() const
</ins><span class="cx"> {
</span><span class="cx">     return mimeClassInfo().type;
</span><span class="cx"> }
</span><span class="lines">@@ -60,17 +60,28 @@
</span><span class="cx">     return builder.toString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const String &amp;DOMMimeType::description() const
</del><ins>+String DOMMimeType::description() const
</ins><span class="cx"> {
</span><span class="cx">     return mimeClassInfo().desc;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+MimeClassInfo DOMMimeType::mimeClassInfo() const
+{
+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    m_pluginData-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+    return mimes[m_index];
+}
+
</ins><span class="cx"> PassRefPtr&lt;DOMPlugin&gt; DOMMimeType::enabledPlugin() const
</span><span class="cx"> {
</span><span class="cx">     if (!m_frame || !m_frame-&gt;page() || !m_frame-&gt;page()-&gt;mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    return DOMPlugin::create(m_pluginData.get(), m_frame, m_pluginData-&gt;mimePluginIndices()[m_index]);
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    m_pluginData-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+    return DOMPlugin::create(m_pluginData.get(), m_frame, mimePluginIndices[m_index]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsDOMMimeTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/DOMMimeType.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/DOMMimeType.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMMimeType.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -37,13 +37,13 @@
</span><span class="cx">     static Ref&lt;DOMMimeType&gt; create(PassRefPtr&lt;PluginData&gt; pluginData, Frame* frame, unsigned index) { return adoptRef(*new DOMMimeType(pluginData, frame, index)); }
</span><span class="cx">     ~DOMMimeType();
</span><span class="cx"> 
</span><del>-    const String &amp;type() const;
</del><ins>+    String type() const;
</ins><span class="cx">     String suffixes() const;
</span><del>-    const String &amp;description() const;
</del><ins>+    String description() const;
</ins><span class="cx">     PassRefPtr&lt;DOMPlugin&gt; enabledPlugin() const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    const MimeClassInfo&amp; mimeClassInfo() const { return m_pluginData-&gt;mimes()[m_index]; }
</del><ins>+    MimeClassInfo mimeClassInfo() const;
</ins><span class="cx"> 
</span><span class="cx">     DOMMimeType(PassRefPtr&lt;PluginData&gt;, Frame*, unsigned index);
</span><span class="cx">     RefPtr&lt;PluginData&gt; m_pluginData;
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsDOMMimeTypeArraycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMMimeTypeArray.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -48,7 +48,11 @@
</span><span class="cx">     PluginData* data = getPluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    return data-&gt;mimes().size();
</del><ins>+
+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    data-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+    return mimes.size();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;DOMMimeType&gt; DOMMimeTypeArray::item(unsigned index)
</span><span class="lines">@@ -56,7 +60,11 @@
</span><span class="cx">     PluginData* data = getPluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes = data-&gt;mimes();
</del><ins>+
+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    data-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
</ins><span class="cx">     if (index &gt;= mimes.size())
</span><span class="cx">         return 0;
</span><span class="cx">     return DOMMimeType::create(data, m_frame, index);
</span><span class="lines">@@ -67,7 +75,10 @@
</span><span class="cx">     PluginData *data = getPluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes = data-&gt;mimes();
</del><ins>+
+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    data-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx">     for (unsigned i = 0; i &lt; mimes.size(); ++i) {
</span><span class="cx">         if (mimes[i].type == propertyName)
</span><span class="cx">             return true;
</span><span class="lines">@@ -80,7 +91,10 @@
</span><span class="cx">     PluginData *data = getPluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes = data-&gt;mimes();
</del><ins>+
+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    data-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx">     for (unsigned i = 0; i &lt; mimes.size(); ++i) {
</span><span class="cx">         if (mimes[i].type == propertyName)
</span><span class="cx">             return DOMMimeType::create(data, m_frame, i);
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsDOMPlugincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/DOMPlugin.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/DOMPlugin.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMPlugin.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -56,16 +56,23 @@
</span><span class="cx">     return pluginInfo().mimes.size();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+PluginInfo DOMPlugin::pluginInfo() const
+{
+    return m_pluginData-&gt;webVisiblePlugins()[m_index];
+}
+
</ins><span class="cx"> PassRefPtr&lt;DOMMimeType&gt; DOMPlugin::item(unsigned index)
</span><span class="cx"> {
</span><span class="cx">     if (index &gt;= pluginInfo().mimes.size())
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    const MimeClassInfo&amp; mime = pluginInfo().mimes[index];
</del><ins>+    MimeClassInfo mime = pluginInfo().mimes[index];
</ins><span class="cx"> 
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes = m_pluginData-&gt;mimes();
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    m_pluginData-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx">     for (unsigned i = 0; i &lt; mimes.size(); ++i) {
</span><del>-        if (mimes[i] == mime &amp;&amp; m_pluginData-&gt;mimePluginIndices()[i] == m_index)
</del><ins>+        if (mimes[i] == mime &amp;&amp; mimePluginIndices[i] == m_index)
</ins><span class="cx">             return DOMMimeType::create(m_pluginData.get(), m_frame, i);
</span><span class="cx">     }
</span><span class="cx">     return 0;
</span><span class="lines">@@ -73,7 +80,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool DOMPlugin::canGetItemsForName(const AtomicString&amp; propertyName)
</span><span class="cx"> {
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes = m_pluginData-&gt;mimes();
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    m_pluginData-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx">     for (unsigned i = 0; i &lt; mimes.size(); ++i)
</span><span class="cx">         if (mimes[i].type == propertyName)
</span><span class="cx">             return true;
</span><span class="lines">@@ -82,7 +91,9 @@
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;DOMMimeType&gt; DOMPlugin::namedItem(const AtomicString&amp; propertyName)
</span><span class="cx"> {
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes = m_pluginData-&gt;mimes();
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    m_pluginData-&gt;getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx">     for (unsigned i = 0; i &lt; mimes.size(); ++i)
</span><span class="cx">         if (mimes[i].type == propertyName)
</span><span class="cx">             return DOMMimeType::create(m_pluginData.get(), m_frame, i);
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsDOMPluginh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/DOMPlugin.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/DOMPlugin.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMPlugin.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">     PassRefPtr&lt;DOMMimeType&gt; namedItem(const AtomicString&amp; propertyName);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    const PluginInfo&amp; pluginInfo() const { return m_pluginData-&gt;plugins()[m_index]; }
</del><ins>+    PluginInfo pluginInfo() const;
</ins><span class="cx"> 
</span><span class="cx">     DOMPlugin(PluginData*, Frame*, unsigned index);
</span><span class="cx">     RefPtr&lt;PluginData&gt; m_pluginData;
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsDOMPluginArraycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/DOMPluginArray.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/DOMPluginArray.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/DOMPluginArray.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -48,7 +48,8 @@
</span><span class="cx">     PluginData* data = pluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    return data-&gt;plugins().size();
</del><ins>+
+    return data-&gt;webVisiblePlugins().size();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;DOMPlugin&gt; DOMPluginArray::item(unsigned index)
</span><span class="lines">@@ -56,7 +57,8 @@
</span><span class="cx">     PluginData* data = pluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    const Vector&lt;PluginInfo&gt;&amp; plugins = data-&gt;plugins();
</del><ins>+
+    const Vector&lt;PluginInfo&gt;&amp; plugins = data-&gt;webVisiblePlugins();
</ins><span class="cx">     if (index &gt;= plugins.size())
</span><span class="cx">         return 0;
</span><span class="cx">     return DOMPlugin::create(data, m_frame, index);
</span><span class="lines">@@ -67,7 +69,8 @@
</span><span class="cx">     PluginData* data = pluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    const Vector&lt;PluginInfo&gt;&amp; plugins = data-&gt;plugins();
</del><ins>+
+    const Vector&lt;PluginInfo&gt;&amp; plugins = data-&gt;webVisiblePlugins();
</ins><span class="cx">     for (unsigned i = 0; i &lt; plugins.size(); ++i) {
</span><span class="cx">         if (plugins[i].name == propertyName)
</span><span class="cx">             return true;
</span><span class="lines">@@ -80,7 +83,8 @@
</span><span class="cx">     PluginData* data = pluginData();
</span><span class="cx">     if (!data)
</span><span class="cx">         return 0;
</span><del>-    const Vector&lt;PluginInfo&gt;&amp; plugins = data-&gt;plugins();
</del><ins>+
+    const Vector&lt;PluginInfo&gt;&amp; plugins = data-&gt;webVisiblePlugins();
</ins><span class="cx">     for (unsigned i = 0; i &lt; plugins.size(); ++i) {
</span><span class="cx">         if (plugins[i].name == propertyName)
</span><span class="cx">             return DOMPlugin::create(data, m_frame, i);
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsPluginDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/PluginData.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/PluginData.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/PluginData.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">     Copyright (C) 2000 Harri Porten (porten@kde.org)
</span><span class="cx">     Copyright (C) 2000 Daniel Molkentin (molkentin@kde.org)
</span><span class="cx">     Copyright (C) 2000 Stefan Schimanski (schimmi@kde.org)
</span><del>-    Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All Rights Reserved.
</del><ins>+    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2015 Apple Inc. All Rights Reserved.
</ins><span class="cx">     Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
</span><span class="cx"> 
</span><span class="cx">     This library is free software; you can redistribute it and/or
</span><span class="lines">@@ -31,49 +31,80 @@
</span><span class="cx"> 
</span><span class="cx"> PluginData::PluginData(const Page* page)
</span><span class="cx"> {
</span><del>-    initPlugins(page);
</del><ins>+    ASSERT_ARG(page, page);
</ins><span class="cx"> 
</span><del>-    for (unsigned i = 0; i &lt; m_plugins.size(); ++i) {
-        const PluginInfo&amp; plugin = m_plugins[i];
</del><ins>+    m_page = page;
+    initPlugins();
+}
+
+Vector&lt;PluginInfo&gt; PluginData::webVisiblePlugins() const
+{
+    Vector&lt;PluginInfo&gt; plugins;
+    platformStrategies()-&gt;pluginStrategy()-&gt;getWebVisiblePluginInfo(m_page, plugins);
+    return plugins;
+}
+
+void PluginData::getWebVisibleMimesAndPluginIndices(Vector&lt;MimeClassInfo&gt;&amp; mimes, Vector&lt;size_t&gt;&amp; mimePluginIndices) const
+{
+    ASSERT_ARG(mimes, mimes.isEmpty());
+    ASSERT_ARG(mimePluginIndices, mimePluginIndices.isEmpty());
+
+    const Vector&lt;PluginInfo&gt;&amp; plugins = webVisiblePlugins();
+    for (unsigned i = 0; i &lt; plugins.size(); ++i) {
+        const PluginInfo&amp; plugin = plugins[i];
</ins><span class="cx">         for (unsigned j = 0; j &lt; plugin.mimes.size(); ++j) {
</span><del>-            m_mimes.append(plugin.mimes[j]);
-            m_mimePluginIndices.append(i);
</del><ins>+            mimes.append(plugin.mimes[j]);
+            mimePluginIndices.append(i);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool PluginData::supportsMimeType(const String&amp; mimeType, const AllowedPluginTypes allowedPluginTypes) const
</del><ins>+bool PluginData::supportsWebVisibleMimeType(const String&amp; mimeType, const AllowedPluginTypes allowedPluginTypes) const
</ins><span class="cx"> {
</span><del>-    for (unsigned i = 0; i &lt; m_mimes.size(); ++i) {
-        if (m_mimes[i].type == mimeType &amp;&amp; (allowedPluginTypes == AllPlugins || m_plugins[m_mimePluginIndices[i]].isApplicationPlugin))
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    const Vector&lt;PluginInfo&gt;&amp; plugins = webVisiblePlugins();
+    getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
+    for (unsigned i = 0; i &lt; mimes.size(); ++i) {
+        if (mimes[i].type == mimeType &amp;&amp; (allowedPluginTypes == AllPlugins || plugins[mimePluginIndices[i]].isApplicationPlugin))
</ins><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const PluginInfo* PluginData::pluginInfoForMimeType(const String&amp; mimeType) const
</del><ins>+bool PluginData::getPluginInfoForWebVisibleMimeType(const String&amp; mimeType, PluginInfo&amp; pluginInfoRef) const
</ins><span class="cx"> {
</span><del>-    for (unsigned i = 0; i &lt; m_mimes.size(); ++i) {
-        const MimeClassInfo&amp; info = m_mimes[i];
-    
-        if (info.type == mimeType)
-            return &amp;m_plugins[m_mimePluginIndices[i]];
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    const Vector&lt;PluginInfo&gt;&amp; plugins = webVisiblePlugins();
+    getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
+    for (unsigned i = 0; i &lt; mimes.size(); ++i) {
+        const MimeClassInfo&amp; info = mimes[i];
+
+        if (info.type == mimeType) {
+            pluginInfoRef = plugins[mimePluginIndices[i]];
+            return true;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return 0;
</del><ins>+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-String PluginData::pluginNameForMimeType(const String&amp; mimeType) const
</del><ins>+String PluginData::pluginNameForWebVisibleMimeType(const String&amp; mimeType) const
</ins><span class="cx"> {
</span><del>-    if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
-        return info-&gt;name;
</del><ins>+    PluginInfo info;
+    if (getPluginInfoForWebVisibleMimeType(mimeType, info))
+        return info.name;
</ins><span class="cx">     return String();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String PluginData::pluginFileForMimeType(const String&amp; mimeType) const
</del><ins>+String PluginData::pluginFileForWebVisibleMimeType(const String&amp; mimeType) const
</ins><span class="cx"> {
</span><del>-    if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
-        return info-&gt;file;
</del><ins>+    PluginInfo info;
+    if (getPluginInfoForWebVisibleMimeType(mimeType, info))
+        return info.file;
</ins><span class="cx">     return String();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -82,11 +113,11 @@
</span><span class="cx">     platformStrategies()-&gt;pluginStrategy()-&gt;refreshPlugins();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PluginData::initPlugins(const Page* page)
</del><ins>+void PluginData::initPlugins()
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_plugins.isEmpty());
</span><del>-    
-    platformStrategies()-&gt;pluginStrategy()-&gt;getPluginInfo(page, m_plugins);
</del><ins>+
+    platformStrategies()-&gt;pluginStrategy()-&gt;getPluginInfo(m_page, m_plugins);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsPluginDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/PluginData.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/PluginData.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/PluginData.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -29,6 +29,24 @@
</span><span class="cx"> class Page;
</span><span class="cx"> struct PluginInfo;
</span><span class="cx"> 
</span><ins>+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,
+};
+
</ins><span class="cx"> struct MimeClassInfo {
</span><span class="cx">     String type;
</span><span class="cx">     String desc;
</span><span class="lines">@@ -46,6 +64,13 @@
</span><span class="cx">     String desc;
</span><span class="cx">     Vector&lt;MimeClassInfo&gt; mimes;
</span><span class="cx">     bool isApplicationPlugin;
</span><ins>+
+    PluginLoadClientPolicy clientLoadPolicy;
+
+#if PLATFORM(MAC)
+    String bundleIdentifier;
+    String versionString;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // FIXME: merge with PluginDatabase in the future
</span><span class="lines">@@ -54,38 +79,35 @@
</span><span class="cx">     static Ref&lt;PluginData&gt; create(const Page* page) { return adoptRef(*new PluginData(page)); }
</span><span class="cx"> 
</span><span class="cx">     const Vector&lt;PluginInfo&gt;&amp; plugins() const { return m_plugins; }
</span><del>-    const Vector&lt;MimeClassInfo&gt;&amp; mimes() const { return m_mimes; }
-    const Vector&lt;size_t&gt;&amp; mimePluginIndices() const { return m_mimePluginIndices; }
</del><ins>+    Vector&lt;PluginInfo&gt; webVisiblePlugins() const;
+    WEBCORE_EXPORT void getWebVisibleMimesAndPluginIndices(Vector&lt;MimeClassInfo&gt;&amp;, Vector&lt;size_t&gt;&amp;) const;
</ins><span class="cx"> 
</span><span class="cx">     enum AllowedPluginTypes {
</span><span class="cx">         AllPlugins,
</span><span class="cx">         OnlyApplicationPlugins
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT bool supportsMimeType(const String&amp; mimeType, const AllowedPluginTypes) const;
-    String pluginNameForMimeType(const String&amp; mimeType) const;
-    String pluginFileForMimeType(const String&amp; mimeType) const;
</del><ins>+    WEBCORE_EXPORT bool supportsWebVisibleMimeType(const String&amp; mimeType, const AllowedPluginTypes) const;
+    String pluginNameForWebVisibleMimeType(const String&amp; mimeType) const;
+    String pluginFileForWebVisibleMimeType(const String&amp; mimeType) const;
</ins><span class="cx"> 
</span><span class="cx">     static void refresh();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     explicit PluginData(const Page*);
</span><del>-    void initPlugins(const Page*);
-    const PluginInfo* pluginInfoForMimeType(const String&amp; mimeType) const;
</del><ins>+    void initPlugins();
+    bool getPluginInfoForWebVisibleMimeType(const String&amp; mimeType, PluginInfo&amp;) const;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx"> #if defined ENABLE_WEB_REPLAY &amp;&amp; ENABLE_WEB_REPLAY
</span><del>-    PluginData(Vector&lt;PluginInfo&gt; plugins, Vector&lt;MimeClassInfo&gt; mimes, Vector&lt;size_t&gt; indices)
</del><ins>+    PluginData(Vector&lt;PluginInfo&gt; plugins)
</ins><span class="cx">         : m_plugins(plugins)
</span><del>-        , m_mimes(mimes)
-        , m_mimePluginIndices(indices)
</del><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    const Page* m_page;
</ins><span class="cx">     Vector&lt;PluginInfo&gt; m_plugins;
</span><del>-    Vector&lt;MimeClassInfo&gt; m_mimes;
-    Vector&lt;size_t&gt; m_mimePluginIndices;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepluginsPluginStrategyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/plugins/PluginStrategy.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/plugins/PluginStrategy.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/plugins/PluginStrategy.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -36,6 +36,11 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual void refreshPlugins() = 0;
</span><span class="cx">     virtual void getPluginInfo(const Page*, Vector&lt;PluginInfo&gt;&amp;) = 0;
</span><ins>+    virtual void getWebVisiblePluginInfo(const Page*, Vector&lt;PluginInfo&gt;&amp;) = 0;
+#if PLATFORM(MAC)
+    virtual void setPluginLoadClientPolicy(PluginLoadClientPolicy, const String&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString) = 0;
+    virtual void clearPluginClientPolicies() = 0;
+#endif
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     virtual ~PluginStrategy() { }
</span></span></pre></div>
<a id="trunkSourceWebCorereplaySerializationMethodscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/replay/SerializationMethods.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/replay/SerializationMethods.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/replay/SerializationMethods.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx"> using WebCore::PlatformWheelEvent;
</span><span class="cx"> using WebCore::PlatformWheelEventGranularity;
</span><span class="cx"> using WebCore::PluginData;
</span><ins>+using WebCore::PluginLoadClientPolicy;
</ins><span class="cx"> using WebCore::PluginInfo;
</span><span class="cx"> using WebCore::SecurityOrigin;
</span><span class="cx"> using WebCore::URL;
</span><span class="lines">@@ -437,23 +438,18 @@
</span><span class="cx"> 
</span><span class="cx"> EncodedValue EncodingTraits&lt;PluginData&gt;::encodeValue(RefPtr&lt;PluginData&gt; input)
</span><span class="cx"> {
</span><ins>+    // FIXME: This needs to work in terms of web-visible plug-ins.
</ins><span class="cx">     EncodedValue encodedData = EncodedValue::createObject();
</span><span class="cx"> 
</span><del>-    Vector&lt;uint32_t&gt; castedMimePluginIndices(input-&gt;mimePluginIndices().size());
-    for (uint32_t index : input-&gt;mimePluginIndices())
-        castedMimePluginIndices.append(WTF::safeCast&lt;uint32_t&gt;(index));
-
</del><span class="cx">     ENCODE_TYPE_WITH_KEY(encodedData, Vector&lt;PluginInfo&gt;, plugins, input-&gt;plugins());
</span><del>-    ENCODE_TYPE_WITH_KEY(encodedData, Vector&lt;MimeClassInfo&gt;, mimes, input-&gt;mimes());
-    ENCODE_TYPE_WITH_KEY(encodedData, Vector&lt;uint32_t&gt;, mimePluginIndices, castedMimePluginIndices);
</del><span class="cx"> 
</span><span class="cx">     return encodedData;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class DeserializedPluginData : public PluginData {
</span><span class="cx"> public:
</span><del>-    DeserializedPluginData(Vector&lt;PluginInfo&gt; plugins, Vector&lt;MimeClassInfo&gt; mimes, Vector&lt;size_t&gt; indices)
-        : PluginData(plugins, mimes, indices)
</del><ins>+    DeserializedPluginData(Vector&lt;PluginInfo&gt; plugins)
+        : PluginData(plugins)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="lines">@@ -461,15 +457,10 @@
</span><span class="cx"> bool EncodingTraits&lt;PluginData&gt;::decodeValue(EncodedValue&amp; encodedData, RefPtr&lt;PluginData&gt;&amp; input)
</span><span class="cx"> {
</span><span class="cx">     DECODE_TYPE_WITH_KEY(encodedData, Vector&lt;PluginInfo&gt;, plugins);
</span><del>-    DECODE_TYPE_WITH_KEY(encodedData, Vector&lt;MimeClassInfo&gt;, mimes);
-    DECODE_TYPE_WITH_KEY(encodedData, Vector&lt;uint32_t&gt;, mimePluginIndices);
</del><span class="cx"> 
</span><del>-    Vector&lt;size_t&gt; castedMimePluginIndices(mimePluginIndices.size());
-    for (uint32_t index : mimePluginIndices)
-        castedMimePluginIndices.append(WTF::safeCast&lt;size_t&gt;(index));
</del><ins>+    // FIXME: This needs to work in terms of web-visible plug-ins.
+    input = adoptRef(new DeserializedPluginData(plugins));
</ins><span class="cx"> 
</span><del>-    input = adoptRef(new DeserializedPluginData(plugins, mimes, castedMimePluginIndices));
-
</del><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -483,6 +474,11 @@
</span><span class="cx">     ENCODE_TYPE_WITH_KEY(encodedData, String, desc, input.desc);
</span><span class="cx">     ENCODE_TYPE_WITH_KEY(encodedData, Vector&lt;MimeClassInfo&gt;, mimes, input.mimes);
</span><span class="cx">     ENCODE_TYPE_WITH_KEY(encodedData, bool, isApplicationPlugin, input.isApplicationPlugin);
</span><ins>+    ENCODE_TYPE_WITH_KEY(encodedData, PluginLoadClientPolicy, clientLoadPolicy, static_cast&lt;PluginLoadClientPolicy&gt;(input.clientLoadPolicy));
+#if PLATFORM(MAC)
+    ENCODE_TYPE_WITH_KEY(encodedData, String, bundleIdentifier, input.bundleIdentifier);
+    ENCODE_TYPE_WITH_KEY(encodedData, String, versionString, input.versionString);
+#endif
</ins><span class="cx"> 
</span><span class="cx">     return encodedData;
</span><span class="cx"> }
</span><span class="lines">@@ -497,6 +493,11 @@
</span><span class="cx">     DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, String, desc, info.desc);
</span><span class="cx">     DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, Vector&lt;MimeClassInfo&gt;, mimes, info.mimes);
</span><span class="cx">     DECODE_TYPE_WITH_KEY_TO_LVALUE(encodedData, bool, isApplicationPlugin, info.isApplicationPlugin);
</span><ins>+    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
</ins><span class="cx"> 
</span><span class="cx">     input = info;
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceWebCorereplayWebInputsjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/replay/WebInputs.json (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/replay/WebInputs.json        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebCore/replay/WebInputs.json        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -67,6 +67,13 @@
</span><span class="cx">                 &quot;header&quot;: &quot;plugins/PluginData.h&quot;
</span><span class="cx">             },
</span><span class="cx">             {
</span><ins>+                &quot;name&quot;: &quot;PluginLoadClientPolicy&quot;, &quot;mode&quot;: &quot;SCALAR&quot;, &quot;storage&quot;: &quot;uint8_t&quot;,
+                &quot;flags&quot;: [&quot;ENUM&quot;],
+                &quot;values&quot;: [&quot;PluginLoadClientPolicyUndefined&quot;, &quot;PluginLoadClientPolicyBlock&quot;, &quot;PluginLoadClientPolicyAsk&quot;, &quot;PluginLoadClientPolicyAllow&quot;, &quot;PluginLoadClientPolicyAllowAlways&quot;],
+                &quot;header&quot;: &quot;plugins/PluginData.h&quot;
+            },
+
+            {
</ins><span class="cx">                 &quot;name&quot;: &quot;ScrollDirection&quot;, &quot;mode&quot;: &quot;SCALAR&quot;, &quot;storage&quot;: &quot;uint8_t&quot;,
</span><span class="cx">                 &quot;flags&quot;: [&quot;ENUM&quot;],
</span><span class="cx">                 &quot;values&quot;: [&quot;ScrollUp&quot;, &quot;ScrollDown&quot;, &quot;ScrollLeft&quot;, &quot;ScrollRight&quot;],
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/ChangeLog        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -1,3 +1,48 @@
</span><ins>+2015-03-16  Conrad Shultz  &lt;conrad_shultz@apple.com&gt;
+
+        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.
+
</ins><span class="cx"> 2015-03-14  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Feature flag for Animations Level 2
</span></span></pre></div>
<a id="trunkSourceWebKitmacPluginsWebBasePluginPackagemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/Plugins/WebBasePluginPackage.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -249,6 +249,11 @@
</span><span class="cx">     pluginInfo.desc = description;
</span><span class="cx"> 
</span><span class="cx">     pluginInfo.isApplicationPlugin = false;
</span><ins>+    pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+    pluginInfo.bundleIdentifier = self.bundleIdentifier;
+    pluginInfo.versionString = self.bundleVersion;
+#endif
</ins><span class="cx"> 
</span><span class="cx">     return YES;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitmacPluginsWebNetscapePluginPackagemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/Plugins/WebNetscapePluginPackage.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -146,7 +146,12 @@
</span><span class="cx">     pluginInfo.name = theName;
</span><span class="cx"> 
</span><span class="cx">     pluginInfo.isApplicationPlugin = false;
</span><del>-    
</del><ins>+    pluginInfo.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+    pluginInfo.bundleIdentifier = self.bundleIdentifier;
+    pluginInfo.versionString = self.bundleVersion;
+#endif
+
</ins><span class="cx">     [self closeResourceFile:resRef];
</span><span class="cx">     
</span><span class="cx">     return YES;
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebPlatformStrategiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -62,6 +62,11 @@
</span><span class="cx">     // WebCore::PluginStrategy
</span><span class="cx">     virtual void refreshPlugins() override;
</span><span class="cx">     virtual void getPluginInfo(const WebCore::Page*, Vector&lt;WebCore::PluginInfo&gt;&amp;) override;
</span><ins>+    virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector&lt;WebCore::PluginInfo&gt;&amp;) override;
+#if PLATFORM(MAC)
+    virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String&amp;, const String&amp;, const String&amp;) override;
+    virtual void clearPluginClientPolicies() override;
+#endif
</ins><span class="cx"> 
</span><span class="cx">     // WebCore::LoaderStrategy
</span><span class="cx">     // - Using default implementation.
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebCoreSupportWebPlatformStrategiesmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebPlatformStrategies.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -128,6 +128,21 @@
</span><span class="cx">     END_BLOCK_OBJC_EXCEPTIONS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector&lt;PluginInfo&gt;&amp; plugins)
+{
+    getPluginInfo(page, plugins);
+}
+
+#if PLATFORM(MAC)
+void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy, const String&amp;, const String&amp;, const String&amp;)
+{
+}
+
+void WebPlatformStrategies::clearPluginClientPolicies()
+{
+}
+#endif
+
</ins><span class="cx"> void WebPlatformStrategies::getTypes(Vector&lt;String&gt;&amp; types, const String&amp; pasteboardName)
</span><span class="cx"> {
</span><span class="cx">     PlatformPasteboard(pasteboardName).getTypes(types);
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebFramemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebFrame.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebFrame.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/mac/WebView/WebFrame.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -979,8 +979,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (WebCore::DOMImplementation::isTextMIMEType(mimeType)
</span><span class="cx">         || Image::supportsType(mimeType)
</span><del>-        || (pluginData &amp;&amp; pluginData-&gt;supportsMimeType(mimeType, PluginData::AllPlugins) &amp;&amp; frame-&gt;loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
-        || (pluginData &amp;&amp; pluginData-&gt;supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
</del><ins>+        || (pluginData &amp;&amp; pluginData-&gt;supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) &amp;&amp; frame-&gt;loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
+        || (pluginData &amp;&amp; pluginData-&gt;supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
</ins><span class="cx">         return NO;
</span><span class="cx"> 
</span><span class="cx">     return YES;
</span></span></pre></div>
<a id="trunkSourceWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/ChangeLog (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/ChangeLog        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/ChangeLog        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-03-16  Conrad Shultz  &lt;conrad_shultz@apple.com&gt;
+
+        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.
+
</ins><span class="cx"> 2015-03-13  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r181483.
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebCoreSupportWebPlatformStrategiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -134,3 +134,8 @@
</span><span class="cx">         outPlugins[i] = info;
</span><span class="cx">     }
</span><span class="cx"> }
</span><ins>+
+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector&lt;PluginInfo&gt;&amp; plugins)
+{
+    getPluginInfo(page, plugins);
+}
</ins></span></pre></div>
<a id="trunkSourceWebKitwinWebCoreSupportWebPlatformStrategiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/WebCoreSupport/WebPlatformStrategies.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx">     // WebCore::PluginStrategy
</span><span class="cx">     virtual void refreshPlugins();
</span><span class="cx">     virtual void getPluginInfo(const WebCore::Page*, Vector&lt;WebCore::PluginInfo&gt;&amp;);
</span><ins>+    virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector&lt;WebCore::PluginInfo&gt;&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif // WebPlatformStrategies_h
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebView.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebView.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit/win/WebView.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -2629,8 +2629,8 @@
</span><span class="cx">         || MIMETypeRegistry::isSupportedMediaMIMEType(mimeType);
</span><span class="cx"> 
</span><span class="cx">     if (!canShow &amp;&amp; m_page) {
</span><del>-        canShow = (m_page-&gt;pluginData().supportsMimeType(mimeType, PluginData::AllPlugins) &amp;&amp; allowPlugins)
-            || m_page-&gt;pluginData().supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins);
</del><ins>+        canShow = (m_page-&gt;pluginData().supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) &amp;&amp; allowPlugins)
+            || m_page-&gt;pluginData().supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!canShow)
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -1,3 +1,114 @@
</span><ins>+2015-03-16  Conrad Shultz  &lt;conrad_shultz@apple.com&gt;
+
+        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&lt;PluginInfo&gt;::encode):
+        Handle new PluginInfo members.
+        (IPC::ArgumentCoder&lt;PluginInfo&gt;::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.
+
</ins><span class="cx"> 2015-03-16  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. Add new Notification classes to GTK+ API documentation.
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedPluginsNetscapemacNetscapePluginModuleMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -399,7 +399,12 @@
</span><span class="cx">         plugin.info.desc = plugin.info.file;
</span><span class="cx"> 
</span><span class="cx">     plugin.info.isApplicationPlugin = false;
</span><del>-    
</del><ins>+    plugin.info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
+#if PLATFORM(MAC)
+    plugin.info.bundleIdentifier = plugin.bundleIdentifier;
+    plugin.info.versionString = plugin.versionString;
+#endif
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCoderscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -566,9 +566,18 @@
</span><span class="cx"> 
</span><span class="cx"> void ArgumentCoder&lt;PluginInfo&gt;::encode(ArgumentEncoder&amp; encoder, const PluginInfo&amp; pluginInfo)
</span><span class="cx"> {
</span><del>-    encoder &lt;&lt; pluginInfo.name &lt;&lt; pluginInfo.file &lt;&lt; pluginInfo.desc &lt;&lt; pluginInfo.mimes &lt;&lt; pluginInfo.isApplicationPlugin;
</del><ins>+    encoder &lt;&lt; pluginInfo.name;
+    encoder &lt;&lt; pluginInfo.file;
+    encoder &lt;&lt; pluginInfo.desc;
+    encoder &lt;&lt; pluginInfo.mimes;
+    encoder &lt;&lt; pluginInfo.isApplicationPlugin;
+    encoder.encodeEnum(pluginInfo.clientLoadPolicy);
+#if PLATFORM(MAC)
+    encoder &lt;&lt; pluginInfo.bundleIdentifier;
+    encoder &lt;&lt; pluginInfo.versionString;
+#endif
</ins><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> bool ArgumentCoder&lt;PluginInfo&gt;::decode(ArgumentDecoder&amp; decoder, PluginInfo&amp; pluginInfo)
</span><span class="cx"> {
</span><span class="cx">     if (!decoder.decode(pluginInfo.name))
</span><span class="lines">@@ -581,6 +590,15 @@
</span><span class="cx">         return false;
</span><span class="cx">     if (!decoder.decode(pluginInfo.isApplicationPlugin))
</span><span class="cx">         return false;
</span><ins>+    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
</ins><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebProcessCreationParameterscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -144,6 +144,10 @@
</span><span class="cx">     encoder &lt;&lt; hasSelectionServices;
</span><span class="cx">     encoder &lt;&lt; hasRichContentServices;
</span><span class="cx"> #endif
</span><ins>+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    encoder &lt;&lt; pluginLoadClientPolicies;
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool WebProcessCreationParameters::decode(IPC::ArgumentDecoder&amp; decoder, WebProcessCreationParameters&amp; parameters)
</span><span class="lines">@@ -302,6 +306,11 @@
</span><span class="cx">         return false;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if ENABLE(NETSCAPE_PLUGIN_API)
+    if (!decoder.decode(parameters.pluginLoadClientPolicies))
+        return false;
+#endif
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebProcessCreationParametersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -167,6 +167,10 @@
</span><span class="cx">     bool hasSelectionServices;
</span><span class="cx">     bool hasRichContentServices;
</span><span class="cx"> #endif
</span><ins>+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    HashMap&lt;String, HashMap&lt;String, HashMap&lt;String, uint8_t&gt;&gt;&gt; pluginLoadClientPolicies;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKAPICasth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> #include &quot;WebGrammarDetail.h&quot;
</span><span class="cx"> #include &lt;WebCore/Credential.h&gt;
</span><span class="cx"> #include &lt;WebCore/FrameLoaderTypes.h&gt;
</span><ins>+#include &lt;WebCore/PluginData.h&gt;
</ins><span class="cx"> #include &lt;WebCore/ProtectionSpace.h&gt;
</span><span class="cx"> #include &lt;WebCore/Settings.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -482,6 +483,25 @@
</span><span class="cx">     return kWKPluginLoadPolicyBlocked;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+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;
+}
+
</ins><span class="cx"> inline PluginModuleLoadPolicy toPluginModuleLoadPolicy(WKPluginLoadPolicy pluginLoadPolicy)
</span><span class="cx"> {
</span><span class="cx">     switch (pluginLoadPolicy) {
</span><span class="lines">@@ -497,6 +517,25 @@
</span><span class="cx">     return PluginModuleBlocked;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+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;
+}
+
</ins><span class="cx"> inline WebCore::WebGLLoadPolicy toWebGLLoadPolicy(WKWebGLLoadPolicy webGLLoadPolicy)
</span><span class="cx"> {
</span><span class="cx">     switch (webGLLoadPolicy) {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPluginLoadPolicyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPluginLoadPolicy.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -40,6 +40,14 @@
</span><span class="cx"> };
</span><span class="cx"> typedef uint32_t WKPluginLoadPolicy;
</span><span class="cx"> 
</span><ins>+enum WKPluginLoadClientPolicy {
+    kWKPluginLoadClientPolicyUndefined = 0,
+    kWKPluginLoadClientPolicyBlock,
+    kWKPluginLoadClientPolicyAsk,
+    kWKPluginLoadClientPolicyAllow,
+    kWKPluginLoadClientPolicyAllowAlways,
+};
+
</ins><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICmacWKContextPrivateMach"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #define WKContextPrivateMac_h
</span><span class="cx"> 
</span><span class="cx"> #include &lt;WebKit/WKBase.h&gt;
</span><ins>+#include &lt;WebKit/WKPluginLoadPolicy.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> extern &quot;C&quot; {
</span><span class="lines">@@ -37,6 +38,9 @@
</span><span class="cx"> 
</span><span class="cx"> WK_EXPORT bool WKContextIsPlugInUpdateAvailable(WKContextRef context, WKStringRef plugInBundleIdentifier);
</span><span class="cx"> 
</span><ins>+WK_EXPORT void WKContextSetPluginLoadClientPolicy(WKContextRef context, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString);
+WK_EXPORT void WKContextClearPluginClientPolicies(WKContextRef context);
+
</ins><span class="cx"> WK_EXPORT WKDictionaryRef WKContextCopyPlugInInfoForBundleIdentifier(WKContextRef context, WKStringRef plugInBundleIdentifier);
</span><span class="cx"> 
</span><span class="cx"> typedef void (^WKContextGetInfoForInstalledPlugInsBlock)(WKArrayRef, WKErrorRef);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICmacWKContextPrivateMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/API/C/mac/WKContextPrivateMac.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -52,6 +52,20 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WKContextSetPluginLoadClientPolicy(WKContextRef contextRef, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    toImpl(contextRef)-&gt;setPluginLoadClientPolicy(toPluginLoadClientPolicy(policy), toWTFString(host), toWTFString(bundleIdentifier), toWTFString(versionString));
+#endif
+}
+
+void WKContextClearPluginClientPolicies(WKContextRef contextRef)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    toImpl(contextRef)-&gt;clearPluginClientPolicies();
+#endif
+}
+
</ins><span class="cx"> WKDictionaryRef WKContextCopyPlugInInfoForBundleIdentifier(WKContextRef contextRef, WKStringRef plugInBundleIdentifierRef)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessPoolcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -683,6 +683,10 @@
</span><span class="cx">     serviceController.refreshExistingServices();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if ENABLE(NETSCAPE_PLUGIN_API)
+    parameters.pluginLoadClientPolicies = m_pluginLoadClientPolicies;
+#endif
+
</ins><span class="cx"> #if OS(LINUX)
</span><span class="cx">     parameters.shouldEnableMemoryPressureReliefLogging = true;
</span><span class="cx"> #endif
</span><span class="lines">@@ -1418,7 +1422,34 @@
</span><span class="cx"> 
</span><span class="cx">     m_client.plugInInformationBecameAvailable(this, API::Array::create(WTF::move(plugins)).get());
</span><span class="cx"> }
</span><ins>+
+void WebProcessPool::setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy policy, const String&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    HashMap&lt;String, HashMap&lt;String, uint8_t&gt;&gt; policiesByIdentifier;
+    if (m_pluginLoadClientPolicies.contains(host))
+        policiesByIdentifier = m_pluginLoadClientPolicies.get(host);
+
+    HashMap&lt;String, uint8_t&gt; versionsToPolicies;
+    if (policiesByIdentifier.contains(bundleIdentifier))
+        versionsToPolicies = policiesByIdentifier.get(bundleIdentifier);
+
+    versionsToPolicies.set(versionString, policy);
+    policiesByIdentifier.set(bundleIdentifier, versionsToPolicies);
+    m_pluginLoadClientPolicies.set(host, policiesByIdentifier);
</ins><span class="cx"> #endif
</span><ins>+
+    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
</ins><span class="cx">     
</span><span class="cx"> void WebProcessPool::setMemoryCacheDisabled(bool disabled)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessPoolh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -183,6 +183,9 @@
</span><span class="cx">     void setAdditionalPluginsDirectory(const String&amp;);
</span><span class="cx"> 
</span><span class="cx">     PluginInfoStore&amp; pluginInfoStore() { return m_pluginInfoStore; }
</span><ins>+
+    void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString);
+    void clearPluginClientPolicies();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_PROCESS)
</span><span class="lines">@@ -540,6 +543,10 @@
</span><span class="cx"> #if ENABLE(CONTENT_EXTENSIONS)
</span><span class="cx">     HashMap&lt;String, String&gt; m_encodedContentExtensions;
</span><span class="cx"> #endif
</span><ins>+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    HashMap&lt;String, HashMap&lt;String, HashMap&lt;String, uint8_t&gt;&gt;&gt; m_pluginLoadClientPolicies;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsPDFPDFPluginmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -539,6 +539,7 @@
</span><span class="cx">     PluginInfo info;
</span><span class="cx">     info.name = builtInPDFPluginName();
</span><span class="cx">     info.isApplicationPlugin = true;
</span><ins>+    info.clientLoadPolicy = PluginLoadClientPolicyUndefined;
</ins><span class="cx"> 
</span><span class="cx">     MimeClassInfo pdfMimeClassInfo;
</span><span class="cx">     pdfMimeClassInfo.type = &quot;application/pdf&quot;;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -1447,8 +1447,11 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(extension.lower() == extension);
</span><span class="cx"> 
</span><del>-    for (size_t i = 0; i &lt; pluginData.mimes().size(); ++i) {
-        const MimeClassInfo&amp; mimeClassInfo = pluginData.mimes()[i];
</del><ins>+    Vector&lt;MimeClassInfo&gt; mimes;
+    Vector&lt;size_t&gt; mimePluginIndices;
+    pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+    for (size_t i = 0; i &lt; mimes.size(); ++i) {
+        const MimeClassInfo&amp; mimeClassInfo = mimes[i];
</ins><span class="cx"> 
</span><span class="cx">         if (mimeClassInfo.extensions.contains(extension))
</span><span class="cx">             return true;
</span><span class="lines">@@ -1483,9 +1486,9 @@
</span><span class="cx">     bool plugInSupportsMIMEType = false;
</span><span class="cx">     if (WebPage* webPage = m_frame-&gt;page()) {
</span><span class="cx">         const PluginData&amp; pluginData = webPage-&gt;corePage()-&gt;pluginData();
</span><del>-        if (pluginData.supportsMimeType(mimeType, PluginData::AllPlugins) &amp;&amp; webFrame()-&gt;coreFrame()-&gt;loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</del><ins>+        if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) &amp;&amp; webFrame()-&gt;coreFrame()-&gt;loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</ins><span class="cx">             plugInSupportsMIMEType = true;
</span><del>-        else if (pluginData.supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins))
</del><ins>+        else if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins))
</ins><span class="cx">             plugInSupportsMIMEType = true;
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebPlatformStrategiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2010, 2011, 2012, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> #include &quot;WebProcess.h&quot;
</span><span class="cx"> #include &quot;WebProcessProxyMessages.h&quot;
</span><span class="cx"> #include &lt;WebCore/Color.h&gt;
</span><ins>+#include &lt;WebCore/DocumentLoader.h&gt;
</ins><span class="cx"> #include &lt;WebCore/IDBFactoryBackendInterface.h&gt;
</span><span class="cx"> #include &lt;WebCore/LoaderStrategy.h&gt;
</span><span class="cx"> #include &lt;WebCore/MainFrame.h&gt;
</span><span class="lines">@@ -266,7 +267,8 @@
</span><span class="cx"> void WebPlatformStrategies::getPluginInfo(const WebCore::Page* page, Vector&lt;WebCore::PluginInfo&gt;&amp; plugins)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span><del>-    populatePluginCache();
</del><ins>+    ASSERT_ARG(page, page);
+    populatePluginCache(*page);
</ins><span class="cx"> 
</span><span class="cx">     if (page-&gt;mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin)) {
</span><span class="cx">         plugins = m_cachedPlugins;
</span><span class="lines">@@ -280,21 +282,104 @@
</span><span class="cx"> #endif // ENABLE(NETSCAPE_PLUGIN_API)
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPlatformStrategies::getWebVisiblePluginInfo(const Page* page, Vector&lt;PluginInfo&gt;&amp; plugins)
+{
+    ASSERT_ARG(page, page);
+    ASSERT_ARG(plugins, plugins.isEmpty());
+
+    getPluginInfo(page, plugins);
+
+#if PLATFORM(MAC)
+    for (int32_t i = plugins.size() - 1; i &gt;= 0; --i) {
+        PluginInfo&amp; 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&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString)
+{
+    String hostToSet = host.isNull() || !host.length() ? &quot;*&quot; : host;
+    String bundleIdentifierToSet = bundleIdentifier.isNull() || !bundleIdentifier.length() ? &quot;*&quot; : bundleIdentifier;
+    String versionStringToSet = versionString.isNull() || !versionString.length() ? &quot;*&quot; : versionString;
+
+    PluginPolicyMapsByIdentifier policiesByIdentifier;
+    if (m_hostsToPluginIdentifierData.contains(hostToSet))
+        policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToSet);
+
+    PluginLoadClientPoliciesByBundleVersion versionsToPolicies;
+    if (policiesByIdentifier.contains(bundleIdentifierToSet))
+        versionsToPolicies = policiesByIdentifier.get(bundleIdentifierToSet);
+
+    versionsToPolicies.set(versionStringToSet, clientPolicy);
+    policiesByIdentifier.set(bundleIdentifierToSet, versionsToPolicies);
+    m_hostsToPluginIdentifierData.set(hostToSet, policiesByIdentifier);
+}
+
+void WebPlatformStrategies::clearPluginClientPolicies()
+{
+    m_hostsToPluginIdentifierData.clear();
+}
+
+#endif
+
</ins><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span><del>-void WebPlatformStrategies::populatePluginCache()
</del><ins>+#if PLATFORM(MAC)
+bool WebPlatformStrategies::pluginLoadClientPolicyForHost(const String&amp; host, const PluginInfo&amp; info, PluginLoadClientPolicy&amp; policy) const
</ins><span class="cx"> {
</span><del>-    if (m_pluginCacheIsPopulated)
-        return;
</del><ins>+    String hostToLookUp = host;
+    if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+        hostToLookUp = &quot;*&quot;;
+    if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+        return false;
</ins><span class="cx"> 
</span><del>-    ASSERT(m_cachedPlugins.isEmpty());
-    
-    // FIXME: Should we do something in case of error here?
-    if (!WebProcess::singleton().parentProcessConnection()-&gt;sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins), 0))
-        return;
</del><ins>+    PluginPolicyMapsByIdentifier policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToLookUp);
+    String identifier = info.bundleIdentifier;
+    if (!identifier || !policiesByIdentifier.contains(identifier))
+        identifier = &quot;*&quot;;
+    if (!policiesByIdentifier.contains(identifier))
+        return false;
</ins><span class="cx"> 
</span><del>-    m_shouldRefreshPlugins = false;
-    m_pluginCacheIsPopulated = true;
</del><ins>+    PluginLoadClientPoliciesByBundleVersion versionsToPolicies = policiesByIdentifier.get(identifier);
+    String version = info.versionString;
+    if (!version || !versionsToPolicies.contains(version))
+        version = &quot;*&quot;;
+    if (!versionsToPolicies.contains(version))
+        return false;
+
+    policy = versionsToPolicies.get(version);
+    return true;
</ins><span class="cx"> }
</span><ins>+#endif // PLATFORM(MAC)
+
+void WebPlatformStrategies::populatePluginCache(const WebCore::Page&amp; page)
+{
+    if (!m_pluginCacheIsPopulated) {
+        if (!WebProcess::singleton().parentProcessConnection()-&gt;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()-&gt;responseURL().host();
+    for (PluginInfo&amp; info : m_cachedPlugins) {
+        PluginLoadClientPolicy clientPolicy;
+        if (pluginLoadClientPolicyForHost(pageHost, info, clientPolicy))
+            info.clientLoadPolicy = clientPolicy;
+    }
+#else
+    UNUSED_PARAM(page);
+#endif // not PLATFORM(MAC)
+}
</ins><span class="cx"> #endif // ENABLE(NETSCAPE_PLUGIN_API)
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebPlatformStrategiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebPlatformStrategies.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &lt;WebCore/PasteboardStrategy.h&gt;
</span><span class="cx"> #include &lt;WebCore/PlatformStrategies.h&gt;
</span><span class="cx"> #include &lt;WebCore/PluginStrategy.h&gt;
</span><ins>+#include &lt;wtf/HashMap.h&gt;
</ins><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -67,7 +68,16 @@
</span><span class="cx">     // WebCore::PluginStrategy
</span><span class="cx">     virtual void refreshPlugins() override;
</span><span class="cx">     virtual void getPluginInfo(const WebCore::Page*, Vector&lt;WebCore::PluginInfo&gt;&amp;) override;
</span><ins>+    virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector&lt;WebCore::PluginInfo&gt;&amp;) override;
</ins><span class="cx"> 
</span><ins>+#if PLATFORM(MAC)
+    typedef HashMap&lt;String, WebCore::PluginLoadClientPolicy&gt; PluginLoadClientPoliciesByBundleVersion;
+    typedef HashMap&lt;String, PluginLoadClientPoliciesByBundleVersion&gt; PluginPolicyMapsByIdentifier;
+
+    virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString) override;
+    virtual void clearPluginClientPolicies() override;
+#endif
+
</ins><span class="cx">     // WebCore::PasteboardStrategy
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     virtual void writeToPasteboard(const WebCore::PasteboardWebContent&amp;) override;
</span><span class="lines">@@ -99,11 +109,16 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span><span class="cx">     // WebCore::PluginStrategy implementation.
</span><del>-    void populatePluginCache();
</del><ins>+    void populatePluginCache(const WebCore::Page&amp;);
</ins><span class="cx">     bool m_pluginCacheIsPopulated;
</span><span class="cx">     bool m_shouldRefreshPlugins;
</span><span class="cx">     Vector&lt;WebCore::PluginInfo&gt; m_cachedPlugins;
</span><span class="cx">     Vector&lt;WebCore::PluginInfo&gt; m_cachedApplicationPlugins;
</span><ins>+
+#if PLATFORM(MAC)
+    HashMap&lt;String, PluginPolicyMapsByIdentifier&gt; m_hostsToPluginIdentifierData;
+    bool pluginLoadClientPolicyForHost(const String&amp;, const WebCore::PluginInfo&amp;, WebCore::PluginLoadClientPolicy&amp;) const;
+#endif // PLATFORM(MAC)
</ins><span class="cx"> #endif // ENABLE(NETSCAPE_PLUGIN_API)
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -4426,11 +4426,11 @@
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     const PluginData&amp; pluginData = m_page-&gt;pluginData();
</span><del>-    if (pluginData.supportsMimeType(MIMEType, PluginData::AllPlugins) &amp;&amp; corePage()-&gt;mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</del><ins>+    if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::AllPlugins) &amp;&amp; corePage()-&gt;mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     // We can use application plugins even if plugins aren't enabled.
</span><del>-    if (pluginData.supportsMimeType(MIMEType, PluginData::OnlyApplicationPlugins))
</del><ins>+    if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::OnlyApplicationPlugins))
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     return false;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -384,6 +384,15 @@
</span><span class="cx">         Inspector::RemoteInspector::singleton().setParentProcessInformation(presenterApplicationPid(), auditData);
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><ins>+
+#if ENABLE(NETSCAPE_PLUGIN_API) &amp;&amp; PLATFORM(MAC)
+    for (auto hostIter = parameters.pluginLoadClientPolicies.begin(); hostIter != parameters.pluginLoadClientPolicies.end(); ++hostIter) {
+        for (auto bundleIdentifierIter = hostIter-&gt;value.begin(); bundleIdentifierIter != hostIter-&gt;value.end(); ++bundleIdentifierIter) {
+            for (auto versionIter = bundleIdentifierIter-&gt;value.begin(); versionIter != bundleIdentifierIter-&gt;value.end(); ++versionIter)
+                platformStrategies()-&gt;pluginStrategy()-&gt;setPluginLoadClientPolicy(static_cast&lt;PluginLoadClientPolicy&gt;(versionIter-&gt;value), hostIter-&gt;key, bundleIdentifierIter-&gt;key, versionIter-&gt;key);
+        }
+    }
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_PROCESS)
</span><span class="lines">@@ -862,6 +871,20 @@
</span><span class="cx">     parentProcessConnection()-&gt;send(Messages::WebProcessPool::PlugInDidReceiveUserInteraction(plugInOriginHash, sessionID), 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebProcess::setPluginLoadClientPolicy(uint8_t policy, const String&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API) &amp;&amp; PLATFORM(MAC)
+    platformStrategies()-&gt;pluginStrategy()-&gt;setPluginLoadClientPolicy(static_cast&lt;PluginLoadClientPolicy&gt;(policy), host, bundleIdentifier, versionString);
+#endif
+}
+
+void WebProcess::clearPluginClientPolicies()
+{
+#if ENABLE(NETSCAPE_PLUGIN_API) &amp;&amp; PLATFORM(MAC)
+    platformStrategies()-&gt;pluginStrategy()-&gt;clearPluginClientPolicies();
+#endif
+}
+
</ins><span class="cx"> static void fromCountedSetToHashMap(TypeCountSet* countedSet, HashMap&lt;String, uint64_t&gt;&amp; map)
</span><span class="cx"> {
</span><span class="cx">     TypeCountSet::const_iterator end = countedSet-&gt;end();
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.h        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -123,6 +123,8 @@
</span><span class="cx">     bool shouldPlugInAutoStartFromOrigin(WebPage&amp;, const String&amp; pageOrigin, const String&amp; pluginOrigin, const String&amp; mimeType);
</span><span class="cx">     void plugInDidStartFromOrigin(const String&amp; pageOrigin, const String&amp; pluginOrigin, const String&amp; mimeType, WebCore::SessionID);
</span><span class="cx">     void plugInDidReceiveUserInteraction(const String&amp; pageOrigin, const String&amp; pluginOrigin, const String&amp; mimeType, WebCore::SessionID);
</span><ins>+    void setPluginLoadClientPolicy(uint8_t policy, const String&amp; host, const String&amp; bundleIdentifier, const String&amp; versionString);
+    void clearPluginClientPolicies();
</ins><span class="cx"> 
</span><span class="cx">     bool fullKeyboardAccessEnabled() const { return m_fullKeyboardAccessEnabled; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.messages.in (181561 => 181562)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.messages.in        2015-03-16 16:51:24 UTC (rev 181561)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.messages.in        2015-03-16 17:13:04 UTC (rev 181562)
</span><span class="lines">@@ -56,6 +56,8 @@
</span><span class="cx">     DidAddPlugInAutoStartOriginHash(uint32_t hash, double expirationTime, WebCore::SessionID sessionID)
</span><span class="cx">     ResetPlugInAutoStartOriginDefaultHashes(HashMap&lt;uint32_t,double&gt; hashes)
</span><span class="cx">     ResetPlugInAutoStartOriginHashes(HashMap&lt;WebCore::SessionID, HashMap&lt;uint32_t,double&gt;&gt; hashes)
</span><ins>+    SetPluginLoadClientPolicy(uint8_t policy, String host, String bundleIdentifier, String versionString)
+    ClearPluginClientPolicies()
</ins><span class="cx"> 
</span><span class="cx">     void StartMemorySampler(WebKit::SandboxExtension::Handle sampleLogFileHandle, String sampleLogFilePath, double interval);
</span><span class="cx">     void StopMemorySampler();
</span></span></pre>
</div>
</div>

</body>
</html>