Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.


Canonical link: https://commits.webkit.org/160741@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@181562 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
shultzc committed Mar 16, 2015
1 parent e86f240 commit bb161b5
Show file tree
Hide file tree
Showing 44 changed files with 825 additions and 107 deletions.
131 changes: 131 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,134 @@
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.

2015-03-16 Max Stepin <maxstepin@gmail.com>

Add APNG support
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/dom/DOMImplementation.cpp
Expand Up @@ -329,7 +329,7 @@ RefPtr<Document> DOMImplementation::createDocument(const String& type, Frame* fr

// PDF is one image type for which a plugin can override built-in support.
// We do not want QuickTime to take over all image types, obviously.
if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->supportsMimeType(type, allowedPluginTypes))
if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(type) && pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes))
return PluginDocument::create(frame, url);
if (Image::supportsType(type))
return ImageDocument::create(*frame, url);
Expand All @@ -348,7 +348,7 @@ RefPtr<Document> DOMImplementation::createDocument(const String& type, Frame* fr
// Everything else except text/plain can be overridden by plugins. In particular, Adobe SVG Viewer should be used for SVG, if installed.
// Disallowing plug-ins to use text/plain prevents plug-ins from hijacking a fundamental type that the browser is expected to handle,
// and also serves as an optimization to prevent loading the plug-in database in the common case.
if (type != "text/plain" && ((pluginData && pluginData->supportsMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
if (type != "text/plain" && ((pluginData && pluginData->supportsWebVisibleMimeType(type, allowedPluginTypes)) || (frame && frame->loader().client().shouldAlwaysUsePluginDocument(type))))
return PluginDocument::create(frame, url);
if (isTextMIMEType(type))
return TextDocument::create(frame, url);
Expand Down
11 changes: 7 additions & 4 deletions Source/WebCore/loader/SubframeLoader.cpp
Expand Up @@ -167,8 +167,11 @@ static String findPluginMIMETypeFromURL(Page* page, const String& url)

const PluginData& pluginData = page->pluginData();

for (size_t i = 0; i < pluginData.mimes().size(); ++i) {
const MimeClassInfo& mimeClassInfo = pluginData.mimes()[i];
Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
pluginData.getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (size_t i = 0; i < mimes.size(); ++i) {
const MimeClassInfo& mimeClassInfo = mimes[i];
for (size_t j = 0; j < mimeClassInfo.extensions.size(); ++j) {
if (equalIgnoringCase(extension, mimeClassInfo.extensions[j]))
return mimeClassInfo.type;
Expand All @@ -191,7 +194,7 @@ static void logPluginRequest(Page* page, const String& mimeType, const String& u
return;
}

String pluginFile = page->pluginData().pluginFileForMimeType(newMIMEType);
String pluginFile = page->pluginData().pluginFileForWebVisibleMimeType(newMIMEType);
String description = !pluginFile ? newMIMEType : pluginFile;

DiagnosticLoggingClient& diagnosticLoggingClient = page->mainFrame().diagnosticLoggingClient();
Expand Down Expand Up @@ -367,7 +370,7 @@ bool SubframeLoader::shouldUsePlugin(const URL& url, const String& mimeType, boo
// Allow other plug-ins to win over QuickTime because if the user has installed a plug-in that
// can handle TIFF (which QuickTime can also handle) they probably intended to override QT.
if (m_frame.page() && (mimeType == "image/tiff" || mimeType == "image/tif" || mimeType == "image/x-tiff")) {
String pluginName = m_frame.page()->pluginData().pluginNameForMimeType(mimeType);
String pluginName = m_frame.page()->pluginData().pluginNameForWebVisibleMimeType(mimeType);
if (!pluginName.isEmpty() && !pluginName.contains("QuickTime", false))
return true;
}
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/platform/PlatformStrategies.h
Expand Up @@ -88,7 +88,7 @@ class PlatformStrategies {
PluginStrategy* m_pluginStrategy;
};

PlatformStrategies* platformStrategies();
WEBCORE_EXPORT PlatformStrategies* platformStrategies();
WEBCORE_EXPORT void setPlatformStrategies(PlatformStrategies*);
bool hasPlatformStrategies();

Expand Down
17 changes: 14 additions & 3 deletions Source/WebCore/plugins/DOMMimeType.cpp
Expand Up @@ -42,7 +42,7 @@ DOMMimeType::~DOMMimeType()
{
}

const String &DOMMimeType::type() const
String DOMMimeType::type() const
{
return mimeClassInfo().type;
}
Expand All @@ -60,17 +60,28 @@ String DOMMimeType::suffixes() const
return builder.toString();
}

const String &DOMMimeType::description() const
String DOMMimeType::description() const
{
return mimeClassInfo().desc;
}

MimeClassInfo DOMMimeType::mimeClassInfo() const
{
Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
return mimes[m_index];
}

PassRefPtr<DOMPlugin> DOMMimeType::enabledPlugin() const
{
if (!m_frame || !m_frame->page() || !m_frame->page()->mainFrame().loader().subframeLoader().allowPlugins(NotAboutToInstantiatePlugin))
return 0;

return DOMPlugin::create(m_pluginData.get(), m_frame, m_pluginData->mimePluginIndices()[m_index]);
Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
return DOMPlugin::create(m_pluginData.get(), m_frame, mimePluginIndices[m_index]);
}

} // namespace WebCore
6 changes: 3 additions & 3 deletions Source/WebCore/plugins/DOMMimeType.h
Expand Up @@ -37,13 +37,13 @@ class DOMMimeType : public RefCounted<DOMMimeType>, public FrameDestructionObser
static Ref<DOMMimeType> create(PassRefPtr<PluginData> pluginData, Frame* frame, unsigned index) { return adoptRef(*new DOMMimeType(pluginData, frame, index)); }
~DOMMimeType();

const String &type() const;
String type() const;
String suffixes() const;
const String &description() const;
String description() const;
PassRefPtr<DOMPlugin> enabledPlugin() const;

private:
const MimeClassInfo& mimeClassInfo() const { return m_pluginData->mimes()[m_index]; }
MimeClassInfo mimeClassInfo() const;

DOMMimeType(PassRefPtr<PluginData>, Frame*, unsigned index);
RefPtr<PluginData> m_pluginData;
Expand Down
22 changes: 18 additions & 4 deletions Source/WebCore/plugins/DOMMimeTypeArray.cpp
Expand Up @@ -48,15 +48,23 @@ unsigned DOMMimeTypeArray::length() const
PluginData* data = getPluginData();
if (!data)
return 0;
return data->mimes().size();

Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
return mimes.size();
}

PassRefPtr<DOMMimeType> DOMMimeTypeArray::item(unsigned index)
{
PluginData* data = getPluginData();
if (!data)
return 0;
const Vector<MimeClassInfo>& mimes = data->mimes();

Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);

if (index >= mimes.size())
return 0;
return DOMMimeType::create(data, m_frame, index);
Expand All @@ -67,7 +75,10 @@ bool DOMMimeTypeArray::canGetItemsForName(const AtomicString& propertyName)
PluginData *data = getPluginData();
if (!data)
return 0;
const Vector<MimeClassInfo>& mimes = data->mimes();

Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i) {
if (mimes[i].type == propertyName)
return true;
Expand All @@ -80,7 +91,10 @@ PassRefPtr<DOMMimeType> DOMMimeTypeArray::namedItem(const AtomicString& property
PluginData *data = getPluginData();
if (!data)
return 0;
const Vector<MimeClassInfo>& mimes = data->mimes();

Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
data->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i) {
if (mimes[i].type == propertyName)
return DOMMimeType::create(data, m_frame, i);
Expand Down
21 changes: 16 additions & 5 deletions Source/WebCore/plugins/DOMPlugin.cpp
Expand Up @@ -56,24 +56,33 @@ unsigned DOMPlugin::length() const
return pluginInfo().mimes.size();
}

PluginInfo DOMPlugin::pluginInfo() const
{
return m_pluginData->webVisiblePlugins()[m_index];
}

PassRefPtr<DOMMimeType> DOMPlugin::item(unsigned index)
{
if (index >= pluginInfo().mimes.size())
return 0;

const MimeClassInfo& mime = pluginInfo().mimes[index];
MimeClassInfo mime = pluginInfo().mimes[index];

const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i) {
if (mimes[i] == mime && m_pluginData->mimePluginIndices()[i] == m_index)
if (mimes[i] == mime && mimePluginIndices[i] == m_index)
return DOMMimeType::create(m_pluginData.get(), m_frame, i);
}
return 0;
}

bool DOMPlugin::canGetItemsForName(const AtomicString& propertyName)
{
const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i)
if (mimes[i].type == propertyName)
return true;
Expand All @@ -82,7 +91,9 @@ bool DOMPlugin::canGetItemsForName(const AtomicString& propertyName)

PassRefPtr<DOMMimeType> DOMPlugin::namedItem(const AtomicString& propertyName)
{
const Vector<MimeClassInfo>& mimes = m_pluginData->mimes();
Vector<MimeClassInfo> mimes;
Vector<size_t> mimePluginIndices;
m_pluginData->getWebVisibleMimesAndPluginIndices(mimes, mimePluginIndices);
for (unsigned i = 0; i < mimes.size(); ++i)
if (mimes[i].type == propertyName)
return DOMMimeType::create(m_pluginData.get(), m_frame, i);
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/plugins/DOMPlugin.h
Expand Up @@ -48,7 +48,7 @@ class DOMPlugin : public ScriptWrappable, public RefCounted<DOMPlugin>, public F
PassRefPtr<DOMMimeType> namedItem(const AtomicString& propertyName);

private:
const PluginInfo& pluginInfo() const { return m_pluginData->plugins()[m_index]; }
PluginInfo pluginInfo() const;

DOMPlugin(PluginData*, Frame*, unsigned index);
RefPtr<PluginData> m_pluginData;
Expand Down
12 changes: 8 additions & 4 deletions Source/WebCore/plugins/DOMPluginArray.cpp
Expand Up @@ -48,15 +48,17 @@ unsigned DOMPluginArray::length() const
PluginData* data = pluginData();
if (!data)
return 0;
return data->plugins().size();

return data->webVisiblePlugins().size();
}

PassRefPtr<DOMPlugin> DOMPluginArray::item(unsigned index)
{
PluginData* data = pluginData();
if (!data)
return 0;
const Vector<PluginInfo>& plugins = data->plugins();

const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
if (index >= plugins.size())
return 0;
return DOMPlugin::create(data, m_frame, index);
Expand All @@ -67,7 +69,8 @@ bool DOMPluginArray::canGetItemsForName(const AtomicString& propertyName)
PluginData* data = pluginData();
if (!data)
return 0;
const Vector<PluginInfo>& plugins = data->plugins();

const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
for (unsigned i = 0; i < plugins.size(); ++i) {
if (plugins[i].name == propertyName)
return true;
Expand All @@ -80,7 +83,8 @@ PassRefPtr<DOMPlugin> DOMPluginArray::namedItem(const AtomicString& propertyName
PluginData* data = pluginData();
if (!data)
return 0;
const Vector<PluginInfo>& plugins = data->plugins();

const Vector<PluginInfo>& plugins = data->webVisiblePlugins();
for (unsigned i = 0; i < plugins.size(); ++i) {
if (plugins[i].name == propertyName)
return DOMPlugin::create(data, m_frame, i);
Expand Down

0 comments on commit bb161b5

Please sign in to comment.