WebPluginInfoProvider.cpp [plain text]
#include "config.h"
#include "WebPluginInfoProvider.h"
#include "HangDetectionDisabler.h"
#include "WebCoreArgumentCoders.h"
#include "WebProcess.h"
#include "WebProcessProxyMessages.h"
#include <WebCore/Document.h>
#include <WebCore/DocumentLoader.h>
#include <WebCore/Frame.h>
#include <WebCore/FrameLoader.h>
#include <WebCore/LegacySchemeRegistry.h>
#include <WebCore/Page.h>
#include <WebCore/Settings.h>
#include <wtf/text/StringHash.h>
#if PLATFORM(MAC)
#include <WebCore/StringUtilities.h>
#endif
namespace WebKit {
using namespace WebCore;
WebPluginInfoProvider& WebPluginInfoProvider::singleton()
{
static WebPluginInfoProvider& pluginInfoProvider = adoptRef(*new WebPluginInfoProvider).leakRef();
return pluginInfoProvider;
}
WebPluginInfoProvider::WebPluginInfoProvider()
{
}
WebPluginInfoProvider::~WebPluginInfoProvider()
{
}
void WebPluginInfoProvider::refreshPlugins()
{
#if ENABLE(NETSCAPE_PLUGIN_API)
m_cachedPlugins.clear();
m_pluginCacheIsPopulated = false;
m_shouldRefreshPlugins = true;
#endif
}
Vector<PluginInfo> WebPluginInfoProvider::pluginInfo(Page& page, Optional<Vector<SupportedPluginIdentifier>>& supportedPluginIdentifiers)
{
#if ENABLE(NETSCAPE_PLUGIN_API)
populatePluginCache(page);
if (m_cachedSupportedPluginIdentifiers)
supportedPluginIdentifiers = *m_cachedSupportedPluginIdentifiers;
return page.mainFrame().arePluginsEnabled() ? m_cachedPlugins : m_cachedApplicationPlugins;
#else
UNUSED_PARAM(page);
UNUSED_PARAM(supportedPluginIdentifiers);
return { };
#endif // ENABLE(NETSCAPE_PLUGIN_API)
}
Vector<WebCore::PluginInfo> WebPluginInfoProvider::webVisiblePluginInfo(Page& page, const URL& url)
{
Optional<Vector<WebCore::SupportedPluginIdentifier>> supportedPluginIdentifiers;
auto plugins = pluginInfo(page, supportedPluginIdentifiers);
plugins.removeAllMatching([&] (auto& plugin) {
return supportedPluginIdentifiers && !isSupportedPlugin(*supportedPluginIdentifiers, url, plugin.bundleIdentifier);
});
#if PLATFORM(MAC)
if (LegacySchemeRegistry::shouldTreatURLSchemeAsLocal(url.protocol().toString()))
return plugins;
for (int32_t i = plugins.size() - 1; i >= 0; --i) {
auto& info = plugins.at(i);
if (info.isApplicationPlugin || info.clientLoadPolicy == WebCore::PluginLoadClientPolicy::Ask)
continue;
if (info.clientLoadPolicy == WebCore::PluginLoadClientPolicy::Block)
plugins.remove(i);
}
#endif
return plugins;
}
#if ENABLE(NETSCAPE_PLUGIN_API)
void WebPluginInfoProvider::populatePluginCache(const WebCore::Page&)
{
if (!m_pluginCacheIsPopulated) {
#if PLATFORM(COCOA)
bool shouldScanPlugins = true;
#else
bool shouldScanPlugins = page.mainFrame().arePluginsEnabled();
#endif
if (shouldScanPlugins) {
HangDetectionDisabler hangDetectionDisabler;
if (!WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebProcessProxy::GetPlugins(m_shouldRefreshPlugins),
Messages::WebProcessProxy::GetPlugins::Reply(m_cachedPlugins, m_cachedApplicationPlugins, m_cachedSupportedPluginIdentifiers), 0))
return;
}
m_shouldRefreshPlugins = false;
m_pluginCacheIsPopulated = true;
}
}
#endif
}