atom_content_client.cc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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.
  4. #include "atom/app/atom_content_client.h"
  5. #include <string>
  6. #include <vector>
  7. #include "atom/common/atom_version.h"
  8. #include "atom/common/chrome_version.h"
  9. #include "atom/common/options_switches.h"
  10. #include "base/command_line.h"
  11. #include "base/files/file_util.h"
  12. #include "base/strings/string_split.h"
  13. #include "base/strings/string_util.h"
  14. #include "base/strings/utf_string_conversions.h"
  15. #include "content/public/common/content_constants.h"
  16. #include "content/public/common/pepper_plugin_info.h"
  17. #include "content/public/common/user_agent.h"
  18. #include "ppapi/shared_impl/ppapi_permissions.h"
  19. #include "third_party/widevine/cdm/stub/widevine_cdm_version.h"
  20. #include "ui/base/l10n/l10n_util.h"
  21. #include "url/url_constants.h"
  22. #if defined(WIDEVINE_CDM_AVAILABLE) && defined(ENABLE_PEPPER_CDMS)
  23. #include "chrome/common/widevine_cdm_constants.h"
  24. #endif
  25. namespace atom {
  26. namespace {
  27. content::PepperPluginInfo CreatePepperFlashInfo(const base::FilePath& path,
  28. const std::string& version) {
  29. content::PepperPluginInfo plugin;
  30. plugin.is_out_of_process = true;
  31. plugin.name = content::kFlashPluginName;
  32. plugin.path = path;
  33. plugin.permissions = ppapi::PERMISSION_ALL_BITS;
  34. std::vector<std::string> flash_version_numbers = base::SplitString(
  35. version, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
  36. if (flash_version_numbers.size() < 1)
  37. flash_version_numbers.push_back("11");
  38. // |SplitString()| puts in an empty string given an empty string. :(
  39. else if (flash_version_numbers[0].empty())
  40. flash_version_numbers[0] = "11";
  41. if (flash_version_numbers.size() < 2)
  42. flash_version_numbers.push_back("2");
  43. if (flash_version_numbers.size() < 3)
  44. flash_version_numbers.push_back("999");
  45. if (flash_version_numbers.size() < 4)
  46. flash_version_numbers.push_back("999");
  47. // E.g., "Shockwave Flash 10.2 r154":
  48. plugin.description = plugin.name + " " + flash_version_numbers[0] + "." +
  49. flash_version_numbers[1] + " r" + flash_version_numbers[2];
  50. plugin.version = base::JoinString(flash_version_numbers, ".");
  51. content::WebPluginMimeType swf_mime_type(
  52. content::kFlashPluginSwfMimeType,
  53. content::kFlashPluginSwfExtension,
  54. content::kFlashPluginSwfDescription);
  55. plugin.mime_types.push_back(swf_mime_type);
  56. content::WebPluginMimeType spl_mime_type(
  57. content::kFlashPluginSplMimeType,
  58. content::kFlashPluginSplExtension,
  59. content::kFlashPluginSplDescription);
  60. plugin.mime_types.push_back(spl_mime_type);
  61. return plugin;
  62. }
  63. #if defined(WIDEVINE_CDM_AVAILABLE) && defined(ENABLE_PEPPER_CDMS)
  64. content::PepperPluginInfo CreateWidevineCdmInfo(const base::FilePath& path,
  65. const std::string& version) {
  66. content::PepperPluginInfo widevine_cdm;
  67. widevine_cdm.is_out_of_process = true;
  68. widevine_cdm.path = path;
  69. widevine_cdm.name = kWidevineCdmDisplayName;
  70. widevine_cdm.description = kWidevineCdmDescription +
  71. std::string(" (version: ") +
  72. version + ")";
  73. widevine_cdm.version = version;
  74. content::WebPluginMimeType widevine_cdm_mime_type(
  75. kWidevineCdmPluginMimeType,
  76. kWidevineCdmPluginExtension,
  77. kWidevineCdmPluginMimeTypeDescription);
  78. // Add the supported codecs as if they came from the component manifest.
  79. std::vector<std::string> codecs;
  80. codecs.push_back(kCdmSupportedCodecVp8);
  81. codecs.push_back(kCdmSupportedCodecVp9);
  82. #if defined(USE_PROPRIETARY_CODECS)
  83. codecs.push_back(kCdmSupportedCodecAvc1);
  84. #endif // defined(USE_PROPRIETARY_CODECS)
  85. std::string codec_string = base::JoinString(
  86. codecs, std::string(1, kCdmSupportedCodecsValueDelimiter));
  87. widevine_cdm_mime_type.additional_param_names.push_back(
  88. base::ASCIIToUTF16(kCdmSupportedCodecsParamName));
  89. widevine_cdm_mime_type.additional_param_values.push_back(
  90. base::ASCIIToUTF16(codec_string));
  91. widevine_cdm.mime_types.push_back(widevine_cdm_mime_type);
  92. widevine_cdm.permissions = kWidevineCdmPluginPermissions;
  93. return widevine_cdm;
  94. }
  95. #endif
  96. void ConvertStringWithSeparatorToVector(std::vector<std::string>* vec,
  97. const char* separator,
  98. const char* cmd_switch) {
  99. auto command_line = base::CommandLine::ForCurrentProcess();
  100. auto string_with_separator = command_line->GetSwitchValueASCII(cmd_switch);
  101. if (!string_with_separator.empty())
  102. *vec = base::SplitString(string_with_separator, separator,
  103. base::TRIM_WHITESPACE,
  104. base::SPLIT_WANT_NONEMPTY);
  105. }
  106. } // namespace
  107. void AddPepperFlashFromCommandLine(
  108. std::vector<content::PepperPluginInfo>* plugins) {
  109. auto command_line = base::CommandLine::ForCurrentProcess();
  110. base::FilePath flash_path = command_line->GetSwitchValuePath(
  111. switches::kPpapiFlashPath);
  112. if (flash_path.empty())
  113. return;
  114. auto flash_version = command_line->GetSwitchValueASCII(
  115. switches::kPpapiFlashVersion);
  116. plugins->push_back(CreatePepperFlashInfo(flash_path, flash_version));
  117. }
  118. #if defined(WIDEVINE_CDM_AVAILABLE) && defined(ENABLE_PEPPER_CDMS)
  119. void AddWidevineCdmFromCommandLine(
  120. std::vector<content::PepperPluginInfo>* plugins) {
  121. auto command_line = base::CommandLine::ForCurrentProcess();
  122. base::FilePath widevine_cdm_path = command_line->GetSwitchValuePath(
  123. switches::kWidevineCdmPath);
  124. if (widevine_cdm_path.empty())
  125. return;
  126. if (!base::PathExists(widevine_cdm_path))
  127. return;
  128. auto widevine_cdm_version = command_line->GetSwitchValueASCII(
  129. switches::kWidevineCdmVersion);
  130. if (widevine_cdm_version.empty())
  131. return;
  132. plugins->push_back(CreateWidevineCdmInfo(widevine_cdm_path,
  133. widevine_cdm_version));
  134. }
  135. #endif
  136. AtomContentClient::AtomContentClient() {
  137. }
  138. AtomContentClient::~AtomContentClient() {
  139. }
  140. std::string AtomContentClient::GetProduct() const {
  141. return "Chrome/" CHROME_VERSION_STRING;
  142. }
  143. std::string AtomContentClient::GetUserAgent() const {
  144. return content::BuildUserAgentFromProduct(
  145. "Chrome/" CHROME_VERSION_STRING " "
  146. ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING);
  147. }
  148. base::string16 AtomContentClient::GetLocalizedString(int message_id) const {
  149. return l10n_util::GetStringUTF16(message_id);
  150. }
  151. void AtomContentClient::AddAdditionalSchemes(
  152. std::vector<url::SchemeWithType>* standard_schemes,
  153. std::vector<url::SchemeWithType>* referrer_schemes,
  154. std::vector<std::string>* savable_schemes) {
  155. standard_schemes->push_back({"chrome-extension", url::SCHEME_WITHOUT_PORT});
  156. }
  157. void AtomContentClient::AddPepperPlugins(
  158. std::vector<content::PepperPluginInfo>* plugins) {
  159. AddPepperFlashFromCommandLine(plugins);
  160. #if defined(WIDEVINE_CDM_AVAILABLE) && defined(ENABLE_PEPPER_CDMS)
  161. AddWidevineCdmFromCommandLine(plugins);
  162. #endif
  163. }
  164. void AtomContentClient::AddServiceWorkerSchemes(
  165. std::set<std::string>* service_worker_schemes) {
  166. std::vector<std::string> schemes;
  167. ConvertStringWithSeparatorToVector(&schemes, ",",
  168. switches::kRegisterServiceWorkerSchemes);
  169. if (!schemes.empty()) {
  170. for (const std::string& scheme : schemes)
  171. service_worker_schemes->insert(scheme);
  172. }
  173. service_worker_schemes->insert(url::kFileScheme);
  174. }
  175. } // namespace atom