Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/renderer/chrome_content_renderer_client.h" | 5 #include "chrome/renderer/chrome_content_renderer_client.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 258 | 258 |
| 259 SkBitmap* ChromeContentRendererClient::GetSadPluginBitmap() { | 259 SkBitmap* ChromeContentRendererClient::GetSadPluginBitmap() { |
| 260 return ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_SAD_PLUGIN); | 260 return ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_SAD_PLUGIN); |
| 261 } | 261 } |
| 262 | 262 |
| 263 std::string ChromeContentRendererClient::GetDefaultEncoding() { | 263 std::string ChromeContentRendererClient::GetDefaultEncoding() { |
| 264 return l10n_util::GetStringUTF8(IDS_DEFAULT_ENCODING); | 264 return l10n_util::GetStringUTF8(IDS_DEFAULT_ENCODING); |
| 265 } | 265 } |
| 266 | 266 |
| 267 bool ChromeContentRendererClient::OverrideCreatePlugin( | 267 bool ChromeContentRendererClient::OverrideCreatePlugin( |
| 268 RenderView* render_view, | 268 RenderView* render_view, |
| 269 WebFrame* frame, | 269 WebFrame* frame, |
| 270 const WebPluginParams& params, | 270 const WebPluginParams& params, |
| 271 WebKit::WebPlugin** plugin) { | 271 WebKit::WebPlugin** plugin) { |
| 272 bool is_default_plugin; | 272 *plugin = CreatePlugin(render_view, frame, params); |
| 273 *plugin = CreatePlugin(render_view, frame, params, &is_default_plugin); | |
| 274 if (!*plugin || is_default_plugin) | |
| 275 MissingPluginReporter::GetInstance()->ReportPluginMissing( | |
| 276 params.mimeType.utf8(), params.url); | |
| 277 return true; | 273 return true; |
| 278 } | 274 } |
| 279 | 275 |
| 280 WebPlugin* ChromeContentRendererClient::CreatePlugin( | 276 WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| 281 RenderView* render_view, | 277 RenderView* render_view, |
| 282 WebFrame* frame, | 278 WebFrame* frame, |
| 283 const WebPluginParams& original_params, | 279 const WebPluginParams& original_params) { |
| 284 bool* is_default_plugin) { | |
| 285 *is_default_plugin = false; | |
| 286 CommandLine* cmd = CommandLine::ForCurrentProcess(); | 280 CommandLine* cmd = CommandLine::ForCurrentProcess(); |
| 287 webkit::WebPluginInfo info; | |
| 288 GURL url(original_params.url); | 281 GURL url(original_params.url); |
| 289 std::string orig_mime_type = original_params.mimeType.utf8(); | 282 std::string orig_mime_type = original_params.mimeType.utf8(); |
| 283 std::vector<webkit::WebPluginInfo> plugins; | |
| 284 std::vector<std::string> mime_types; | |
| 285 std::vector<bool> allowed; | |
| 286 render_view->GetMatchingPlugins( | |
| 287 url, frame->top()->document().url(), orig_mime_type, | |
| 288 &plugins, &mime_types, &allowed); | |
| 289 | |
| 290 webkit::WebPluginInfo info; | |
| 290 std::string actual_mime_type; | 291 std::string actual_mime_type; |
| 292 if (plugins.empty()) { | |
| 293 MissingPluginReporter::GetInstance()->ReportPluginMissing( | |
| 294 orig_mime_type, url); | |
| 295 return CreatePluginPlaceholder( | |
| 296 render_view, frame, original_params, NULL, IDR_BLOCKED_PLUGIN_HTML, | |
| 297 IDS_PLUGIN_NOT_FOUND, false, false); | |
| 298 } else { | |
| 299 bool plugin_allowed = false; | |
| 300 for (size_t i = 0; i < plugins.size(); ++i) { | |
| 301 plugin_allowed = allowed[i]; | |
| 302 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.
| |
| 303 info = plugins[i]; | |
| 304 actual_mime_type = mime_types[i]; | |
| 305 } | |
| 306 if (plugin_allowed) | |
| 307 break; | |
| 308 } | |
| 309 if (!plugin_allowed) | |
| 310 return NULL; // TODO(bauerb): Show placeholder for disabled plug-in. | |
| 311 } | |
| 291 | 312 |
| 292 bool found = render_view->GetPluginInfo( | 313 if (info.path.value() == webkit::npapi::kDefaultPluginLibraryName) { |
| 293 url, frame->top()->document().url(), orig_mime_type, &info, | 314 MissingPluginReporter::GetInstance()->ReportPluginMissing( |
| 294 &actual_mime_type); | 315 orig_mime_type, url); |
| 295 | 316 } |
| 296 if (!found) | |
| 297 return NULL; | |
| 298 | |
| 299 *is_default_plugin = | |
| 300 info.path.value() == webkit::npapi::kDefaultPluginLibraryName; | |
| 301 | 317 |
| 302 if (orig_mime_type == actual_mime_type) { | 318 if (orig_mime_type == actual_mime_type) { |
| 303 UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch, | 319 UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch, |
| 304 PLUGIN_TYPE_MISMATCH_NONE, | 320 PLUGIN_TYPE_MISMATCH_NONE, |
| 305 PLUGIN_TYPE_MISMATCH_NUM_EVENTS); | 321 PLUGIN_TYPE_MISMATCH_NUM_EVENTS); |
| 306 } else if (orig_mime_type.empty()) { | 322 } else if (orig_mime_type.empty()) { |
| 307 UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch, | 323 UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch, |
| 308 PLUGIN_TYPE_MISMATCH_ORIG_EMPTY, | 324 PLUGIN_TYPE_MISMATCH_ORIG_EMPTY, |
| 309 PLUGIN_TYPE_MISMATCH_NUM_EVENTS); | 325 PLUGIN_TYPE_MISMATCH_NUM_EVENTS); |
| 310 } else if (orig_mime_type == kApplicationOctetStream) { | 326 } else if (orig_mime_type == kApplicationOctetStream) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 357 | 373 |
| 358 if (group->IsVulnerable(info)) { | 374 if (group->IsVulnerable(info)) { |
| 359 if (outdated_policy == CONTENT_SETTING_ASK || | 375 if (outdated_policy == CONTENT_SETTING_ASK || |
| 360 outdated_policy == CONTENT_SETTING_BLOCK) { | 376 outdated_policy == CONTENT_SETTING_BLOCK) { |
| 361 if (outdated_policy == CONTENT_SETTING_ASK) { | 377 if (outdated_policy == CONTENT_SETTING_ASK) { |
| 362 render_view->Send(new ChromeViewHostMsg_BlockedOutdatedPlugin( | 378 render_view->Send(new ChromeViewHostMsg_BlockedOutdatedPlugin( |
| 363 render_view->routing_id(), group->GetGroupName(), | 379 render_view->routing_id(), group->GetGroupName(), |
| 364 GURL(group->GetUpdateURL()))); | 380 GURL(group->GetUpdateURL()))); |
| 365 } | 381 } |
| 366 return CreatePluginPlaceholder( | 382 return CreatePluginPlaceholder( |
| 367 render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, | 383 render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| 368 IDS_PLUGIN_OUTDATED, false, outdated_policy == CONTENT_SETTING_ASK); | 384 IDS_PLUGIN_OUTDATED, false, outdated_policy == CONTENT_SETTING_ASK); |
| 369 } else { | 385 } else { |
| 370 DCHECK(outdated_policy == CONTENT_SETTING_ALLOW); | 386 DCHECK(outdated_policy == CONTENT_SETTING_ALLOW); |
| 371 } | 387 } |
| 372 } | 388 } |
| 373 | 389 |
| 374 ContentSettingsObserver* observer = ContentSettingsObserver::Get(render_view); | 390 ContentSettingsObserver* observer = ContentSettingsObserver::Get(render_view); |
| 375 ContentSetting host_setting = | 391 ContentSetting host_setting = |
| 376 observer->GetContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS); | 392 observer->GetContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS); |
| 377 | 393 |
| 378 if (group->RequiresAuthorization(info) && | 394 if (group->RequiresAuthorization(info) && |
| 379 authorize_policy == CONTENT_SETTING_ASK && | 395 authorize_policy == CONTENT_SETTING_ASK && |
| 380 (plugin_setting == CONTENT_SETTING_ALLOW || | 396 (plugin_setting == CONTENT_SETTING_ALLOW || |
| 381 plugin_setting == CONTENT_SETTING_ASK) && | 397 plugin_setting == CONTENT_SETTING_ASK) && |
| 382 host_setting == CONTENT_SETTING_DEFAULT) { | 398 host_setting == CONTENT_SETTING_DEFAULT) { |
| 383 render_view->Send(new ChromeViewHostMsg_BlockedOutdatedPlugin( | 399 render_view->Send(new ChromeViewHostMsg_BlockedOutdatedPlugin( |
| 384 render_view->routing_id(), group->GetGroupName(), GURL())); | 400 render_view->routing_id(), group->GetGroupName(), GURL())); |
| 385 return CreatePluginPlaceholder( | 401 return CreatePluginPlaceholder( |
| 386 render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, | 402 render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| 387 IDS_PLUGIN_NOT_AUTHORIZED, false, true); | 403 IDS_PLUGIN_NOT_AUTHORIZED, false, true); |
| 388 } | 404 } |
| 389 | 405 |
| 390 // Treat Native Client invocations like Javascript. | 406 // Treat Native Client invocations like Javascript. |
| 391 bool is_nacl_plugin = | 407 bool is_nacl_plugin = |
| 392 info.name == ASCIIToUTF16(ChromeContentClient::kNaClPluginName); | 408 info.name == ASCIIToUTF16(ChromeContentClient::kNaClPluginName); |
| 393 if (is_nacl_plugin) { | 409 if (is_nacl_plugin) { |
| 394 plugin_setting = | 410 plugin_setting = |
| 395 observer->GetContentSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT); | 411 observer->GetContentSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT); |
| 396 } | 412 } |
| 397 | 413 |
| 398 if (plugin_setting == CONTENT_SETTING_ALLOW || | 414 if (plugin_setting == CONTENT_SETTING_ALLOW || |
| 399 host_setting == CONTENT_SETTING_ALLOW || | 415 host_setting == CONTENT_SETTING_ALLOW || |
| 400 info.path.value() == webkit::npapi::kDefaultPluginLibraryName) { | 416 info.path.value() == webkit::npapi::kDefaultPluginLibraryName) { |
| 401 // Delay loading plugins if prerendering. | 417 // Delay loading plugins if prerendering. |
| 402 if (prerender::PrerenderHelper::IsPrerendering(render_view)) { | 418 if (prerender::PrerenderHelper::IsPrerendering(render_view)) { |
| 403 return CreatePluginPlaceholder( | 419 return CreatePluginPlaceholder( |
| 404 render_view, frame, params, *group, IDR_CLICK_TO_PLAY_PLUGIN_HTML, | 420 render_view, frame, params, group.get(), |
| 405 IDS_PLUGIN_LOAD, true, true); | 421 IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, true, true); |
| 406 } | 422 } |
| 407 | 423 |
| 408 // Enforce the Chrome WebStore restriction on the Native Client plugin. | 424 // Enforce the Chrome WebStore restriction on the Native Client plugin. |
| 409 if (is_nacl_plugin) { | 425 if (is_nacl_plugin) { |
| 410 bool allow_nacl = cmd->HasSwitch(switches::kEnableNaCl); | 426 bool allow_nacl = cmd->HasSwitch(switches::kEnableNaCl); |
| 411 if (!allow_nacl) { | 427 if (!allow_nacl) { |
| 412 const char* kNaClPluginMimeType = "application/x-nacl"; | 428 const char* kNaClPluginMimeType = "application/x-nacl"; |
| 413 const char* kNaClPluginManifestAttribute = "nacl"; | 429 const char* kNaClPluginManifestAttribute = "nacl"; |
| 414 | 430 |
| 415 GURL nexe_url; | 431 GURL nexe_url; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 443 allow_nacl = extension && | 459 allow_nacl = extension && |
| 444 (extension->from_webstore() || | 460 (extension->from_webstore() || |
| 445 extension->location() == Extension::COMPONENT || | 461 extension->location() == Extension::COMPONENT || |
| 446 extension->location() == Extension::LOAD); | 462 extension->location() == Extension::LOAD); |
| 447 } | 463 } |
| 448 | 464 |
| 449 if (!allow_nacl) { | 465 if (!allow_nacl) { |
| 450 // TODO(bbudge) Webkit will crash if this is a full-frame plug-in and | 466 // TODO(bbudge) Webkit will crash if this is a full-frame plug-in and |
| 451 // we return NULL. Prepare a patch to fix that, and return NULL here. | 467 // we return NULL. Prepare a patch to fix that, and return NULL here. |
| 452 return CreatePluginPlaceholder( | 468 return CreatePluginPlaceholder( |
| 453 render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, | 469 render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| 454 IDS_PLUGIN_BLOCKED, false, false); | 470 IDS_PLUGIN_BLOCKED, false, false); |
| 455 } | 471 } |
| 456 } | 472 } |
| 457 | 473 |
| 458 bool pepper_plugin_was_registered = false; | 474 bool pepper_plugin_was_registered = false; |
| 459 scoped_refptr<webkit::ppapi::PluginModule> pepper_module( | 475 scoped_refptr<webkit::ppapi::PluginModule> pepper_module( |
| 460 render_view->pepper_delegate()->CreatePepperPluginModule( | 476 render_view->pepper_delegate()->CreatePepperPluginModule( |
| 461 info, &pepper_plugin_was_registered)); | 477 info, &pepper_plugin_was_registered)); |
| 462 if (pepper_plugin_was_registered) { | 478 if (pepper_plugin_was_registered) { |
| 463 if (pepper_module) { | 479 if (pepper_module) { |
| 464 return render_view->CreatePepperPlugin( | 480 return render_view->CreatePepperPlugin( |
| 465 frame, params, info.path, pepper_module.get()); | 481 frame, params, info.path, pepper_module.get()); |
| 466 } | 482 } |
| 467 return NULL; | 483 return NULL; |
| 468 } | 484 } |
| 469 | 485 |
| 470 return render_view->CreateNPAPIPlugin( | 486 return render_view->CreateNPAPIPlugin( |
| 471 frame, params, info.path, actual_mime_type); | 487 frame, params, info.path, actual_mime_type); |
| 472 } | 488 } |
| 473 | 489 |
| 474 observer->DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, resource); | 490 observer->DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, resource); |
| 475 if (plugin_setting == CONTENT_SETTING_ASK) { | 491 if (plugin_setting == CONTENT_SETTING_ASK) { |
| 476 RenderThread::RecordUserMetrics("Plugin_ClickToPlay"); | 492 RenderThread::RecordUserMetrics("Plugin_ClickToPlay"); |
| 477 return CreatePluginPlaceholder( | 493 return CreatePluginPlaceholder( |
| 478 render_view, frame, params, *group, IDR_CLICK_TO_PLAY_PLUGIN_HTML, | 494 render_view, frame, params, group.get(), IDR_CLICK_TO_PLAY_PLUGIN_HTML, |
| 479 IDS_PLUGIN_LOAD, false, true); | 495 IDS_PLUGIN_LOAD, false, true); |
| 480 } else { | 496 } else { |
| 481 RenderThread::RecordUserMetrics("Plugin_Blocked"); | 497 RenderThread::RecordUserMetrics("Plugin_Blocked"); |
| 482 return CreatePluginPlaceholder( | 498 return CreatePluginPlaceholder( |
| 483 render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML, | 499 render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML, |
| 484 IDS_PLUGIN_BLOCKED, false, true); | 500 IDS_PLUGIN_BLOCKED, false, true); |
| 485 } | 501 } |
| 486 } | 502 } |
| 487 | 503 |
| 488 WebPlugin* ChromeContentRendererClient::CreatePluginPlaceholder( | 504 WebPlugin* ChromeContentRendererClient::CreatePluginPlaceholder( |
| 489 RenderView* render_view, | 505 RenderView* render_view, |
| 490 WebFrame* frame, | 506 WebFrame* frame, |
| 491 const WebPluginParams& params, | 507 const WebPluginParams& params, |
| 492 const webkit::npapi::PluginGroup& group, | 508 const webkit::npapi::PluginGroup* group, |
| 493 int resource_id, | 509 int resource_id, |
| 494 int message_id, | 510 int message_id, |
| 495 bool is_blocked_for_prerendering, | 511 bool is_blocked_for_prerendering, |
| 496 bool allow_loading) { | 512 bool allow_loading) { |
| 497 // |blocked_plugin| will delete itself when the WebViewPlugin | 513 // |blocked_plugin| will delete itself when the WebViewPlugin |
| 498 // is destroyed. | 514 // is destroyed. |
| 515 string16 name; | |
| 516 string16 message; | |
| 517 if (group) { | |
| 518 name = group->GetGroupName(); | |
| 519 message = l10n_util::GetStringFUTF16(message_id, name); | |
| 520 } else { | |
| 521 message = l10n_util::GetStringUTF16(message_id); | |
| 522 } | |
| 523 | |
| 499 BlockedPlugin* blocked_plugin = | 524 BlockedPlugin* blocked_plugin = |
| 500 new BlockedPlugin(render_view, | 525 new BlockedPlugin(render_view, |
| 501 frame, | 526 frame, |
| 502 group, | |
| 503 params, | 527 params, |
| 504 render_view->webkit_preferences(), | 528 render_view->webkit_preferences(), |
| 505 resource_id, | 529 resource_id, |
| 506 l10n_util::GetStringFUTF16(message_id, | 530 name, |
| 507 group.GetGroupName()), | 531 message, |
| 508 is_blocked_for_prerendering, | 532 is_blocked_for_prerendering, |
| 509 allow_loading); | 533 allow_loading); |
| 510 return blocked_plugin->plugin(); | 534 return blocked_plugin->plugin(); |
| 511 } | 535 } |
| 512 | 536 |
| 513 void ChromeContentRendererClient::ShowErrorPage(RenderView* render_view, | 537 void ChromeContentRendererClient::ShowErrorPage(RenderView* render_view, |
| 514 WebKit::WebFrame* frame, | 538 WebKit::WebFrame* frame, |
| 515 int http_status_code) { | 539 int http_status_code) { |
| 516 // Use an internal error page, if we have one for the status code. | 540 // Use an internal error page, if we have one for the status code. |
| 517 if (LocalizedError::HasStrings(LocalizedError::kHttpErrorDomain, | 541 if (LocalizedError::HasStrings(LocalizedError::kHttpErrorDomain, |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 766 if (spellcheck_.get()) | 790 if (spellcheck_.get()) |
| 767 thread->RemoveObserver(spellcheck_.get()); | 791 thread->RemoveObserver(spellcheck_.get()); |
| 768 SpellCheck* new_spellcheck = new SpellCheck(); | 792 SpellCheck* new_spellcheck = new SpellCheck(); |
| 769 if (spellcheck_provider_) | 793 if (spellcheck_provider_) |
| 770 spellcheck_provider_->SetSpellCheck(new_spellcheck); | 794 spellcheck_provider_->SetSpellCheck(new_spellcheck); |
| 771 spellcheck_.reset(new_spellcheck); | 795 spellcheck_.reset(new_spellcheck); |
| 772 thread->AddObserver(new_spellcheck); | 796 thread->AddObserver(new_spellcheck); |
| 773 } | 797 } |
| 774 | 798 |
| 775 } // namespace chrome | 799 } // namespace chrome |
| OLD | NEW |