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 88d41cf849ca5ab2506faad688bf19bb31e24276..d81e81311ab2b310f6ca87a31a45d6bf4dacfb7a 100644 |
--- a/chrome/renderer/chrome_content_renderer_client.cc |
+++ b/chrome/renderer/chrome_content_renderer_client.cc |
@@ -266,41 +266,45 @@ 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); |
+ ChromeViewHostMsg_GetPluginInfo_Params plugin_params; |
+ render_view->Send(new ChromeViewHostMsg_GetPluginInfo( |
+ render_view->routing_id(), url, frame->top()->document().url(), |
+ orig_mime_type, &plugin_params)); |
- if (!found) |
- return NULL; |
+ if (plugin_params.status == |
+ ChromeViewHostMsg_GetPluginInfo_Status::kNotFound) { |
+ 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 if (plugin_params.status == |
+ ChromeViewHostMsg_GetPluginInfo_Status::kDisabled) { |
+ return NULL; // TODO(bauerb): Show a placeholder for a disabled plug-in. |
+ } |
- *is_default_plugin = |
- info.path.value() == webkit::npapi::kDefaultPluginLibraryName; |
+ if (plugin_params.plugin.path.value() == |
+ webkit::npapi::kDefaultPluginLibraryName) { |
+ MissingPluginReporter::GetInstance()->ReportPluginMissing( |
+ orig_mime_type, url); |
+ } |
- if (orig_mime_type == actual_mime_type) { |
+ if (orig_mime_type == plugin_params.actual_mime_type) { |
UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch, |
PLUGIN_TYPE_MISMATCH_NONE, |
PLUGIN_TYPE_MISMATCH_NUM_EVENTS); |
@@ -326,7 +330,8 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
} |
scoped_ptr<webkit::npapi::PluginGroup> group( |
- webkit::npapi::PluginList::Singleton()->GetPluginGroup(info)); |
+ webkit::npapi::PluginList::Singleton()->GetPluginGroup( |
+ plugin_params.plugin)); |
ContentSettingsType content_type = CONTENT_SETTINGS_TYPE_PLUGINS; |
ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT; |
@@ -338,10 +343,11 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT); |
WebPluginParams params(original_params); |
- for (size_t i = 0; i < info.mime_types.size(); ++i) { |
- if (info.mime_types[i].mime_type == actual_mime_type) { |
- AppendParams(info.mime_types[i].additional_param_names, |
- info.mime_types[i].additional_param_values, |
+ for (size_t i = 0; i < plugin_params.plugin.mime_types.size(); ++i) { |
+ if (plugin_params.plugin.mime_types[i].mime_type == |
+ plugin_params.actual_mime_type) { |
+ AppendParams(plugin_params.plugin.mime_types[i].additional_param_names, |
+ plugin_params.plugin.mime_types[i].additional_param_values, |
¶ms.attributeNames, |
¶ms.attributeValues); |
break; |
@@ -350,14 +356,15 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
ContentSetting outdated_policy = CONTENT_SETTING_ASK; |
ContentSetting authorize_policy = CONTENT_SETTING_ASK; |
- if (group->IsVulnerable(info) || group->RequiresAuthorization(info)) { |
+ if (group->IsVulnerable(plugin_params.plugin) || |
+ group->RequiresAuthorization(plugin_params.plugin)) { |
// These policies are dynamic and can changed at runtime, so they aren't |
// cached here. |
render_view->Send(new ChromeViewHostMsg_GetPluginPolicies( |
&outdated_policy, &authorize_policy)); |
} |
- if (group->IsVulnerable(info)) { |
+ if (group->IsVulnerable(plugin_params.plugin)) { |
if (outdated_policy == CONTENT_SETTING_ASK || |
outdated_policy == CONTENT_SETTING_BLOCK) { |
if (outdated_policy == CONTENT_SETTING_ASK) { |
@@ -366,7 +373,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); |
@@ -377,7 +384,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
ContentSetting host_setting = |
observer->GetContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS); |
- if (group->RequiresAuthorization(info) && |
+ if (group->RequiresAuthorization(plugin_params.plugin) && |
authorize_policy == CONTENT_SETTING_ASK && |
(plugin_setting == CONTENT_SETTING_ALLOW || |
plugin_setting == CONTENT_SETTING_ASK) && |
@@ -385,13 +392,13 @@ 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); |
} |
// Treat Native Client invocations like Javascript. |
- bool is_nacl_plugin = |
- info.name == ASCIIToUTF16(ChromeContentClient::kNaClPluginName); |
+ bool is_nacl_plugin = plugin_params.plugin.name == |
+ ASCIIToUTF16(ChromeContentClient::kNaClPluginName); |
if (is_nacl_plugin) { |
content_type = CONTENT_SETTINGS_TYPE_JAVASCRIPT; |
plugin_setting = |
@@ -400,12 +407,13 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
if (plugin_setting == CONTENT_SETTING_ALLOW || |
host_setting == CONTENT_SETTING_ALLOW || |
- info.path.value() == webkit::npapi::kDefaultPluginLibraryName) { |
+ plugin_params.plugin.path.value() == |
+ webkit::npapi::kDefaultPluginLibraryName) { |
// 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. |
@@ -416,16 +424,17 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
const char* kNaClPluginManifestAttribute = "nacl"; |
GURL nexe_url; |
- if (actual_mime_type == kNaClPluginMimeType) { |
+ if (plugin_params.actual_mime_type == kNaClPluginMimeType) { |
nexe_url = url; // Normal embedded NaCl plugin. |
} else { |
// Content type handling NaCl plugin; the "nacl" param on the |
// MIME type holds the nexe URL. |
string16 nacl_attr = ASCIIToUTF16(kNaClPluginManifestAttribute); |
- for (size_t i = 0; i < info.mime_types.size(); ++i) { |
- if (info.mime_types[i].mime_type == actual_mime_type) { |
+ for (size_t i = 0; i < plugin_params.plugin.mime_types.size(); ++i) { |
+ if (plugin_params.plugin.mime_types[i].mime_type == |
+ plugin_params.actual_mime_type) { |
const webkit::WebPluginMimeType& content_type = |
- info.mime_types[i]; |
+ plugin_params.plugin.mime_types[i]; |
for (size_t i = 0; |
i < content_type.additional_param_names.size(); ++i) { |
if (content_type.additional_param_names[i] == nacl_attr) { |
@@ -453,7 +462,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); |
} |
} |
@@ -461,29 +470,30 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin( |
bool pepper_plugin_was_registered = false; |
scoped_refptr<webkit::ppapi::PluginModule> pepper_module( |
render_view->pepper_delegate()->CreatePepperPluginModule( |
- info, &pepper_plugin_was_registered)); |
+ plugin_params.plugin, &pepper_plugin_was_registered)); |
if (pepper_plugin_was_registered) { |
if (pepper_module) { |
return render_view->CreatePepperPlugin( |
- frame, params, info.path, pepper_module.get()); |
+ frame, params, plugin_params.plugin.path, pepper_module.get()); |
} |
return NULL; |
} |
return render_view->CreateNPAPIPlugin( |
- frame, params, info.path, actual_mime_type); |
+ frame, params, plugin_params.plugin.path, |
+ plugin_params.actual_mime_type); |
} |
observer->DidBlockContentType(content_type, resource); |
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); |
} |
} |
@@ -492,22 +502,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(); |
@@ -716,7 +734,6 @@ bool ChromeContentRendererClient::IsProtocolSupportedForMedia( |
return url.SchemeIs(chrome::kExtensionScheme); |
} |
- |
void ChromeContentRendererClient::SetExtensionDispatcher( |
ExtensionDispatcher* extension_dispatcher) { |
extension_dispatcher_.reset(extension_dispatcher); |