| Index: chrome/renderer/render_view.cc
|
| diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
|
| index fcaa65aab92887db3a6310ebebcd8cc559892233..9ddedf3081b57bf855749bf9598f6a6bb837915e 100644
|
| --- a/chrome/renderer/render_view.cc
|
| +++ b/chrome/renderer/render_view.cc
|
| @@ -31,8 +31,10 @@
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/jstemplate_builder.h"
|
| +#include "chrome/common/notification_service.h"
|
| #include "chrome/common/page_zoom.h"
|
| #include "chrome/common/pepper_plugin_registry.h"
|
| +#include "chrome/common/plugin_group.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "chrome/common/renderer_preferences.h"
|
| #include "chrome/common/thumbnail_score.h"
|
| @@ -683,6 +685,7 @@ void RenderView::OnMessageReceived(const IPC::Message& message) {
|
| IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
|
| IPC_MESSAGE_HANDLER(ViewMsg_SetAltErrorPageURL, OnSetAltErrorPageURL)
|
| IPC_MESSAGE_HANDLER(ViewMsg_InstallMissingPlugin, OnInstallMissingPlugin)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_LoadBlockedPlugins, OnLoadBlockedPlugins)
|
| IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
|
| IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
|
| IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage,
|
| @@ -2297,11 +2300,53 @@ void RenderView::runModal() {
|
|
|
| WebPlugin* RenderView::createPlugin(WebFrame* frame,
|
| const WebPluginParams& params) {
|
| - if (AllowContentType(CONTENT_SETTINGS_TYPE_PLUGINS))
|
| - return CreatePluginInternal(frame, params);
|
| + bool found = false;
|
| + WebPluginInfo info;
|
| + GURL url(params.url);
|
| + std::string mime_type(params.mimeType.utf8());
|
| + std::string actual_mime_type;
|
| + Send(new ViewHostMsg_GetPluginInfo(url,
|
| + frame->top()->url(),
|
| + mime_type,
|
| + &found,
|
| + &info,
|
| + &actual_mime_type));
|
| +
|
| + if (!found)
|
| + return NULL;
|
| +
|
| + scoped_ptr<PluginGroup> group(PluginGroup::FindHardcodedPluginGroup(info));
|
| + group->AddPlugin(info, 0);
|
|
|
| - didNotAllowPlugins(frame);
|
| - return CreatePluginPlaceholder(frame, params);
|
| + if (!info.enabled) {
|
| + if (group->IsVulnerable() && CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kDisableOutdatedPlugins)) {
|
| + Send(new ViewHostMsg_DisabledOutdatedPlugin(routing_id_,
|
| + group->GetGroupName(),
|
| + GURL(group->GetUpdateURL())));
|
| + return CreatePluginPlaceholder(frame, params, group.get());
|
| + }
|
| + return NULL;
|
| + }
|
| +
|
| + if (info.path.value() != kDefaultPluginLibraryName) {
|
| + if (!AllowContentType(CONTENT_SETTINGS_TYPE_PLUGINS)) {
|
| + didNotAllowPlugins(frame);
|
| + return CreatePluginPlaceholder(frame, params, NULL);
|
| + }
|
| + scoped_refptr<pepper::PluginModule> pepper_module =
|
| + PepperPluginRegistry::GetInstance()->GetModule(info.path);
|
| + if (pepper_module) {
|
| + return CreatePepperPlugin(pepper_module.get(), params);
|
| + }
|
| + if (CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kBlockNonSandboxedPlugins)) {
|
| + Send(new ViewHostMsg_NonSandboxedPluginBlocked(routing_id_,
|
| + group->GetGroupName()));
|
| + return CreatePluginPlaceholder(frame, params, NULL);
|
| + }
|
| + }
|
| + return CreateNPAPIPlugin(frame, params, &info, actual_mime_type);
|
| }
|
|
|
| WebWorker* RenderView::createWorker(WebFrame* frame, WebWorkerClient* client) {
|
| @@ -3727,36 +3772,47 @@ void RenderView::ClearBlockedContentSettings() {
|
| content_blocked_[i] = false;
|
| }
|
|
|
| -WebPlugin* RenderView::CreatePluginInternal(WebFrame* frame,
|
| - const WebPluginParams& params) {
|
| - FilePath path;
|
| - std::string actual_mime_type;
|
| - render_thread_->Send(new ViewHostMsg_GetPluginPath(
|
| - params.url, frame->top()->url(), params.mimeType.utf8(), &path,
|
| - &actual_mime_type));
|
| - if (path.value().empty())
|
| +WebPlugin* RenderView::CreatePepperPlugin(pepper::PluginModule* pepper_module,
|
| + const WebPluginParams& params) {
|
| + return new pepper::WebPluginImpl(pepper_module, params,
|
| + pepper_delegate_.AsWeakPtr());
|
| +}
|
| +
|
| +
|
| +WebPlugin* RenderView::CreateNPAPIPlugin(WebFrame* frame,
|
| + const WebPluginParams& params,
|
| + WebPluginInfo* plugin_info,
|
| + const std::string& mime_type) {
|
| + std::string actual_mime_type(mime_type);
|
| + WebPluginInfo plugin;
|
| + if (plugin_info != NULL) {
|
| + plugin = *plugin_info;
|
| + } else {
|
| + bool found;
|
| + std::string actual_mime_type(mime_type);
|
| + Send(new ViewHostMsg_GetPluginInfo(
|
| + params.url, frame->top()->url(), params.mimeType.utf8(), &found,
|
| + &plugin, &actual_mime_type));
|
| + if (!found)
|
| + plugin.enabled = false;
|
| + }
|
| + if (!plugin.enabled)
|
| return NULL;
|
|
|
| if (actual_mime_type.empty())
|
| actual_mime_type = params.mimeType.utf8();
|
| -
|
| - scoped_refptr<pepper::PluginModule> pepper_module =
|
| - PepperPluginRegistry::GetInstance()->GetModule(path);
|
| - if (pepper_module) {
|
| - return new pepper::WebPluginImpl(pepper_module, params,
|
| - pepper_delegate_.AsWeakPtr());
|
| - }
|
| -
|
| - return new webkit_glue::WebPluginImpl(frame, params, path, actual_mime_type,
|
| - AsWeakPtr());
|
| + return new webkit_glue::WebPluginImpl(frame, params, plugin.path,
|
| + actual_mime_type, AsWeakPtr());
|
| }
|
|
|
| WebPlugin* RenderView::CreatePluginPlaceholder(WebFrame* frame,
|
| - const WebPluginParams& params) {
|
| + const WebPluginParams& params,
|
| + PluginGroup* group) {
|
| // |blocked_plugin| will delete itself when the WebViewPlugin is destroyed.
|
| - BlockedPlugin* blocked_plugin = new BlockedPlugin(this, frame, params);
|
| + BlockedPlugin* blocked_plugin = new BlockedPlugin(this, frame, params, group);
|
| WebViewPlugin* plugin = blocked_plugin->plugin();
|
| - webkit_preferences_.Apply(plugin->web_view());
|
| + WebView* web_view = plugin->web_view();
|
| + webkit_preferences_.Apply(web_view);
|
| return plugin;
|
| }
|
|
|
| @@ -4011,6 +4067,12 @@ void RenderView::OnInstallMissingPlugin() {
|
| first_default_plugin_->InstallMissingPlugin();
|
| }
|
|
|
| +void RenderView::OnLoadBlockedPlugins() {
|
| + NotificationService::current()->Notify(NotificationType::SHOULD_LOAD_PLUGINS,
|
| + Source<RenderView>(this),
|
| + NotificationService::NoDetails());
|
| +}
|
| +
|
| void RenderView::OnFileChooserResponse(const std::vector<FilePath>& paths) {
|
| // This could happen if we navigated to a different page before the user
|
| // closed the chooser.
|
|
|