Chromium Code Reviews| Index: chrome/renderer/chrome_content_renderer_client.cc |
| diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc |
| index 1e97675850ea5241a799911b6efde067d743631a..545d5749039d364e8dd98276405d436c517e2bed 100644 |
| --- a/chrome/renderer/chrome_content_renderer_client.cc |
| +++ b/chrome/renderer/chrome_content_renderer_client.cc |
| @@ -265,39 +265,55 @@ std::string ChromeContentRendererClient::GetDefaultEncoding() { |
| } |
| bool ChromeContentRendererClient::OverrideCreatePlugin( |
| - RenderView* render_view, |
| - WebFrame* frame, |
| - const WebPluginParams& params, |
| - WebKit::WebPlugin** plugin) { |
| - bool is_default_plugin; |
| - *plugin = CreatePlugin(render_view, frame, params, &is_default_plugin); |
| - if (!*plugin || is_default_plugin) |
| - MissingPluginReporter::GetInstance()->ReportPluginMissing( |
| - params.mimeType.utf8(), params.url); |
| + RenderView* render_view, |
| + WebFrame* frame, |
| + const WebPluginParams& params, |
| + WebKit::WebPlugin** plugin) { |
| + *plugin = CreatePlugin(render_view, frame, params); |
| return true; |
| } |
| WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| - RenderView* render_view, |
| - WebFrame* frame, |
| - const WebPluginParams& original_params, |
| - bool* is_default_plugin) { |
| - *is_default_plugin = false; |
| + RenderView* render_view, |
| + WebFrame* frame, |
| + const WebPluginParams& original_params) { |
| CommandLine* cmd = CommandLine::ForCurrentProcess(); |
| - webkit::WebPluginInfo info; |
| GURL url(original_params.url); |
| std::string orig_mime_type = original_params.mimeType.utf8(); |
| - std::string actual_mime_type; |
| - |
| - bool found = render_view->GetPluginInfo( |
| - url, frame->top()->document().url(), orig_mime_type, &info, |
| - &actual_mime_type); |
| + std::vector<webkit::WebPluginInfo> plugins; |
| + std::vector<std::string> mime_types; |
| + std::vector<bool> allowed; |
| + render_view->GetMatchingPlugins( |
| + url, frame->top()->document().url(), orig_mime_type, |
| + &plugins, &mime_types, &allowed); |
| - if (!found) |
| - return NULL; |
| + webkit::WebPluginInfo info; |
| + std::string actual_mime_type; |
| + if (plugins.empty()) { |
| + MissingPluginReporter::GetInstance()->ReportPluginMissing( |
| + orig_mime_type, url); |
| + return CreatePluginPlaceholder( |
| + render_view, frame, original_params, NULL, IDR_BLOCKED_PLUGIN_HTML, |
| + IDS_PLUGIN_NOT_FOUND, false, false); |
| + } else { |
| + bool plugin_allowed = false; |
| + for (size_t i = 0; i < plugins.size(); ++i) { |
| + plugin_allowed = allowed[i]; |
| + if (i == 0 || plugin_allowed) { |
|
jam
2011/09/27 16:51:34
it's not clear to me why you do this, i.e. why the
Bernhard Bauer
2011/09/27 21:21:39
I want to differentiate between the case where the
jam
2011/09/29 01:03:32
Since content's renderer side doesn't care about g
Bernhard Bauer
2011/09/29 13:20:47
Ok, that sounds good. Then we can also do addition
jam
2011/09/29 16:31:10
yep sounds good.
|
| + info = plugins[i]; |
| + actual_mime_type = mime_types[i]; |
| + } |
| + if (plugin_allowed) |
| + break; |
| + } |
| + if (!plugin_allowed) |
| + return NULL; // TODO(bauerb): Show placeholder for disabled plug-in. |
| + } |
| - *is_default_plugin = |
| - info.path.value() == webkit::npapi::kDefaultPluginLibraryName; |
| + if (info.path.value() == webkit::npapi::kDefaultPluginLibraryName) { |
| + MissingPluginReporter::GetInstance()->ReportPluginMissing( |
| + orig_mime_type, url); |
| + } |
| if (orig_mime_type == actual_mime_type) { |
| UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch, |
| @@ -364,7 +380,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| GURL(group->GetUpdateURL()))); |
| } |
| return CreatePluginPlaceholder( |
| - render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, |
| + render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| IDS_PLUGIN_OUTDATED, false, outdated_policy == CONTENT_SETTING_ASK); |
| } else { |
| DCHECK(outdated_policy == CONTENT_SETTING_ALLOW); |
| @@ -383,7 +399,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| render_view->Send(new ChromeViewHostMsg_BlockedOutdatedPlugin( |
| render_view->routing_id(), group->GetGroupName(), GURL())); |
| return CreatePluginPlaceholder( |
| - render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, |
| + render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| IDS_PLUGIN_NOT_AUTHORIZED, false, true); |
| } |
| @@ -401,8 +417,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| // Delay loading plugins if prerendering. |
| if (prerender::PrerenderHelper::IsPrerendering(render_view)) { |
| return CreatePluginPlaceholder( |
| - render_view, frame, params, *group, IDR_CLICK_TO_PLAY_PLUGIN_HTML, |
| - IDS_PLUGIN_LOAD, true, true); |
| + render_view, frame, params, group.get(), |
| + IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, true, true); |
| } |
| // Enforce the Chrome WebStore restriction on the Native Client plugin. |
| @@ -450,7 +466,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| // TODO(bbudge) Webkit will crash if this is a full-frame plug-in and |
| // we return NULL. Prepare a patch to fix that, and return NULL here. |
| return CreatePluginPlaceholder( |
| - render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, |
| + render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| IDS_PLUGIN_BLOCKED, false, false); |
| } |
| } |
| @@ -475,12 +491,12 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| if (plugin_setting == CONTENT_SETTING_ASK) { |
| RenderThread::RecordUserMetrics("Plugin_ClickToPlay"); |
| return CreatePluginPlaceholder( |
| - render_view, frame, params, *group, IDR_CLICK_TO_PLAY_PLUGIN_HTML, |
| + render_view, frame, params, group.get(), IDR_CLICK_TO_PLAY_PLUGIN_HTML, |
| IDS_PLUGIN_LOAD, false, true); |
| } else { |
| RenderThread::RecordUserMetrics("Plugin_Blocked"); |
| return CreatePluginPlaceholder( |
| - render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, |
| + render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| IDS_PLUGIN_BLOCKED, false, true); |
| } |
| } |
| @@ -489,22 +505,30 @@ WebPlugin* ChromeContentRendererClient::CreatePluginPlaceholder( |
| RenderView* render_view, |
| WebFrame* frame, |
| const WebPluginParams& params, |
| - const webkit::npapi::PluginGroup& group, |
| + const webkit::npapi::PluginGroup* group, |
| int resource_id, |
| int message_id, |
| bool is_blocked_for_prerendering, |
| bool allow_loading) { |
| // |blocked_plugin| will delete itself when the WebViewPlugin |
| // is destroyed. |
| + string16 name; |
| + string16 message; |
| + if (group) { |
| + name = group->GetGroupName(); |
| + message = l10n_util::GetStringFUTF16(message_id, name); |
| + } else { |
| + message = l10n_util::GetStringUTF16(message_id); |
| + } |
| + |
| BlockedPlugin* blocked_plugin = |
| new BlockedPlugin(render_view, |
| frame, |
| - group, |
| params, |
| render_view->webkit_preferences(), |
| resource_id, |
| - l10n_util::GetStringFUTF16(message_id, |
| - group.GetGroupName()), |
| + name, |
| + message, |
| is_blocked_for_prerendering, |
| allow_loading); |
| return blocked_plugin->plugin(); |