| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 GetImageNamed(IDR_SAD_PLUGIN).ToSkBitmap()); | 618 GetImageNamed(IDR_SAD_PLUGIN).ToSkBitmap()); |
| 619 } | 619 } |
| 620 | 620 |
| 621 SkBitmap* ChromeContentRendererClient::GetSadWebViewBitmap() { | 621 SkBitmap* ChromeContentRendererClient::GetSadWebViewBitmap() { |
| 622 return const_cast<SkBitmap*>(ResourceBundle::GetSharedInstance(). | 622 return const_cast<SkBitmap*>(ResourceBundle::GetSharedInstance(). |
| 623 GetImageNamed(IDR_SAD_WEBVIEW).ToSkBitmap()); | 623 GetImageNamed(IDR_SAD_WEBVIEW).ToSkBitmap()); |
| 624 } | 624 } |
| 625 | 625 |
| 626 bool ChromeContentRendererClient::OverrideCreatePlugin( | 626 bool ChromeContentRendererClient::OverrideCreatePlugin( |
| 627 content::RenderFrame* render_frame, | 627 content::RenderFrame* render_frame, |
| 628 WebLocalFrame* frame, | |
| 629 const WebPluginParams& params, | 628 const WebPluginParams& params, |
| 630 WebPlugin** plugin) { | 629 WebPlugin** plugin) { |
| 631 std::string orig_mime_type = params.mime_type.Utf8(); | 630 std::string orig_mime_type = params.mime_type.Utf8(); |
| 632 #if BUILDFLAG(ENABLE_EXTENSIONS) | 631 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 633 if (!ChromeExtensionsRendererClient::GetInstance()->OverrideCreatePlugin( | 632 if (!ChromeExtensionsRendererClient::GetInstance()->OverrideCreatePlugin( |
| 634 render_frame, params)) { | 633 render_frame, params)) { |
| 635 return false; | 634 return false; |
| 636 } | 635 } |
| 637 #endif | 636 #endif |
| 638 | 637 |
| 639 GURL url(params.url); | 638 GURL url(params.url); |
| 640 #if BUILDFLAG(ENABLE_PLUGINS) | 639 #if BUILDFLAG(ENABLE_PLUGINS) |
| 641 ChromeViewHostMsg_GetPluginInfo_Output output; | 640 ChromeViewHostMsg_GetPluginInfo_Output output; |
| 642 render_frame->Send(new ChromeViewHostMsg_GetPluginInfo( | 641 render_frame->Send(new ChromeViewHostMsg_GetPluginInfo( |
| 643 render_frame->GetRoutingID(), url, frame->Top()->GetSecurityOrigin(), | 642 render_frame->GetRoutingID(), url, |
| 644 orig_mime_type, &output)); | 643 render_frame->GetWebFrame()->Top()->GetSecurityOrigin(), orig_mime_type, |
| 645 *plugin = CreatePlugin(render_frame, frame, params, output); | 644 &output)); |
| 645 *plugin = CreatePlugin(render_frame, params, output); |
| 646 #else // !BUILDFLAG(ENABLE_PLUGINS) | 646 #else // !BUILDFLAG(ENABLE_PLUGINS) |
| 647 PluginUMAReporter::GetInstance()->ReportPluginMissing(orig_mime_type, url); | 647 PluginUMAReporter::GetInstance()->ReportPluginMissing(orig_mime_type, url); |
| 648 *plugin = NonLoadablePluginPlaceholder::CreateNotSupportedPlugin( | 648 auto* placeholder = NonLoadablePluginPlaceholder::CreateNotSupportedPlugin( |
| 649 render_frame, frame, params)->plugin(); | 649 render_frame, params); |
| 650 *plugin = placeholder->plugin(); |
| 650 | 651 |
| 651 #endif // BUILDFLAG(ENABLE_PLUGINS) | 652 #endif // BUILDFLAG(ENABLE_PLUGINS) |
| 652 return true; | 653 return true; |
| 653 } | 654 } |
| 654 | 655 |
| 655 WebPlugin* ChromeContentRendererClient::CreatePluginReplacement( | 656 WebPlugin* ChromeContentRendererClient::CreatePluginReplacement( |
| 656 content::RenderFrame* render_frame, | 657 content::RenderFrame* render_frame, |
| 657 const base::FilePath& plugin_path) { | 658 const base::FilePath& plugin_path) { |
| 658 return NonLoadablePluginPlaceholder::CreateErrorPlugin(render_frame, | 659 auto* placeholder = NonLoadablePluginPlaceholder::CreateErrorPlugin( |
| 659 plugin_path)->plugin(); | 660 render_frame, plugin_path); |
| 661 return placeholder->plugin(); |
| 660 } | 662 } |
| 661 | 663 |
| 662 void ChromeContentRendererClient::DeferMediaLoad( | 664 void ChromeContentRendererClient::DeferMediaLoad( |
| 663 content::RenderFrame* render_frame, | 665 content::RenderFrame* render_frame, |
| 664 bool has_played_media_before, | 666 bool has_played_media_before, |
| 665 const base::Closure& closure) { | 667 const base::Closure& closure) { |
| 666 // Don't allow autoplay/autoload of media resources in a RenderFrame that is | 668 // Don't allow autoplay/autoload of media resources in a RenderFrame that is |
| 667 // hidden and has never played any media before. We want to allow future | 669 // hidden and has never played any media before. We want to allow future |
| 668 // loads even when hidden to allow playlist-like functionality. | 670 // loads even when hidden to allow playlist-like functionality. |
| 669 // | 671 // |
| 670 // NOTE: This is also used to defer media loading for prerender. | 672 // NOTE: This is also used to defer media loading for prerender. |
| 671 // NOTE: Switch can be used to allow autoplay, unless frame is prerendered. | 673 // NOTE: Switch can be used to allow autoplay, unless frame is prerendered. |
| 672 // | 674 // |
| 673 // TODO(dalecurtis): Include an idle check too. http://crbug.com/509135 | 675 // TODO(dalecurtis): Include an idle check too. http://crbug.com/509135 |
| 674 if ((render_frame->IsHidden() && !has_played_media_before && | 676 if ((render_frame->IsHidden() && !has_played_media_before && |
| 675 !base::CommandLine::ForCurrentProcess()->HasSwitch( | 677 !base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 676 switches::kIgnoreAutoplayRestrictionsForTests)) || | 678 switches::kIgnoreAutoplayRestrictionsForTests)) || |
| 677 prerender::PrerenderHelper::IsPrerendering(render_frame)) { | 679 prerender::PrerenderHelper::IsPrerendering(render_frame)) { |
| 678 new MediaLoadDeferrer(render_frame, closure); | 680 new MediaLoadDeferrer(render_frame, closure); |
| 679 return; | 681 return; |
| 680 } | 682 } |
| 681 | 683 |
| 682 closure.Run(); | 684 closure.Run(); |
| 683 } | 685 } |
| 684 | 686 |
| 685 #if BUILDFLAG(ENABLE_PLUGINS) | 687 #if BUILDFLAG(ENABLE_PLUGINS) |
| 688 // static |
| 686 WebPlugin* ChromeContentRendererClient::CreatePlugin( | 689 WebPlugin* ChromeContentRendererClient::CreatePlugin( |
| 687 content::RenderFrame* render_frame, | 690 content::RenderFrame* render_frame, |
| 688 WebLocalFrame* frame, | |
| 689 const WebPluginParams& original_params, | 691 const WebPluginParams& original_params, |
| 690 const ChromeViewHostMsg_GetPluginInfo_Output& output) { | 692 const ChromeViewHostMsg_GetPluginInfo_Output& output) { |
| 691 const WebPluginInfo& info = output.plugin; | 693 const WebPluginInfo& info = output.plugin; |
| 692 const std::string& actual_mime_type = output.actual_mime_type; | 694 const std::string& actual_mime_type = output.actual_mime_type; |
| 693 const base::string16& group_name = output.group_name; | 695 const base::string16& group_name = output.group_name; |
| 694 const std::string& identifier = output.group_identifier; | 696 const std::string& identifier = output.group_identifier; |
| 695 ChromeViewHostMsg_GetPluginInfo_Status status = output.status; | 697 ChromeViewHostMsg_GetPluginInfo_Status status = output.status; |
| 696 GURL url(original_params.url); | 698 GURL url(original_params.url); |
| 697 std::string orig_mime_type = original_params.mime_type.Utf8(); | 699 std::string orig_mime_type = original_params.mime_type.Utf8(); |
| 698 ChromePluginPlaceholder* placeholder = NULL; | 700 ChromePluginPlaceholder* placeholder = NULL; |
| 699 | 701 |
| 700 // If the browser plugin is to be enabled, this should be handled by the | 702 // If the browser plugin is to be enabled, this should be handled by the |
| 701 // renderer, so the code won't reach here due to the early exit in | 703 // renderer, so the code won't reach here due to the early exit in |
| 702 // OverrideCreatePlugin. | 704 // OverrideCreatePlugin. |
| 703 if (status == ChromeViewHostMsg_GetPluginInfo_Status::kNotFound || | 705 if (status == ChromeViewHostMsg_GetPluginInfo_Status::kNotFound || |
| 704 orig_mime_type == content::kBrowserPluginMimeType) { | 706 orig_mime_type == content::kBrowserPluginMimeType) { |
| 705 PluginUMAReporter::GetInstance()->ReportPluginMissing(orig_mime_type, url); | 707 PluginUMAReporter::GetInstance()->ReportPluginMissing(orig_mime_type, url); |
| 706 placeholder = ChromePluginPlaceholder::CreateLoadableMissingPlugin( | 708 placeholder = ChromePluginPlaceholder::CreateLoadableMissingPlugin( |
| 707 render_frame, frame, original_params); | 709 render_frame, original_params); |
| 708 } else { | 710 } else { |
| 709 // TODO(bauerb): This should be in content/. | 711 // TODO(bauerb): This should be in content/. |
| 710 WebPluginParams params(original_params); | 712 WebPluginParams params(original_params); |
| 711 for (size_t i = 0; i < info.mime_types.size(); ++i) { | 713 for (const auto& mime_type : info.mime_types) { |
| 712 if (info.mime_types[i].mime_type == actual_mime_type) { | 714 if (mime_type.mime_type == actual_mime_type) { |
| 713 AppendParams(info.mime_types[i].additional_param_names, | 715 AppendParams(mime_type.additional_param_names, |
| 714 info.mime_types[i].additional_param_values, | 716 mime_type.additional_param_values, ¶ms.attribute_names, |
| 715 ¶ms.attribute_names, ¶ms.attribute_values); | 717 ¶ms.attribute_values); |
| 716 break; | 718 break; |
| 717 } | 719 } |
| 718 } | 720 } |
| 719 if (params.mime_type.IsNull() && (actual_mime_type.size() > 0)) { | 721 if (params.mime_type.IsNull() && (actual_mime_type.size() > 0)) { |
| 720 // Webkit might say that mime type is null while we already know the | 722 // Webkit might say that mime type is null while we already know the |
| 721 // actual mime type via ChromeViewHostMsg_GetPluginInfo. In that case | 723 // actual mime type via ChromeViewHostMsg_GetPluginInfo. In that case |
| 722 // we should use what we know since WebpluginDelegateProxy does some | 724 // we should use what we know since WebpluginDelegateProxy does some |
| 723 // specific initializations based on this information. | 725 // specific initializations based on this information. |
| 724 params.mime_type = WebString::FromUTF8(actual_mime_type); | 726 params.mime_type = WebString::FromUTF8(actual_mime_type); |
| 725 } | 727 } |
| 726 | 728 |
| 727 ContentSettingsObserver* observer = | 729 ContentSettingsObserver* observer = |
| 728 ContentSettingsObserver::Get(render_frame); | 730 ContentSettingsObserver::Get(render_frame); |
| 729 | 731 |
| 730 const ContentSettingsType content_type = | 732 const ContentSettingsType content_type = |
| 731 ShouldUseJavaScriptSettingForPlugin(info) | 733 ShouldUseJavaScriptSettingForPlugin(info) |
| 732 ? CONTENT_SETTINGS_TYPE_JAVASCRIPT | 734 ? CONTENT_SETTINGS_TYPE_JAVASCRIPT |
| 733 : CONTENT_SETTINGS_TYPE_PLUGINS; | 735 : CONTENT_SETTINGS_TYPE_PLUGINS; |
| 734 | 736 |
| 735 if ((status == ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized || | 737 if ((status == ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized || |
| 736 status == ChromeViewHostMsg_GetPluginInfo_Status::kBlocked) && | 738 status == ChromeViewHostMsg_GetPluginInfo_Status::kBlocked) && |
| 737 observer->IsPluginTemporarilyAllowed(identifier)) { | 739 observer->IsPluginTemporarilyAllowed(identifier)) { |
| 738 status = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; | 740 status = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; |
| 739 } | 741 } |
| 740 | 742 |
| 741 auto create_blocked_plugin = [&render_frame, &frame, ¶ms, &info, | 743 auto create_blocked_plugin = [&render_frame, ¶ms, &info, &identifier, |
| 742 &identifier, &group_name]( | 744 &group_name](int template_id, |
| 743 int template_id, const base::string16& message) { | 745 const base::string16& message) { |
| 744 return ChromePluginPlaceholder::CreateBlockedPlugin( | 746 return ChromePluginPlaceholder::CreateBlockedPlugin( |
| 745 render_frame, frame, params, info, identifier, group_name, | 747 render_frame, params, info, identifier, group_name, template_id, |
| 746 template_id, message, PowerSaverInfo()); | 748 message, PowerSaverInfo()); |
| 747 }; | 749 }; |
| 750 WebLocalFrame* frame = render_frame->GetWebFrame(); |
| 748 switch (status) { | 751 switch (status) { |
| 749 case ChromeViewHostMsg_GetPluginInfo_Status::kNotFound: { | 752 case ChromeViewHostMsg_GetPluginInfo_Status::kNotFound: { |
| 750 NOTREACHED(); | 753 NOTREACHED(); |
| 751 break; | 754 break; |
| 752 } | 755 } |
| 753 case ChromeViewHostMsg_GetPluginInfo_Status::kAllowed: | 756 case ChromeViewHostMsg_GetPluginInfo_Status::kAllowed: |
| 754 case ChromeViewHostMsg_GetPluginInfo_Status::kPlayImportantContent: { | 757 case ChromeViewHostMsg_GetPluginInfo_Status::kPlayImportantContent: { |
| 755 #if !defined(DISABLE_NACL) && BUILDFLAG(ENABLE_EXTENSIONS) | 758 #if !defined(DISABLE_NACL) && BUILDFLAG(ENABLE_EXTENSIONS) |
| 756 const bool is_nacl_plugin = | 759 const bool is_nacl_plugin = |
| 757 info.name == ASCIIToUTF16(nacl::kNaClPluginName); | 760 info.name == ASCIIToUTF16(nacl::kNaClPluginName); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 bool power_saver_setting_on = | 825 bool power_saver_setting_on = |
| 823 status == | 826 status == |
| 824 ChromeViewHostMsg_GetPluginInfo_Status::kPlayImportantContent; | 827 ChromeViewHostMsg_GetPluginInfo_Status::kPlayImportantContent; |
| 825 PowerSaverInfo power_saver_info = | 828 PowerSaverInfo power_saver_info = |
| 826 PowerSaverInfo::Get(render_frame, power_saver_setting_on, params, | 829 PowerSaverInfo::Get(render_frame, power_saver_setting_on, params, |
| 827 info, frame->GetDocument().Url()); | 830 info, frame->GetDocument().Url()); |
| 828 if (power_saver_info.blocked_for_background_tab || is_prerendering || | 831 if (power_saver_info.blocked_for_background_tab || is_prerendering || |
| 829 !power_saver_info.poster_attribute.empty() || | 832 !power_saver_info.poster_attribute.empty() || |
| 830 power_saver_info.power_saver_enabled) { | 833 power_saver_info.power_saver_enabled) { |
| 831 placeholder = ChromePluginPlaceholder::CreateBlockedPlugin( | 834 placeholder = ChromePluginPlaceholder::CreateBlockedPlugin( |
| 832 render_frame, frame, params, info, identifier, group_name, | 835 render_frame, params, info, identifier, group_name, |
| 833 power_saver_info.poster_attribute.empty() | 836 power_saver_info.poster_attribute.empty() |
| 834 ? IDR_BLOCKED_PLUGIN_HTML | 837 ? IDR_BLOCKED_PLUGIN_HTML |
| 835 : IDR_PLUGIN_POSTER_HTML, | 838 : IDR_PLUGIN_POSTER_HTML, |
| 836 l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, group_name), | 839 l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, group_name), |
| 837 power_saver_info); | 840 power_saver_info); |
| 838 placeholder->set_blocked_for_prerendering(is_prerendering); | 841 placeholder->set_blocked_for_prerendering(is_prerendering); |
| 839 | 842 |
| 840 // Because we can't determine the size of a plugin until it loads, | 843 // Because we can't determine the size of a plugin until it loads, |
| 841 // all plugins are treated as tiny until proven otherwise. | 844 // all plugins are treated as tiny until proven otherwise. |
| 842 placeholder->set_blocked_for_tinyness( | 845 placeholder->set_blocked_for_tinyness( |
| 843 power_saver_info.power_saver_enabled); | 846 power_saver_info.power_saver_enabled); |
| 844 | 847 |
| 845 placeholder->AllowLoading(); | 848 placeholder->AllowLoading(); |
| 846 break; | 849 break; |
| 847 } | 850 } |
| 848 | 851 |
| 849 // Same-origin and whitelisted-origin plugins skip the placeholder. | 852 // Same-origin and whitelisted-origin plugins skip the placeholder. |
| 850 return render_frame->CreatePlugin(frame, info, params, nullptr); | 853 return render_frame->CreatePlugin(info, params, nullptr); |
| 851 } | 854 } |
| 852 case ChromeViewHostMsg_GetPluginInfo_Status::kDisabled: { | 855 case ChromeViewHostMsg_GetPluginInfo_Status::kDisabled: { |
| 853 PluginUMAReporter::GetInstance()->ReportPluginDisabled(orig_mime_type, | 856 PluginUMAReporter::GetInstance()->ReportPluginDisabled(orig_mime_type, |
| 854 url); | 857 url); |
| 855 placeholder = create_blocked_plugin( | 858 placeholder = create_blocked_plugin( |
| 856 IDR_DISABLED_PLUGIN_HTML, | 859 IDR_DISABLED_PLUGIN_HTML, |
| 857 l10n_util::GetStringFUTF16(IDS_PLUGIN_DISABLED, group_name)); | 860 l10n_util::GetStringFUTF16(IDS_PLUGIN_DISABLED, group_name)); |
| 858 break; | 861 break; |
| 859 } | 862 } |
| 860 case ChromeViewHostMsg_GetPluginInfo_Status::kFlashHiddenPreferHtml: { | 863 case ChromeViewHostMsg_GetPluginInfo_Status::kFlashHiddenPreferHtml: { |
| (...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 | 1555 |
| 1553 RecordYouTubeRewriteUMA(result); | 1556 RecordYouTubeRewriteUMA(result); |
| 1554 return corrected_url.ReplaceComponents(r); | 1557 return corrected_url.ReplaceComponents(r); |
| 1555 } | 1558 } |
| 1556 | 1559 |
| 1557 std::unique_ptr<base::TaskScheduler::InitParams> | 1560 std::unique_ptr<base::TaskScheduler::InitParams> |
| 1558 ChromeContentRendererClient::GetTaskSchedulerInitParams() { | 1561 ChromeContentRendererClient::GetTaskSchedulerInitParams() { |
| 1559 return task_scheduler_util:: | 1562 return task_scheduler_util:: |
| 1560 GetRendererTaskSchedulerInitParamsFromCommandLine(); | 1563 GetRendererTaskSchedulerInitParamsFromCommandLine(); |
| 1561 } | 1564 } |
| OLD | NEW |