Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: chrome/browser/component_updater/widevine_cdm_component_installer.cc

Issue 42003002: Extract supported codecs from CDM component manifest. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added includes; removed DLOG Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/browser/component_updater/widevine_cdm_component_installer.h" 5 #include "chrome/browser/component_updater/widevine_cdm_component_installer.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/base_paths.h" 11 #include "base/base_paths.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/file_util.h" 14 #include "base/file_util.h"
15 #include "base/files/file_path.h" 15 #include "base/files/file_path.h"
16 #include "base/logging.h"
16 #include "base/path_service.h" 17 #include "base/path_service.h"
18 #include "base/strings/string16.h"
19 #include "base/strings/utf_string_conversions.h"
17 #include "base/values.h" 20 #include "base/values.h"
18 #include "build/build_config.h" 21 #include "build/build_config.h"
19 #include "chrome/browser/component_updater/component_updater_service.h" 22 #include "chrome/browser/component_updater/component_updater_service.h"
20 #include "chrome/browser/component_updater/default_component_installer.h" 23 #include "chrome/browser/component_updater/default_component_installer.h"
21 #include "chrome/browser/plugins/plugin_prefs.h" 24 #include "chrome/browser/plugins/plugin_prefs.h"
22 #include "chrome/common/chrome_constants.h" 25 #include "chrome/common/chrome_constants.h"
23 #include "chrome/common/chrome_paths.h" 26 #include "chrome/common/chrome_paths.h"
24 #include "chrome/common/widevine_cdm_constants.h" 27 #include "chrome/common/widevine_cdm_constants.h"
25 #include "content/public/browser/browser_thread.h" 28 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/plugin_service.h" 29 #include "content/public/browser/plugin_service.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 // Widevine CDM is packaged as a multi-CRX. Widevine CDM binaries are located in 71 // Widevine CDM is packaged as a multi-CRX. Widevine CDM binaries are located in
69 // _platform_specific/<platform_arch> folder in the package. This function 72 // _platform_specific/<platform_arch> folder in the package. This function
70 // returns the platform-specific subdirectory that is part of that multi-CRX. 73 // returns the platform-specific subdirectory that is part of that multi-CRX.
71 base::FilePath GetPlatformDirectory(const base::FilePath& base_path) { 74 base::FilePath GetPlatformDirectory(const base::FilePath& base_path) {
72 std::string platform_arch = kWidevineCdmPlatform; 75 std::string platform_arch = kWidevineCdmPlatform;
73 platform_arch += '_'; 76 platform_arch += '_';
74 platform_arch += kWidevineCdmArch; 77 platform_arch += kWidevineCdmArch;
75 return base_path.AppendASCII("_platform_specific").AppendASCII(platform_arch); 78 return base_path.AppendASCII("_platform_specific").AppendASCII(platform_arch);
76 } 79 }
77 80
78 bool MakeWidevineCdmPluginInfo(const base::FilePath& path, 81 bool MakeWidevineCdmPluginInfo(
79 const base::Version& version, 82 const base::Version& version,
80 content::PepperPluginInfo* plugin_info) { 83 const base::FilePath& path,
84 const std::vector<base::string16>& additional_param_names,
85 const std::vector<base::string16>& additional_param_values,
86 content::PepperPluginInfo* plugin_info) {
81 if (!version.IsValid() || 87 if (!version.IsValid() ||
82 version.components().size() != 88 version.components().size() !=
83 static_cast<size_t>(kWidevineCdmVersionNumComponents)) { 89 static_cast<size_t>(kWidevineCdmVersionNumComponents)) {
84 return false; 90 return false;
85 } 91 }
86 92
87 plugin_info->is_internal = false; 93 plugin_info->is_internal = false;
88 // Widevine CDM must run out of process. 94 // Widevine CDM must run out of process.
89 plugin_info->is_out_of_process = true; 95 plugin_info->is_out_of_process = true;
90 plugin_info->path = path; 96 plugin_info->path = path;
91 plugin_info->name = kWidevineCdmDisplayName; 97 plugin_info->name = kWidevineCdmDisplayName;
92 plugin_info->description = kWidevineCdmDescription; 98 plugin_info->description = kWidevineCdmDescription;
93 plugin_info->version = version.GetString(); 99 plugin_info->version = version.GetString();
94 content::WebPluginMimeType widevine_cdm_mime_type( 100 content::WebPluginMimeType widevine_cdm_mime_type(
95 kWidevineCdmPluginMimeType, 101 kWidevineCdmPluginMimeType,
96 kWidevineCdmPluginExtension, 102 kWidevineCdmPluginExtension,
97 kWidevineCdmPluginMimeTypeDescription); 103 kWidevineCdmPluginMimeTypeDescription);
104 widevine_cdm_mime_type.additional_param_names = additional_param_names;
105 widevine_cdm_mime_type.additional_param_values = additional_param_values;
98 plugin_info->mime_types.push_back(widevine_cdm_mime_type); 106 plugin_info->mime_types.push_back(widevine_cdm_mime_type);
99 plugin_info->permissions = kWidevineCdmPluginPermissions; 107 plugin_info->permissions = kWidevineCdmPluginPermissions;
100 108
101 return true; 109 return true;
102 } 110 }
103 111
104 void RegisterWidevineCdmWithChrome(const base::FilePath& path, 112 void GetAdditionalParams(const base::DictionaryValue& manifest,
105 const base::Version& version) { 113 std::vector<base::string16>* additional_param_names,
114 std::vector<base::string16>* additional_param_values) {
115 base::string16 codecs;
116 if (manifest.GetString("x-cdm-codecs", &codecs)) {
117 DLOG_IF(WARNING, codecs.empty())
118 << "Widevine CDM component manifest has empty codecs list";
119 additional_param_names->push_back(
120 base::ASCIIToUTF16(kCdmSupportedCodecsParamName));
121 additional_param_values->push_back(codecs);
122 } else {
123 DLOG(WARNING) << "Widevine CDM component manifest is missing codecs";
124 // TODO(ddorwin): Remove this once all users have been updated.
125 // The original manifests did not include this string, so add the base set.
126 additional_param_names->push_back(
127 base::ASCIIToUTF16(kCdmSupportedCodecsParamName));
128 additional_param_values->push_back(base::ASCIIToUTF16("vp8,vorbis"));
129 }
130 }
131
132 void RegisterWidevineCdmWithChrome(const base::Version& version,
133 const base::FilePath& path,
134 scoped_ptr<base::DictionaryValue> manifest) {
106 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
136 std::vector<base::string16> additional_param_names;
137 std::vector<base::string16> additional_param_values;
138 GetAdditionalParams(
139 *manifest, &additional_param_names, &additional_param_values);
107 content::PepperPluginInfo plugin_info; 140 content::PepperPluginInfo plugin_info;
108 if (!MakeWidevineCdmPluginInfo(path, version, &plugin_info)) 141 if (!MakeWidevineCdmPluginInfo(version,
142 path,
143 additional_param_names,
144 additional_param_values,
145 &plugin_info)) {
109 return; 146 return;
147 }
110 148
149 // true = Add to beginning of list to override any existing registrations.
111 PluginService::GetInstance()->RegisterInternalPlugin( 150 PluginService::GetInstance()->RegisterInternalPlugin(
112 plugin_info.ToWebPluginInfo(), true); 151 plugin_info.ToWebPluginInfo(), true);
113 PluginService::GetInstance()->RefreshPlugins(); 152 PluginService::GetInstance()->RefreshPlugins();
114 } 153 }
115 154
116 } // namespace 155 } // namespace
117 156
118 class WidevineCdmComponentInstallerTraits : public ComponentInstallerTraits { 157 class WidevineCdmComponentInstallerTraits : public ComponentInstallerTraits {
119 public: 158 public:
120 WidevineCdmComponentInstallerTraits(); 159 WidevineCdmComponentInstallerTraits();
121 virtual ~WidevineCdmComponentInstallerTraits() {} 160 virtual ~WidevineCdmComponentInstallerTraits() {}
122 161
123 private: 162 private:
124 // The following methods override ComponentInstallerTraits. 163 // The following methods override ComponentInstallerTraits.
125 virtual bool CanAutoUpdate() const OVERRIDE; 164 virtual bool CanAutoUpdate() const OVERRIDE;
126 virtual bool OnCustomInstall(const base::DictionaryValue& manifest, 165 virtual bool OnCustomInstall(const base::DictionaryValue& manifest,
127 const base::FilePath& install_dir) OVERRIDE; 166 const base::FilePath& install_dir) OVERRIDE;
128 virtual bool VerifyInstallation( 167 virtual bool VerifyInstallation(
129 const base::FilePath& install_dir) const OVERRIDE; 168 const base::FilePath& install_dir) const OVERRIDE;
130 virtual void ComponentReady(const base::Version& version, 169 virtual void ComponentReady(
131 const base::FilePath& path) OVERRIDE; 170 const base::Version& version,
171 const base::FilePath& path,
172 scoped_ptr<base::DictionaryValue> manifest) OVERRIDE;
132 virtual base::FilePath GetBaseDirectory() const OVERRIDE; 173 virtual base::FilePath GetBaseDirectory() const OVERRIDE;
133 virtual void GetHash(std::vector<uint8>* hash) const OVERRIDE; 174 virtual void GetHash(std::vector<uint8>* hash) const OVERRIDE;
134 virtual std::string GetName() const OVERRIDE; 175 virtual std::string GetName() const OVERRIDE;
135 DISALLOW_COPY_AND_ASSIGN(WidevineCdmComponentInstallerTraits); 176 DISALLOW_COPY_AND_ASSIGN(WidevineCdmComponentInstallerTraits);
136 }; 177 };
137 178
138 WidevineCdmComponentInstallerTraits::WidevineCdmComponentInstallerTraits() { 179 WidevineCdmComponentInstallerTraits::WidevineCdmComponentInstallerTraits() {
139 } 180 }
140 181
141 bool WidevineCdmComponentInstallerTraits::CanAutoUpdate() const { 182 bool WidevineCdmComponentInstallerTraits::CanAutoUpdate() const {
142 return true; 183 return true;
143 } 184 }
144 185
145 // The adapter is copied into the install directory as part of the installation. 186 // The adapter is copied into the install directory as part of the installation.
146 bool WidevineCdmComponentInstallerTraits::OnCustomInstall( 187 bool WidevineCdmComponentInstallerTraits::OnCustomInstall(
147 const base::DictionaryValue& manifest, 188 const base::DictionaryValue& manifest,
148 const base::FilePath& install_path) { 189 const base::FilePath& install_path) {
149 base::FilePath adapter_install_path = GetPlatformDirectory(install_path) 190 base::FilePath adapter_install_path = GetPlatformDirectory(install_path)
150 .AppendASCII(kWidevineCdmAdapterFileName); 191 .AppendASCII(kWidevineCdmAdapterFileName);
151 base::FilePath adapter_source_path; 192 base::FilePath adapter_source_path;
152 PathService::Get(chrome::FILE_WIDEVINE_CDM_ADAPTER, &adapter_source_path); 193 PathService::Get(chrome::FILE_WIDEVINE_CDM_ADAPTER, &adapter_source_path);
153 return base::CopyFile(adapter_source_path, adapter_install_path); 194 return base::CopyFile(adapter_source_path, adapter_install_path);
154 } 195 }
155 196
156 // Once the component is installed, register the new version with Chrome. 197 // Once the component is installed, register the new version with Chrome.
157 void WidevineCdmComponentInstallerTraits::ComponentReady( 198 void WidevineCdmComponentInstallerTraits::ComponentReady(
158 const base::Version& version, 199 const base::Version& version,
159 const base::FilePath& path) { 200 const base::FilePath& path,
201 scoped_ptr<base::DictionaryValue> manifest) {
202 // TODO(ddorwin): Check API version compatibility. Return if fails.
160 base::FilePath adapter_install_path = GetPlatformDirectory(path) 203 base::FilePath adapter_install_path = GetPlatformDirectory(path)
161 .AppendASCII(kWidevineCdmAdapterFileName); 204 .AppendASCII(kWidevineCdmAdapterFileName);
162 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 205 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
163 &RegisterWidevineCdmWithChrome, adapter_install_path, version)); 206 &RegisterWidevineCdmWithChrome,
207 version, adapter_install_path, base::Passed(&manifest)));
164 } 208 }
165 209
166 bool WidevineCdmComponentInstallerTraits::VerifyInstallation( 210 bool WidevineCdmComponentInstallerTraits::VerifyInstallation(
167 const base::FilePath& install_dir) const { 211 const base::FilePath& install_dir) const {
168 return base::PathExists(GetPlatformDirectory(install_dir) 212 return base::PathExists(GetPlatformDirectory(install_dir)
169 .AppendASCII(kWidevineCdmFileName)) 213 .AppendASCII(kWidevineCdmFileName))
170 && base::PathExists(GetPlatformDirectory(install_dir) 214 && base::PathExists(GetPlatformDirectory(install_dir)
171 .AppendASCII(kWidevineCdmAdapterFileName)); 215 .AppendASCII(kWidevineCdmAdapterFileName));
172 } 216 }
173 217
(...skipping 25 matching lines...) Expand all
199 scoped_ptr<ComponentInstallerTraits> traits( 243 scoped_ptr<ComponentInstallerTraits> traits(
200 new WidevineCdmComponentInstallerTraits); 244 new WidevineCdmComponentInstallerTraits);
201 // |cus| will take ownership of |installer| during installer->Register(cus). 245 // |cus| will take ownership of |installer| during installer->Register(cus).
202 DefaultComponentInstaller* installer 246 DefaultComponentInstaller* installer
203 = new DefaultComponentInstaller(traits.Pass()); 247 = new DefaultComponentInstaller(traits.Pass());
204 installer->Register(cus); 248 installer->Register(cus);
205 #else 249 #else
206 return; 250 return;
207 #endif // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) 251 #endif // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
208 } 252 }
OLDNEW
« no previous file with comments | « chrome/browser/component_updater/default_component_installer.cc ('k') | chrome/common/chrome_content_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698