<!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<PluginData>::encodeValue):
Remove now-obsolete code for handling MIME types and add a FIXME.
(JSC::DeserializedPluginData::DeserializedPluginData):
(JSC::EncodingTraits<PluginData>::decodeValue):
Ditto.
(JSC::EncodingTraits<PluginInfo>::encodeValue):
Handle the new members in PluginInfo.
(JSC::EncodingTraits<PluginInfo>::decodeValue):
Ditto.
* replay/WebInputs.json:
Teach Replay about PluginLoadClientPolicy.
Source/WebKit/mac:
Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
from the page). As part of this:
1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
set of plug-ins.
2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
down the stack.
3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
a concrete implementation thereof in WebPlatformStrategies in WebKit2.
4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
While currently only used in a very limited manner, the new declarative plug-in policies are written generically
so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
* Plugins/WebBasePluginPackage.mm:
(-[WebBasePluginPackage getPluginInfoFromPLists]):
Set new members in PluginInfo.
* Plugins/WebNetscapePluginPackage.mm:
(-[WebNetscapePluginPackage getPluginInfoFromResources]):
Set new members in PluginInfo.
* WebCoreSupport/WebPlatformStrategies.h:
* WebCoreSupport/WebPlatformStrategies.mm:
(WebPlatformStrategies::getWebVisiblePluginInfo):
Override to wrap getPluginInfo().
(WebPlatformStrategies::setPluginLoadClientPolicy):
Override to do nothing.
(WebPlatformStrategies::clearPluginClientPolicies):
Ditto.
* WebView/WebFrame.mm:
(-[WebFrame _canProvideDocumentSource]):
Update to reflect function rename.
Source/WebKit/win:
* WebCoreSupport/WebPlatformStrategies.h:
* WebCoreSupport/WebPlatformStrategies.cpp:
(WebPlatformStrategies::getWebVisiblePluginInfo):
Wrap getPluginInfo();
* WebView.cpp:
(WebView::canShowMIMEType):
Update to reflect function rename.
Source/WebKit2:
Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
from the page). As part of this:
1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
set of plug-ins.
2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
down the stack.
3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
a concrete implementation thereof in WebPlatformStrategies in WebKit2.
4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
While currently only used in a very limited manner, the new declarative plug-in policies are written generically
so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
* Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm:
(WebKit::NetscapePluginModule::getPluginInfo):
Set new PluginInfo members.
* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder<PluginInfo>::encode):
Handle new PluginInfo members.
(IPC::ArgumentCoder<PluginInfo>::decode):
Ditto.
* Shared/WebProcessCreationParameters.h:
Declare a member to store client plug-in policies.
* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode):
Encode the policies.
(WebKit::WebProcessCreationParameters::decode):
Decode the policies.
* UIProcess/API/C/WKAPICast.h:
(WebKit::toWKPluginLoadClientPolicy):
Teach how to cast between WebCore and WebKit2 policy definitions.
(WebKit::toPluginLoadClientPolicy):
Ditto.
* UIProcess/API/C/WKPluginLoadPolicy.h:
Declare WKPluginLoadClientPolicy, matching PluginLoadClientPolicy in WebCore.
* UIProcess/API/C/mac/WKContextPrivateMac.h:
* UIProcess/API/C/mac/WKContextPrivateMac.mm:
(WKContextSetPluginLoadClientPolicy):
New function; wrap WebProcessPool::setPluginLoadClientPolicy().
(WKContextClearPluginClientPolicies):
New function; wrap WebProcessPool::clearPluginClientPolicies().
* UIProcess/WebProcessPool.h:
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::createNewWebProcess):
Copy any client plug-in policies to the new process' creation parameters.
(WebKit::WebProcessPool::setPluginLoadClientPolicy):
Send SetPluginLoadClientPolicy to all processes and stash the passed-in policy info.
(WebKit::WebProcessPool::clearPluginClientPolicies):
Send ClearPluginClientPolicies to all processes and clear any stashed policy info.
* WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::pluginInfo):
Set new PluginInfo member.
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::pluginSupportsExtension):
Adopt getWebVisibleMimesAndPluginIndices().
(WebKit::WebFrameLoaderClient::objectContentType):
Update to reflect reflect function rename.
* WebProcess/WebCoreSupport/WebPlatformStrategies.h:
* WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
(WebKit::WebPlatformStrategies::getPluginInfo):
Pass the Page to populatePluginCache().
(WebKit::WebPlatformStrategies::getWebVisiblePluginInfo):
New member function; wrap getPluginInfo(); if appropriate, filter out plug-ins the client has asked
to block on the current page.
(WebKit::WebPlatformStrategies::setPluginLoadClientPolicy):
New member function; map empty inputs to a wildcard character and insert the new policy into the nested map.
(WebKit::WebPlatformStrategies::clearPluginClientPolicies):
New member function; empty m_hostsToPluginIdentifierData.
(WebKit::WebPlatformStrategies::pluginLoadClientPolicyForHost):
New member function; look up the most specific policy for the given plug-in and host.
(WebKit::WebPlatformStrategies::populatePluginCache):
If appropriate, set the client load policy on the plug-ins; do this irrespective of whether the cache has
been populated since the Page, and therefore host, may change.
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::canShowMIMEType):
Update to reflect function rename.
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeWebProcess):
Enumerate and process the client plug-in policies in the creation parameters.
(WebKit::WebProcess::setPluginLoadClientPolicy):
New member function; wrap PluginStrategy::setPluginLoadClientPolicy.
(WebKit::WebProcess::clearPluginClientPolicies):
New member function; wrap PluginStrategy::clearPluginClientPolicies().
* WebProcess/WebProcess.messages.in:
Add messages for setting and clearing policies.</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 <conrad_shultz@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
+ from the page). As part of this:
+
+ 1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
+ set of plug-ins.
+
+ 2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
+ down the stack.
+
+ 3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
+ a concrete implementation thereof in WebPlatformStrategies in WebKit2.
+
+ 4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
+
+ While currently only used in a very limited manner, the new declarative plug-in policies are written generically
+ so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
+
+ * dom/DOMImplementation.cpp:
+ (WebCore::DOMImplementation::createDocument):
+ Update to reflect function rename.
+
+ * loader/SubframeLoader.cpp:
+ (WebCore::findPluginMIMETypeFromURL):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::logPluginRequest):
+ Update to reflect function rename.
+ (WebCore::SubframeLoader::shouldUsePlugin):
+ Ditto.
+
+ * platform/PlatformStrategies.h:
+ Export platformStrategies(), since it is now used in WebProcess.cpp.
+
+ * plugins/DOMMimeType.cpp:
+ (WebCore::DOMMimeType::type):
+ (WebCore::DOMMimeType::description):
+ (WebCore::DOMMimeType::mimeClassInfo):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::DOMMimeType::enabledPlugin):
+ Ditto.
+
+ * plugins/DOMMimeType.h:
+ Don't return references in a few places where it is no longer safe to do so.
+ (WebCore::DOMMimeType::mimeClassInfo): Deleted.
+
+ * plugins/DOMMimeTypeArray.cpp:
+ (WebCore::DOMMimeTypeArray::length):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::DOMMimeTypeArray::item):
+ Ditto.
+ (WebCore::DOMMimeTypeArray::canGetItemsForName):
+ Ditto.
+ (WebCore::DOMMimeTypeArray::namedItem):
+ Ditto.
+
+ * plugins/DOMPlugin.cpp:
+ (WebCore::DOMPlugin::pluginInfo):
+ Adopt getWebVisiblePlugins().
+ (WebCore::DOMPlugin::item):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebCore::DOMPlugin::canGetItemsForName):
+ Ditto.
+ (WebCore::DOMPlugin::namedItem):
+ Ditto.
+
+ * plugins/DOMPlugin.h:
+ (WebCore::DOMPlugin::pluginInfo): Deleted.
+
+ * plugins/DOMPluginArray.cpp:
+ (WebCore::DOMPluginArray::length):
+ Adopt getWebVisiblePlugins().
+ (WebCore::DOMPluginArray::item):
+ Ditto.
+ (WebCore::DOMPluginArray::canGetItemsForName):
+ Ditto.
+ (WebCore::DOMPluginArray::namedItem):
+ Ditto.
+
+ * plugins/PluginData.cpp:
+ (WebCore::PluginData::PluginData):
+ Stash the passed-in Page and call initPlugins().
+ (WebCore::PluginData::getWebVisiblePlugins):
+ New member function; call through to PluginStrategy::getWebVisiblePluginInfo().
+ (WebCore::PluginData::getWebVisibleMimesAndPluginIndices):
+ New member function; build up the mimes and mimePluginIndices vectors in the same manner as before, but
+ limited to the web-visible plug-ins.
+ (WebCore::PluginData::supportsWebVisibleMimeType):
+ Renamed from supportsMimeType(); update to work in terms of web-visible plug-ins.
+ (WebCore::PluginData::pluginInfoForWebVisibleMimeType):
+ Renamed from pluginInfoForMimeType(); ditto.
+ (WebCore::PluginData::pluginNameForWebVisibleMimeType):
+ Renamed from pluginNameForMimeType(); ditto.
+ (WebCore::PluginData::pluginFileForWebVisibleMimeType):
+ Renamed from pluginFileForMimeType(); ditto.
+ (WebCore::PluginData::initPlugins):
+ (WebCore::PluginData::supportsMimeType): Deleted.
+ (WebCore::PluginData::pluginInfoForMimeType): Deleted.
+ (WebCore::PluginData::pluginNameForMimeType): Deleted.
+ (WebCore::PluginData::pluginFileForMimeType): Deleted.
+
+ * plugins/PluginData.h:
+ Add a member variable for the associate Page; declare the PluginLoadClientPolicy enumeration; add
+ new members to PluginInfo for the clientLoadPolicy and bundle information.
+ (WebCore::PluginData::PluginData):
+ Replace some member functions with new ones that will hide plug-ins upon request from the client;
+ (WebCore::PluginData::mimes): Deleted.
+ (WebCore::PluginData::mimePluginIndices): Deleted.
+
+ * plugins/PluginStrategy.h:
+ Declare new member functions for retrieving web-visible plug-ins and setting/clearing plug-in policies.
+
+ * replay/SerializationMethods.cpp:
+ (JSC::EncodingTraits<PluginData>::encodeValue):
+ Remove now-obsolete code for handling MIME types and add a FIXME.
+ (JSC::DeserializedPluginData::DeserializedPluginData):
+ (JSC::EncodingTraits<PluginData>::decodeValue):
+ Ditto.
+ (JSC::EncodingTraits<PluginInfo>::encodeValue):
+ Handle the new members in PluginInfo.
+ (JSC::EncodingTraits<PluginInfo>::decodeValue):
+ Ditto.
+
+ * replay/WebInputs.json:
+ Teach Replay about PluginLoadClientPolicy.
+
</ins><span class="cx"> 2015-03-16 Max Stepin <maxstepin@gmail.com>
</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) && pluginData && pluginData->supportsMimeType(type, allowedPluginTypes))
</del><ins>+ if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->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 != "text/plain" && ((pluginData && pluginData->supportsMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
</del><ins>+ if (type != "text/plain" && ((pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes)) || (frame && frame->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& pluginData = page->pluginData();
</span><span class="cx">
</span><del>- for (size_t i = 0; i < pluginData.mimes().size(); ++i) {
- const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ for (size_t i = 0; i < mimes.size(); ++i) {
+ const MimeClassInfo& mimeClassInfo = mimes[i];
</ins><span class="cx"> for (size_t j = 0; j < 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->pluginData().pluginFileForMimeType(newMIMEType);
</del><ins>+ String pluginFile = page->pluginData().pluginFileForWebVisibleMimeType(newMIMEType);
</ins><span class="cx"> String description = !pluginFile ? newMIMEType : pluginFile;
</span><span class="cx">
</span><span class="cx"> DiagnosticLoggingClient& diagnosticLoggingClient = page->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() && (mimeType == "image/tiff" || mimeType == "image/tif" || mimeType == "image/x-tiff")) {
</span><del>- String pluginName = m_frame.page()->pluginData().pluginNameForMimeType(mimeType);
</del><ins>+ String pluginName = m_frame.page()->pluginData().pluginNameForWebVisibleMimeType(mimeType);
</ins><span class="cx"> if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", 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 &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 &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<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ return mimes[m_index];
+}
+
</ins><span class="cx"> PassRefPtr<DOMPlugin> DOMMimeType::enabledPlugin() const
</span><span class="cx"> {
</span><span class="cx"> if (!m_frame || !m_frame->page() || !m_frame->page()->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->mimePluginIndices()[m_index]);
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->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<DOMMimeType> create(PassRefPtr<PluginData> 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 &type() const;
</del><ins>+ String type() const;
</ins><span class="cx"> String suffixes() const;
</span><del>- const String &description() const;
</del><ins>+ String description() const;
</ins><span class="cx"> PassRefPtr<DOMPlugin> enabledPlugin() const;
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- const MimeClassInfo& mimeClassInfo() const { return m_pluginData->mimes()[m_index]; }
</del><ins>+ MimeClassInfo mimeClassInfo() const;
</ins><span class="cx">
</span><span class="cx"> DOMMimeType(PassRefPtr<PluginData>, Frame*, unsigned index);
</span><span class="cx"> RefPtr<PluginData> 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->mimes().size();
</del><ins>+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ return mimes.size();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> PassRefPtr<DOMMimeType> 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<MimeClassInfo>& mimes = data->mimes();
</del><ins>+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
</ins><span class="cx"> if (index >= 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<MimeClassInfo>& mimes = data->mimes();
</del><ins>+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx"> for (unsigned i = 0; i < 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<MimeClassInfo>& mimes = data->mimes();
</del><ins>+
+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx"> for (unsigned i = 0; i < 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->webVisiblePlugins()[m_index];
+}
+
</ins><span class="cx"> PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index)
</span><span class="cx"> {
</span><span class="cx"> if (index >= pluginInfo().mimes.size())
</span><span class="cx"> return 0;
</span><span class="cx">
</span><del>- const MimeClassInfo& mime = pluginInfo().mimes[index];
</del><ins>+ MimeClassInfo mime = pluginInfo().mimes[index];
</ins><span class="cx">
</span><del>- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx"> for (unsigned i = 0; i < mimes.size(); ++i) {
</span><del>- if (mimes[i] == mime && m_pluginData->mimePluginIndices()[i] == m_index)
</del><ins>+ if (mimes[i] == mime && 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& propertyName)
</span><span class="cx"> {
</span><del>- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx"> for (unsigned i = 0; i < 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<DOMMimeType> DOMPlugin::namedItem(const AtomicString& propertyName)
</span><span class="cx"> {
</span><del>- const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
</ins><span class="cx"> for (unsigned i = 0; i < 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<DOMMimeType> namedItem(const AtomicString& propertyName);
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- const PluginInfo& pluginInfo() const { return m_pluginData->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<PluginData> 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->plugins().size();
</del><ins>+
+ return data->webVisiblePlugins().size();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> PassRefPtr<DOMPlugin> 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<PluginInfo>& plugins = data->plugins();
</del><ins>+
+ const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
</ins><span class="cx"> if (index >= 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<PluginInfo>& plugins = data->plugins();
</del><ins>+
+ const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
</ins><span class="cx"> for (unsigned i = 0; i < 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<PluginInfo>& plugins = data->plugins();
</del><ins>+
+ const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
</ins><span class="cx"> for (unsigned i = 0; i < 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 < m_plugins.size(); ++i) {
- const PluginInfo& plugin = m_plugins[i];
</del><ins>+ m_page = page;
+ initPlugins();
+}
+
+Vector<PluginInfo> PluginData::webVisiblePlugins() const
+{
+ Vector<PluginInfo> plugins;
+ platformStrategies()->pluginStrategy()->getWebVisiblePluginInfo(m_page, plugins);
+ return plugins;
+}
+
+void PluginData::getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const
+{
+ ASSERT_ARG(mimes, mimes.isEmpty());
+ ASSERT_ARG(mimePluginIndices, mimePluginIndices.isEmpty());
+
+ const Vector<PluginInfo>& plugins = webVisiblePlugins();
+ for (unsigned i = 0; i < plugins.size(); ++i) {
+ const PluginInfo& plugin = plugins[i];
</ins><span class="cx"> for (unsigned j = 0; j < 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& mimeType, const AllowedPluginTypes allowedPluginTypes) const
</del><ins>+bool PluginData::supportsWebVisibleMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const
</ins><span class="cx"> {
</span><del>- for (unsigned i = 0; i < m_mimes.size(); ++i) {
- if (m_mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || m_plugins[m_mimePluginIndices[i]].isApplicationPlugin))
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ const Vector<PluginInfo>& plugins = webVisiblePlugins();
+ getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
+ for (unsigned i = 0; i < mimes.size(); ++i) {
+ if (mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || plugins[mimePluginIndices[i]].isApplicationPlugin))
</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& mimeType) const
</del><ins>+bool PluginData::getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo& pluginInfoRef) const
</ins><span class="cx"> {
</span><del>- for (unsigned i = 0; i < m_mimes.size(); ++i) {
- const MimeClassInfo& info = m_mimes[i];
-
- if (info.type == mimeType)
- return &m_plugins[m_mimePluginIndices[i]];
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ const Vector<PluginInfo>& plugins = webVisiblePlugins();
+ getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+
+ for (unsigned i = 0; i < mimes.size(); ++i) {
+ const MimeClassInfo& info = mimes[i];
+
+ if (info.type == mimeType) {
+ pluginInfoRef = plugins[mimePluginIndices[i]];
+ return true;
+ }
</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& mimeType) const
</del><ins>+String PluginData::pluginNameForWebVisibleMimeType(const String& mimeType) const
</ins><span class="cx"> {
</span><del>- if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
- return info->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& mimeType) const
</del><ins>+String PluginData::pluginFileForWebVisibleMimeType(const String& mimeType) const
</ins><span class="cx"> {
</span><del>- if (const PluginInfo* info = pluginInfoForMimeType(mimeType))
- return info->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()->pluginStrategy()->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()->pluginStrategy()->getPluginInfo(page, m_plugins);
</del><ins>+
+ platformStrategies()->pluginStrategy()->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<MimeClassInfo> 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<PluginData> create(const Page* page) { return adoptRef(*new PluginData(page)); }
</span><span class="cx">
</span><span class="cx"> const Vector<PluginInfo>& plugins() const { return m_plugins; }
</span><del>- const Vector<MimeClassInfo>& mimes() const { return m_mimes; }
- const Vector<size_t>& mimePluginIndices() const { return m_mimePluginIndices; }
</del><ins>+ Vector<PluginInfo> webVisiblePlugins() const;
+ WEBCORE_EXPORT void getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>&, Vector<size_t>&) 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& mimeType, const AllowedPluginTypes) const;
- String pluginNameForMimeType(const String& mimeType) const;
- String pluginFileForMimeType(const String& mimeType) const;
</del><ins>+ WEBCORE_EXPORT bool supportsWebVisibleMimeType(const String& mimeType, const AllowedPluginTypes) const;
+ String pluginNameForWebVisibleMimeType(const String& mimeType) const;
+ String pluginFileForWebVisibleMimeType(const String& 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& mimeType) const;
</del><ins>+ void initPlugins();
+ bool getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo&) const;
</ins><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> #if defined ENABLE_WEB_REPLAY && ENABLE_WEB_REPLAY
</span><del>- PluginData(Vector<PluginInfo> plugins, Vector<MimeClassInfo> mimes, Vector<size_t> indices)
</del><ins>+ PluginData(Vector<PluginInfo> 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<PluginInfo> m_plugins;
</span><del>- Vector<MimeClassInfo> m_mimes;
- Vector<size_t> 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<PluginInfo>&) = 0;
</span><ins>+ virtual void getWebVisiblePluginInfo(const Page*, Vector<PluginInfo>&) = 0;
+#if PLATFORM(MAC)
+ virtual void setPluginLoadClientPolicy(PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString) = 0;
+ virtual void clearPluginClientPolicies() = 0;
+#endif
</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<PluginData>::encodeValue(RefPtr<PluginData> 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<uint32_t> castedMimePluginIndices(input->mimePluginIndices().size());
- for (uint32_t index : input->mimePluginIndices())
- castedMimePluginIndices.append(WTF::safeCast<uint32_t>(index));
-
</del><span class="cx"> ENCODE_TYPE_WITH_KEY(encodedData, Vector<PluginInfo>, plugins, input->plugins());
</span><del>- ENCODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes, input->mimes());
- ENCODE_TYPE_WITH_KEY(encodedData, Vector<uint32_t>, 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<PluginInfo> plugins, Vector<MimeClassInfo> mimes, Vector<size_t> indices)
- : PluginData(plugins, mimes, indices)
</del><ins>+ DeserializedPluginData(Vector<PluginInfo> 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<PluginData>::decodeValue(EncodedValue& encodedData, RefPtr<PluginData>& input)
</span><span class="cx"> {
</span><span class="cx"> DECODE_TYPE_WITH_KEY(encodedData, Vector<PluginInfo>, plugins);
</span><del>- DECODE_TYPE_WITH_KEY(encodedData, Vector<MimeClassInfo>, mimes);
- DECODE_TYPE_WITH_KEY(encodedData, Vector<uint32_t>, mimePluginIndices);
</del><span class="cx">
</span><del>- Vector<size_t> castedMimePluginIndices(mimePluginIndices.size());
- for (uint32_t index : mimePluginIndices)
- castedMimePluginIndices.append(WTF::safeCast<size_t>(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<MimeClassInfo>, 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<PluginLoadClientPolicy>(input.clientLoadPolicy));
+#if PLATFORM(MAC)
+ ENCODE_TYPE_WITH_KEY(encodedData, String, bundleIdentifier, input.bundleIdentifier);
+ ENCODE_TYPE_WITH_KEY(encodedData, String, versionString, input.versionString);
+#endif
</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<MimeClassInfo>, 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"> "header": "plugins/PluginData.h"
</span><span class="cx"> },
</span><span class="cx"> {
</span><ins>+ "name": "PluginLoadClientPolicy", "mode": "SCALAR", "storage": "uint8_t",
+ "flags": ["ENUM"],
+ "values": ["PluginLoadClientPolicyUndefined", "PluginLoadClientPolicyBlock", "PluginLoadClientPolicyAsk", "PluginLoadClientPolicyAllow", "PluginLoadClientPolicyAllowAlways"],
+ "header": "plugins/PluginData.h"
+ },
+
+ {
</ins><span class="cx"> "name": "ScrollDirection", "mode": "SCALAR", "storage": "uint8_t",
</span><span class="cx"> "flags": ["ENUM"],
</span><span class="cx"> "values": ["ScrollUp", "ScrollDown", "ScrollLeft", "ScrollRight"],
</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 <conrad_shultz@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
+ from the page). As part of this:
+
+ 1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
+ set of plug-ins.
+
+ 2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
+ down the stack.
+
+ 3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
+ a concrete implementation thereof in WebPlatformStrategies in WebKit2.
+
+ 4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
+
+ While currently only used in a very limited manner, the new declarative plug-in policies are written generically
+ so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
+
+ * Plugins/WebBasePluginPackage.mm:
+ (-[WebBasePluginPackage getPluginInfoFromPLists]):
+ Set new members in PluginInfo.
+
+ * Plugins/WebNetscapePluginPackage.mm:
+ (-[WebNetscapePluginPackage getPluginInfoFromResources]):
+ Set new members in PluginInfo.
+
+ * WebCoreSupport/WebPlatformStrategies.h:
+ * WebCoreSupport/WebPlatformStrategies.mm:
+ (WebPlatformStrategies::getWebVisiblePluginInfo):
+ Override to wrap getPluginInfo().
+ (WebPlatformStrategies::setPluginLoadClientPolicy):
+ Override to do nothing.
+ (WebPlatformStrategies::clearPluginClientPolicies):
+ Ditto.
+
+ * WebView/WebFrame.mm:
+ (-[WebFrame _canProvideDocumentSource]):
+ Update to reflect function rename.
+
</ins><span class="cx"> 2015-03-14 Dean Jackson <dino@apple.com>
</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<WebCore::PluginInfo>&) override;
</span><ins>+ virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
+#if PLATFORM(MAC)
+ virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String&, const String&, const String&) override;
+ virtual void clearPluginClientPolicies() override;
+#endif
</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<PluginInfo>& plugins)
+{
+ getPluginInfo(page, plugins);
+}
+
+#if PLATFORM(MAC)
+void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy, const String&, const String&, const String&)
+{
+}
+
+void WebPlatformStrategies::clearPluginClientPolicies()
+{
+}
+#endif
+
</ins><span class="cx"> void WebPlatformStrategies::getTypes(Vector<String>& types, const String& 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 && pluginData->supportsMimeType(mimeType, PluginData::AllPlugins) && frame->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
- || (pluginData && pluginData->supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins)))
</del><ins>+ || (pluginData && pluginData->supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && frame->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
+ || (pluginData && pluginData->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 <conrad_shultz@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ * WebCoreSupport/WebPlatformStrategies.h:
+ * WebCoreSupport/WebPlatformStrategies.cpp:
+ (WebPlatformStrategies::getWebVisiblePluginInfo):
+ Wrap getPluginInfo();
+
+ * WebView.cpp:
+ (WebView::canShowMIMEType):
+ Update to reflect function rename.
+
</ins><span class="cx"> 2015-03-13 Commit Queue <commit-queue@webkit.org>
</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<PluginInfo>& 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<WebCore::PluginInfo>&);
</span><ins>+ virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&);
</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 && m_page) {
</span><del>- canShow = (m_page->pluginData().supportsMimeType(mimeType, PluginData::AllPlugins) && allowPlugins)
- || m_page->pluginData().supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins);
</del><ins>+ canShow = (m_page->pluginData().supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && allowPlugins)
+ || m_page->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 <conrad_shultz@apple.com>
+
+ Allow clients to selectively disable plug-ins
+ https://bugs.webkit.org/show_bug.cgi?id=142506
+
+ Reviewed by Anders Carlsson.
+
+ Add new functionality allow clients to declaratively disable individual plug-ins (in a manner that conceals them
+ from the page). As part of this:
+
+ 1) Introduce the concept of web-visible plug-ins and related concepts, as distinct from the real underlying
+ set of plug-ins.
+
+ 2) Where applicable, plumb additional information about plug-ins (specifically, bundle identification) deeper
+ down the stack.
+
+ 3) Add generic functionality to PluginStrategy to support filtering plug-ins for visibility and introduce
+ a concrete implementation thereof in WebPlatformStrategies in WebKit2.
+
+ 4) Add messaging infrastructure to allow clients to set and clear plug-in policies.
+
+ While currently only used in a very limited manner, the new declarative plug-in policies are written generically
+ so that they could be easily used in the future to reduce synchronous messaging to the client when loading plug-ins.
+
+ * Shared/Plugins/Netscape/mac/NetscapePluginModuleMac.mm:
+ (WebKit::NetscapePluginModule::getPluginInfo):
+ Set new PluginInfo members.
+
+ * Shared/WebCoreArgumentCoders.cpp:
+ (IPC::ArgumentCoder<PluginInfo>::encode):
+ Handle new PluginInfo members.
+ (IPC::ArgumentCoder<PluginInfo>::decode):
+ Ditto.
+
+ * Shared/WebProcessCreationParameters.h:
+ Declare a member to store client plug-in policies.
+
+ * Shared/WebProcessCreationParameters.cpp:
+ (WebKit::WebProcessCreationParameters::encode):
+ Encode the policies.
+ (WebKit::WebProcessCreationParameters::decode):
+ Decode the policies.
+
+ * UIProcess/API/C/WKAPICast.h:
+ (WebKit::toWKPluginLoadClientPolicy):
+ Teach how to cast between WebCore and WebKit2 policy definitions.
+ (WebKit::toPluginLoadClientPolicy):
+ Ditto.
+
+ * UIProcess/API/C/WKPluginLoadPolicy.h:
+ Declare WKPluginLoadClientPolicy, matching PluginLoadClientPolicy in WebCore.
+
+ * UIProcess/API/C/mac/WKContextPrivateMac.h:
+ * UIProcess/API/C/mac/WKContextPrivateMac.mm:
+ (WKContextSetPluginLoadClientPolicy):
+ New function; wrap WebProcessPool::setPluginLoadClientPolicy().
+ (WKContextClearPluginClientPolicies):
+ New function; wrap WebProcessPool::clearPluginClientPolicies().
+
+ * UIProcess/WebProcessPool.h:
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::createNewWebProcess):
+ Copy any client plug-in policies to the new process' creation parameters.
+ (WebKit::WebProcessPool::setPluginLoadClientPolicy):
+ Send SetPluginLoadClientPolicy to all processes and stash the passed-in policy info.
+ (WebKit::WebProcessPool::clearPluginClientPolicies):
+ Send ClearPluginClientPolicies to all processes and clear any stashed policy info.
+
+ * WebProcess/Plugins/PDF/PDFPlugin.mm:
+ (WebKit::PDFPlugin::pluginInfo):
+ Set new PluginInfo member.
+
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+ (WebKit::pluginSupportsExtension):
+ Adopt getWebVisibleMimesAndPluginIndices().
+ (WebKit::WebFrameLoaderClient::objectContentType):
+ Update to reflect reflect function rename.
+
+ * WebProcess/WebCoreSupport/WebPlatformStrategies.h:
+ * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
+ (WebKit::WebPlatformStrategies::getPluginInfo):
+ Pass the Page to populatePluginCache().
+ (WebKit::WebPlatformStrategies::getWebVisiblePluginInfo):
+ New member function; wrap getPluginInfo(); if appropriate, filter out plug-ins the client has asked
+ to block on the current page.
+ (WebKit::WebPlatformStrategies::setPluginLoadClientPolicy):
+ New member function; map empty inputs to a wildcard character and insert the new policy into the nested map.
+ (WebKit::WebPlatformStrategies::clearPluginClientPolicies):
+ New member function; empty m_hostsToPluginIdentifierData.
+ (WebKit::WebPlatformStrategies::pluginLoadClientPolicyForHost):
+ New member function; look up the most specific policy for the given plug-in and host.
+ (WebKit::WebPlatformStrategies::populatePluginCache):
+ If appropriate, set the client load policy on the plug-ins; do this irrespective of whether the cache has
+ been populated since the Page, and therefore host, may change.
+
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::canShowMIMEType):
+ Update to reflect function rename.
+
+ * WebProcess/WebProcess.h:
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::initializeWebProcess):
+ Enumerate and process the client plug-in policies in the creation parameters.
+ (WebKit::WebProcess::setPluginLoadClientPolicy):
+ New member function; wrap PluginStrategy::setPluginLoadClientPolicy.
+ (WebKit::WebProcess::clearPluginClientPolicies):
+ New member function; wrap PluginStrategy::clearPluginClientPolicies().
+
+ * WebProcess/WebProcess.messages.in:
+ Add messages for setting and clearing policies.
+
</ins><span class="cx"> 2015-03-16 Carlos Garcia Campos <cgarcia@igalia.com>
</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<PluginInfo>::encode(ArgumentEncoder& encoder, const PluginInfo& pluginInfo)
</span><span class="cx"> {
</span><del>- encoder << pluginInfo.name << pluginInfo.file << pluginInfo.desc << pluginInfo.mimes << pluginInfo.isApplicationPlugin;
</del><ins>+ encoder << pluginInfo.name;
+ encoder << pluginInfo.file;
+ encoder << pluginInfo.desc;
+ encoder << pluginInfo.mimes;
+ encoder << pluginInfo.isApplicationPlugin;
+ encoder.encodeEnum(pluginInfo.clientLoadPolicy);
+#if PLATFORM(MAC)
+ encoder << pluginInfo.bundleIdentifier;
+ encoder << pluginInfo.versionString;
+#endif
</ins><span class="cx"> }
</span><del>-
</del><ins>+
</ins><span class="cx"> bool ArgumentCoder<PluginInfo>::decode(ArgumentDecoder& decoder, PluginInfo& 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 << hasSelectionServices;
</span><span class="cx"> encoder << hasRichContentServices;
</span><span class="cx"> #endif
</span><ins>+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ encoder << pluginLoadClientPolicies;
+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool WebProcessCreationParameters::decode(IPC::ArgumentDecoder& decoder, WebProcessCreationParameters& 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<String, HashMap<String, HashMap<String, uint8_t>>> 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 "WebGrammarDetail.h"
</span><span class="cx"> #include <WebCore/Credential.h>
</span><span class="cx"> #include <WebCore/FrameLoaderTypes.h>
</span><ins>+#include <WebCore/PluginData.h>
</ins><span class="cx"> #include <WebCore/ProtectionSpace.h>
</span><span class="cx"> #include <WebCore/Settings.h>
</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 <WebKit/WKBase.h>
</span><ins>+#include <WebKit/WKPluginLoadPolicy.h>
</ins><span class="cx">
</span><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> extern "C" {
</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)->setPluginLoadClientPolicy(toPluginLoadClientPolicy(policy), toWTFString(host), toWTFString(bundleIdentifier), toWTFString(versionString));
+#endif
+}
+
+void WKContextClearPluginClientPolicies(WKContextRef contextRef)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ toImpl(contextRef)->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& host, const String& bundleIdentifier, const String& versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ HashMap<String, HashMap<String, uint8_t>> policiesByIdentifier;
+ if (m_pluginLoadClientPolicies.contains(host))
+ policiesByIdentifier = m_pluginLoadClientPolicies.get(host);
+
+ HashMap<String, uint8_t> versionsToPolicies;
+ if (policiesByIdentifier.contains(bundleIdentifier))
+ versionsToPolicies = policiesByIdentifier.get(bundleIdentifier);
+
+ versionsToPolicies.set(versionString, policy);
+ policiesByIdentifier.set(bundleIdentifier, versionsToPolicies);
+ m_pluginLoadClientPolicies.set(host, policiesByIdentifier);
</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&);
</span><span class="cx">
</span><span class="cx"> PluginInfoStore& pluginInfoStore() { return m_pluginInfoStore; }
</span><ins>+
+ void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& 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<String, String> m_encodedContentExtensions;
</span><span class="cx"> #endif
</span><ins>+
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ HashMap<String, HashMap<String, HashMap<String, uint8_t>>> m_pluginLoadClientPolicies;
+#endif
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename T>
</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 = "application/pdf";
</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 < pluginData.mimes().size(); ++i) {
- const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
</del><ins>+ Vector<MimeClassInfo> mimes;
+ Vector<size_t> mimePluginIndices;
+ pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
+ for (size_t i = 0; i < mimes.size(); ++i) {
+ const MimeClassInfo& mimeClassInfo = mimes[i];
</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->page()) {
</span><span class="cx"> const PluginData& pluginData = webPage->corePage()->pluginData();
</span><del>- if (pluginData.supportsMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</del><ins>+ if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->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 "WebProcess.h"
</span><span class="cx"> #include "WebProcessProxyMessages.h"
</span><span class="cx"> #include <WebCore/Color.h>
</span><ins>+#include <WebCore/DocumentLoader.h>
</ins><span class="cx"> #include <WebCore/IDBFactoryBackendInterface.h>
</span><span class="cx"> #include <WebCore/LoaderStrategy.h>
</span><span class="cx"> #include <WebCore/MainFrame.h>
</span><span class="lines">@@ -266,7 +267,8 @@
</span><span class="cx"> void WebPlatformStrategies::getPluginInfo(const WebCore::Page* page, Vector<WebCore::PluginInfo>& 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->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<PluginInfo>& plugins)
+{
+ ASSERT_ARG(page, page);
+ ASSERT_ARG(plugins, plugins.isEmpty());
+
+ getPluginInfo(page, plugins);
+
+#if PLATFORM(MAC)
+ for (int32_t i = plugins.size() - 1; i >= 0; --i) {
+ PluginInfo& info = plugins.at(i);
+ PluginLoadClientPolicy clientPolicy = info.clientLoadPolicy;
+ // Allow built-in plugins. Also tentatively allow plugins that the client might later selectively permit.
+ if (info.isApplicationPlugin || clientPolicy == PluginLoadClientPolicyAsk)
+ continue;
+
+ if (clientPolicy == PluginLoadClientPolicyBlock)
+ plugins.remove(i);
+ }
+#endif
+}
+
+#if PLATFORM(MAC)
+void WebPlatformStrategies::setPluginLoadClientPolicy(PluginLoadClientPolicy clientPolicy, const String& host, const String& bundleIdentifier, const String& versionString)
+{
+ String hostToSet = host.isNull() || !host.length() ? "*" : host;
+ String bundleIdentifierToSet = bundleIdentifier.isNull() || !bundleIdentifier.length() ? "*" : bundleIdentifier;
+ String versionStringToSet = versionString.isNull() || !versionString.length() ? "*" : versionString;
+
+ PluginPolicyMapsByIdentifier policiesByIdentifier;
+ if (m_hostsToPluginIdentifierData.contains(hostToSet))
+ policiesByIdentifier = m_hostsToPluginIdentifierData.get(hostToSet);
+
+ PluginLoadClientPoliciesByBundleVersion versionsToPolicies;
+ if (policiesByIdentifier.contains(bundleIdentifierToSet))
+ versionsToPolicies = policiesByIdentifier.get(bundleIdentifierToSet);
+
+ versionsToPolicies.set(versionStringToSet, clientPolicy);
+ policiesByIdentifier.set(bundleIdentifierToSet, versionsToPolicies);
+ m_hostsToPluginIdentifierData.set(hostToSet, policiesByIdentifier);
+}
+
+void WebPlatformStrategies::clearPluginClientPolicies()
+{
+ m_hostsToPluginIdentifierData.clear();
+}
+
+#endif
+
</ins><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span><del>-void WebPlatformStrategies::populatePluginCache()
</del><ins>+#if PLATFORM(MAC)
+bool WebPlatformStrategies::pluginLoadClientPolicyForHost(const String& host, const PluginInfo& info, PluginLoadClientPolicy& policy) const
</ins><span class="cx"> {
</span><del>- if (m_pluginCacheIsPopulated)
- return;
</del><ins>+ String hostToLookUp = host;
+ if (!m_hostsToPluginIdentifierData.contains(hostToLookUp))
+ hostToLookUp = "*";
+ 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()->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 = "*";
+ 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 = "*";
+ 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& page)
+{
+ if (!m_pluginCacheIsPopulated) {
+ if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins), Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins), 0))
+ return;
+
+ m_shouldRefreshPlugins = false;
+ m_pluginCacheIsPopulated = true;
+ }
+
+#if PLATFORM(MAC)
+ String pageHost = page.mainFrame().loader().documentLoader()->responseURL().host();
+ for (PluginInfo& info : m_cachedPlugins) {
+ PluginLoadClientPolicy clientPolicy;
+ if (pluginLoadClientPolicyForHost(pageHost, info, clientPolicy))
+ info.clientLoadPolicy = clientPolicy;
+ }
+#else
+ UNUSED_PARAM(page);
+#endif // not PLATFORM(MAC)
+}
</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 <WebCore/PasteboardStrategy.h>
</span><span class="cx"> #include <WebCore/PlatformStrategies.h>
</span><span class="cx"> #include <WebCore/PluginStrategy.h>
</span><ins>+#include <wtf/HashMap.h>
</ins><span class="cx"> #include <wtf/NeverDestroyed.h>
</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<WebCore::PluginInfo>&) override;
</span><ins>+ virtual void getWebVisiblePluginInfo(const WebCore::Page*, Vector<WebCore::PluginInfo>&) override;
</ins><span class="cx">
</span><ins>+#if PLATFORM(MAC)
+ typedef HashMap<String, WebCore::PluginLoadClientPolicy> PluginLoadClientPoliciesByBundleVersion;
+ typedef HashMap<String, PluginLoadClientPoliciesByBundleVersion> PluginPolicyMapsByIdentifier;
+
+ virtual void setPluginLoadClientPolicy(WebCore::PluginLoadClientPolicy, const String& host, const String& bundleIdentifier, const String& versionString) override;
+ virtual void clearPluginClientPolicies() override;
+#endif
+
</ins><span class="cx"> // WebCore::PasteboardStrategy
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> virtual void writeToPasteboard(const WebCore::PasteboardWebContent&) 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&);
</ins><span class="cx"> bool m_pluginCacheIsPopulated;
</span><span class="cx"> bool m_shouldRefreshPlugins;
</span><span class="cx"> Vector<WebCore::PluginInfo> m_cachedPlugins;
</span><span class="cx"> Vector<WebCore::PluginInfo> m_cachedApplicationPlugins;
</span><ins>+
+#if PLATFORM(MAC)
+ HashMap<String, PluginPolicyMapsByIdentifier> m_hostsToPluginIdentifierData;
+ bool pluginLoadClientPolicyForHost(const String&, const WebCore::PluginInfo&, WebCore::PluginLoadClientPolicy&) 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& pluginData = m_page->pluginData();
</span><del>- if (pluginData.supportsMimeType(MIMEType, PluginData::AllPlugins) && corePage()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
</del><ins>+ if (pluginData.supportsWebVisibleMimeType(MIMEType, PluginData::AllPlugins) && corePage()->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) && PLATFORM(MAC)
+ for (auto hostIter = parameters.pluginLoadClientPolicies.begin(); hostIter != parameters.pluginLoadClientPolicies.end(); ++hostIter) {
+ for (auto bundleIdentifierIter = hostIter->value.begin(); bundleIdentifierIter != hostIter->value.end(); ++bundleIdentifierIter) {
+ for (auto versionIter = bundleIdentifierIter->value.begin(); versionIter != bundleIdentifierIter->value.end(); ++versionIter)
+ platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(versionIter->value), hostIter->key, bundleIdentifierIter->key, versionIter->key);
+ }
+ }
+#endif
</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()->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& host, const String& bundleIdentifier, const String& versionString)
+{
+#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
+ platformStrategies()->pluginStrategy()->setPluginLoadClientPolicy(static_cast<PluginLoadClientPolicy>(policy), host, bundleIdentifier, versionString);
+#endif
+}
+
+void WebProcess::clearPluginClientPolicies()
+{
+#if ENABLE(NETSCAPE_PLUGIN_API) && PLATFORM(MAC)
+ platformStrategies()->pluginStrategy()->clearPluginClientPolicies();
+#endif
+}
+
</ins><span class="cx"> static void fromCountedSetToHashMap(TypeCountSet* countedSet, HashMap<String, uint64_t>& map)
</span><span class="cx"> {
</span><span class="cx"> TypeCountSet::const_iterator end = countedSet->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&, const String& pageOrigin, const String& pluginOrigin, const String& mimeType);
</span><span class="cx"> void plugInDidStartFromOrigin(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID);
</span><span class="cx"> void plugInDidReceiveUserInteraction(const String& pageOrigin, const String& pluginOrigin, const String& mimeType, WebCore::SessionID);
</span><ins>+ void setPluginLoadClientPolicy(uint8_t policy, const String& host, const String& bundleIdentifier, const String& 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<uint32_t,double> hashes)
</span><span class="cx"> ResetPlugInAutoStartOriginHashes(HashMap<WebCore::SessionID, HashMap<uint32_t,double>> 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>