1 // Copyright (c) 2014 GitHub, Inc.
2 // Use of this source code is governed by the MIT license that can be
3 // found in the LICENSE file.
5 #include "atom/app/atom_content_client.h"
10 #include "atom/common/atom_constants.h"
11 #include "atom/common/atom_version.h"
12 #include "atom/common/chrome_version.h"
13 #include "atom/common/options_switches.h"
14 #include "base/command_line.h"
15 #include "base/files/file_util.h"
16 #include "base/strings/string_split.h"
17 #include "base/strings/string_util.h"
18 #include "base/strings/utf_string_conversions.h"
19 #include "content/public/common/content_constants.h"
20 #include "content/public/common/pepper_plugin_info.h"
21 #include "content/public/common/user_agent.h"
23 #include "ppapi/shared_impl/ppapi_permissions.h"
24 #include "third_party/widevine/cdm/stub/widevine_cdm_version.h"
25 #include "tizen_src/ewk/efl_integration/common/version_info.h"
26 #include "ui/base/l10n/l10n_util.h"
27 #include "url/url_constants.h"
29 #if defined(WIDEVINE_CDM_AVAILABLE) && BUILDFLAG(ENABLE_PEPPER_CDMS)
30 #include "chrome/common/widevine_cdm_constants.h"
37 content::PepperPluginInfo CreatePepperFlashInfo(const base::FilePath& path,
38 const std::string& version) {
39 content::PepperPluginInfo plugin;
41 plugin.is_out_of_process = true;
42 plugin.name = content::kFlashPluginName;
44 plugin.permissions = ppapi::PERMISSION_ALL_BITS;
46 std::vector<std::string> flash_version_numbers = base::SplitString(
47 version, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
48 if (flash_version_numbers.empty())
49 flash_version_numbers.push_back("11");
50 // |SplitString()| puts in an empty string given an empty string. :(
51 else if (flash_version_numbers[0].empty())
52 flash_version_numbers[0] = "11";
53 if (flash_version_numbers.size() < 2)
54 flash_version_numbers.push_back("2");
55 if (flash_version_numbers.size() < 3)
56 flash_version_numbers.push_back("999");
57 if (flash_version_numbers.size() < 4)
58 flash_version_numbers.push_back("999");
59 // E.g., "Shockwave Flash 10.2 r154":
60 plugin.description = plugin.name + " " + flash_version_numbers[0] + "." +
61 flash_version_numbers[1] + " r" + flash_version_numbers[2];
62 plugin.version = base::JoinString(flash_version_numbers, ".");
63 content::WebPluginMimeType swf_mime_type(
64 content::kFlashPluginSwfMimeType,
65 content::kFlashPluginSwfExtension,
66 content::kFlashPluginSwfDescription);
67 plugin.mime_types.push_back(swf_mime_type);
68 content::WebPluginMimeType spl_mime_type(
69 content::kFlashPluginSplMimeType,
70 content::kFlashPluginSplExtension,
71 content::kFlashPluginSplDescription);
72 plugin.mime_types.push_back(spl_mime_type);
77 #if defined(WIDEVINE_CDM_AVAILABLE) && BUILDFLAG(ENABLE_PEPPER_CDMS)
78 content::PepperPluginInfo CreateWidevineCdmInfo(const base::FilePath& path,
79 const std::string& version) {
80 content::PepperPluginInfo widevine_cdm;
81 widevine_cdm.is_out_of_process = true;
82 widevine_cdm.path = path;
83 widevine_cdm.name = kWidevineCdmDisplayName;
84 widevine_cdm.description = kWidevineCdmDescription +
85 std::string(" (version: ") +
87 widevine_cdm.version = version;
88 content::WebPluginMimeType widevine_cdm_mime_type(
89 kWidevineCdmPluginMimeType,
90 kWidevineCdmPluginExtension,
91 kWidevineCdmPluginMimeTypeDescription);
93 // Add the supported codecs as if they came from the component manifest.
94 std::vector<std::string> codecs;
95 codecs.push_back(kCdmSupportedCodecVp8);
96 codecs.push_back(kCdmSupportedCodecVp9);
97 #if defined(USE_PROPRIETARY_CODECS)
98 codecs.push_back(kCdmSupportedCodecAvc1);
99 #endif // defined(USE_PROPRIETARY_CODECS)
100 std::string codec_string = base::JoinString(
101 codecs, std::string(1, kCdmSupportedCodecsValueDelimiter));
102 widevine_cdm_mime_type.additional_param_names.push_back(
103 base::ASCIIToUTF16(kCdmSupportedCodecsParamName));
104 widevine_cdm_mime_type.additional_param_values.push_back(
105 base::ASCIIToUTF16(codec_string));
107 widevine_cdm.mime_types.push_back(widevine_cdm_mime_type);
108 widevine_cdm.permissions = kWidevineCdmPluginPermissions;
114 void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
115 content::PepperPluginInfo pdf_info;
116 pdf_info.is_internal = true;
117 pdf_info.is_out_of_process = true;
118 pdf_info.name = "Chromium PDF Viewer";
119 pdf_info.description = "Portable Document Format";
120 pdf_info.path = base::FilePath::FromUTF8Unsafe(kPdfPluginPath);
121 content::WebPluginMimeType pdf_mime_type(kPdfPluginMimeType, "pdf",
122 "Portable Document Format");
123 pdf_info.mime_types.push_back(pdf_mime_type);
124 pdf_info.internal_entry_points.get_interface = chrome_pdf::PPP_GetInterface;
125 pdf_info.internal_entry_points.initialize_module =
126 chrome_pdf::PPP_InitializeModule;
127 pdf_info.internal_entry_points.shutdown_module =
128 chrome_pdf::PPP_ShutdownModule;
129 pdf_info.permissions = ppapi::PERMISSION_PRIVATE | ppapi::PERMISSION_DEV;
130 plugins->push_back(pdf_info);
133 void ConvertStringWithSeparatorToVector(std::vector<std::string>* vec,
134 const char* separator,
135 const char* cmd_switch) {
136 auto command_line = base::CommandLine::ForCurrentProcess();
137 auto string_with_separator = command_line->GetSwitchValueASCII(cmd_switch);
138 if (!string_with_separator.empty())
139 *vec = base::SplitString(string_with_separator, separator,
140 base::TRIM_WHITESPACE,
141 base::SPLIT_WANT_NONEMPTY);
146 void AddPepperFlashFromCommandLine(
147 std::vector<content::PepperPluginInfo>* plugins) {
148 auto command_line = base::CommandLine::ForCurrentProcess();
149 base::FilePath flash_path = command_line->GetSwitchValuePath(
150 switches::kPpapiFlashPath);
151 if (flash_path.empty())
154 auto flash_version = command_line->GetSwitchValueASCII(
155 switches::kPpapiFlashVersion);
157 plugins->push_back(CreatePepperFlashInfo(flash_path, flash_version));
160 #if defined(WIDEVINE_CDM_AVAILABLE) && BUILDFLAG(ENABLE_PEPPER_CDMS)
161 void AddWidevineCdmFromCommandLine(
162 std::vector<content::PepperPluginInfo>* plugins) {
163 auto command_line = base::CommandLine::ForCurrentProcess();
164 base::FilePath widevine_cdm_path = command_line->GetSwitchValuePath(
165 switches::kWidevineCdmPath);
166 if (widevine_cdm_path.empty())
169 if (!base::PathExists(widevine_cdm_path))
172 auto widevine_cdm_version = command_line->GetSwitchValueASCII(
173 switches::kWidevineCdmVersion);
174 if (widevine_cdm_version.empty())
177 plugins->push_back(CreateWidevineCdmInfo(widevine_cdm_path,
178 widevine_cdm_version));
182 AtomContentClient::AtomContentClient() {
185 AtomContentClient::~AtomContentClient() {
188 std::string AtomContentClient::GetProduct() const {
189 return "Chrome/" CHROME_VERSION_STRING;
192 std::string AtomContentClient::GetUserAgent() const {
193 const std::string system_info= EflWebView::VersionInfo::GetInstance()->OSType();
194 return content::BuildUserAgentFromOSAndProduct(
195 system_info,"Chrome/" CHROME_VERSION_STRING " " ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING);
198 base::string16 AtomContentClient::GetLocalizedString(int message_id) const {
199 return l10n_util::GetStringUTF16(message_id);
202 void AtomContentClient::AddAdditionalSchemes(
203 std::vector<url::SchemeWithType>* standard_schemes,
204 std::vector<url::SchemeWithType>* referrer_schemes,
205 std::vector<std::string>* savable_schemes) {
206 standard_schemes->push_back({"chrome-extension", url::SCHEME_WITHOUT_PORT});
209 void AtomContentClient::AddPepperPlugins(
210 std::vector<content::PepperPluginInfo>* plugins) {
211 AddPepperFlashFromCommandLine(plugins);
212 #if defined(WIDEVINE_CDM_AVAILABLE) && BUILDFLAG(ENABLE_PEPPER_CDMS)
213 AddWidevineCdmFromCommandLine(plugins);
215 ComputeBuiltInPlugins(plugins);
218 void AtomContentClient::AddServiceWorkerSchemes(
219 std::set<std::string>* service_worker_schemes) {
220 std::vector<std::string> schemes;
221 ConvertStringWithSeparatorToVector(&schemes, ",",
222 switches::kRegisterServiceWorkerSchemes);
223 for (const std::string& scheme : schemes)
224 service_worker_schemes->insert(scheme);
226 service_worker_schemes->insert(url::kFileScheme);
229 void AtomContentClient::AddSecureSchemesAndOrigins(
230 std::set<std::string>* secure_schemes,
231 std::set<GURL>* secure_origins) {
232 std::vector<std::string> schemes;
233 ConvertStringWithSeparatorToVector(&schemes, ",", switches::kSecureSchemes);
234 for (const std::string& scheme : schemes)
235 secure_schemes->insert(scheme);