OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
7 #include "base/files/file_enumerator.h" | 7 #include "base/files/file_enumerator.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/message_loop/message_loop_proxy.h" | 11 #include "base/message_loop/message_loop_proxy.h" |
12 #include "base/sequenced_task_runner.h" | 12 #include "base/sequenced_task_runner.h" |
13 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
14 #include "base/values.h" | 14 #include "base/values.h" |
15 #include "base/version.h" | 15 #include "base/version.h" |
16 // TODO(ddorwin): Find a better place for ReadManifest. | 16 // TODO(ddorwin): Find a better place for ReadManifest. |
17 #include "components/component_updater/component_updater_service.h" | 17 #include "components/component_updater/component_updater_service.h" |
18 #include "components/component_updater/default_component_installer.h" | 18 #include "components/component_updater/default_component_installer.h" |
19 #include "components/update_client/component_unpacker.h" | 19 #include "components/update_client/component_unpacker.h" |
20 #include "components/update_client/update_client.h" | 20 #include "components/update_client/utils.h" |
21 | 21 |
22 using update_client::CrxComponent; | 22 using update_client::CrxComponent; |
23 | 23 |
24 namespace component_updater { | 24 namespace component_updater { |
25 | 25 |
26 namespace { | 26 namespace { |
| 27 |
27 // Version "0" corresponds to no installed version. By the server's conventions, | 28 // Version "0" corresponds to no installed version. By the server's conventions, |
28 // we represent it as a dotted quad. | 29 // we represent it as a dotted quad. |
29 const char kNullVersion[] = "0.0.0.0"; | 30 const char kNullVersion[] = "0.0.0.0"; |
| 31 |
30 } // namespace | 32 } // namespace |
31 | 33 |
32 ComponentInstallerTraits::~ComponentInstallerTraits() { | 34 ComponentInstallerTraits::~ComponentInstallerTraits() { |
33 } | 35 } |
34 | 36 |
35 DefaultComponentInstaller::DefaultComponentInstaller( | 37 DefaultComponentInstaller::DefaultComponentInstaller( |
36 scoped_ptr<ComponentInstallerTraits> installer_traits) | 38 scoped_ptr<ComponentInstallerTraits> installer_traits) |
37 : current_version_(kNullVersion), | 39 : current_version_(kNullVersion), |
38 main_task_runner_(base::MessageLoopProxy::current()) { | 40 main_task_runner_(base::MessageLoopProxy::current()) { |
39 installer_traits_ = installer_traits.Pass(); | 41 installer_traits_ = installer_traits.Pass(); |
40 } | 42 } |
41 | 43 |
42 DefaultComponentInstaller::~DefaultComponentInstaller() { | 44 DefaultComponentInstaller::~DefaultComponentInstaller() { |
43 DCHECK(thread_checker_.CalledOnValidThread()); | |
44 } | 45 } |
45 | 46 |
46 void DefaultComponentInstaller::Register(ComponentUpdateService* cus) { | 47 void DefaultComponentInstaller::Register(ComponentUpdateService* cus) { |
47 DCHECK(thread_checker_.CalledOnValidThread()); | 48 DCHECK(thread_checker_.CalledOnValidThread()); |
48 task_runner_ = cus->GetSequencedTaskRunner(); | 49 task_runner_ = cus->GetSequencedTaskRunner(); |
49 | 50 |
50 if (!installer_traits_) { | 51 if (!installer_traits_) { |
51 NOTREACHED() << "A DefaultComponentInstaller has been created but " | 52 NOTREACHED() << "A DefaultComponentInstaller has been created but " |
52 << "has no installer traits."; | 53 << "has no installer traits."; |
53 return; | 54 return; |
(...skipping 16 matching lines...) Expand all Loading... |
70 return false; | 71 return false; |
71 if (!installer_traits_->OnCustomInstall(manifest, install_path)) | 72 if (!installer_traits_->OnCustomInstall(manifest, install_path)) |
72 return false; | 73 return false; |
73 if (!installer_traits_->VerifyInstallation(manifest, install_path)) | 74 if (!installer_traits_->VerifyInstallation(manifest, install_path)) |
74 return false; | 75 return false; |
75 return true; | 76 return true; |
76 } | 77 } |
77 | 78 |
78 bool DefaultComponentInstaller::Install(const base::DictionaryValue& manifest, | 79 bool DefaultComponentInstaller::Install(const base::DictionaryValue& manifest, |
79 const base::FilePath& unpack_path) { | 80 const base::FilePath& unpack_path) { |
| 81 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 82 |
80 std::string manifest_version; | 83 std::string manifest_version; |
81 manifest.GetStringASCII("version", &manifest_version); | 84 manifest.GetStringASCII("version", &manifest_version); |
82 base::Version version(manifest_version.c_str()); | 85 base::Version version(manifest_version.c_str()); |
83 if (!version.IsValid()) | 86 if (!version.IsValid()) |
84 return false; | 87 return false; |
85 if (current_version_.CompareTo(version) > 0) | 88 if (current_version_.CompareTo(version) > 0) |
86 return false; | 89 return false; |
87 base::FilePath install_path = | 90 base::FilePath install_path = |
88 installer_traits_->GetBaseDirectory().AppendASCII(version.GetString()); | 91 installer_traits_->GetBaseDirectory().AppendASCII(version.GetString()); |
89 if (base::PathExists(install_path)) { | 92 if (base::PathExists(install_path)) { |
(...skipping 22 matching lines...) Expand all Loading... |
112 base::FilePath* installed_file) { | 115 base::FilePath* installed_file) { |
113 if (current_version_.Equals(base::Version(kNullVersion))) | 116 if (current_version_.Equals(base::Version(kNullVersion))) |
114 return false; // No component has been installed yet. | 117 return false; // No component has been installed yet. |
115 | 118 |
116 *installed_file = installer_traits_->GetBaseDirectory() | 119 *installed_file = installer_traits_->GetBaseDirectory() |
117 .AppendASCII(current_version_.GetString()) | 120 .AppendASCII(current_version_.GetString()) |
118 .AppendASCII(file); | 121 .AppendASCII(file); |
119 return true; | 122 return true; |
120 } | 123 } |
121 | 124 |
| 125 bool DefaultComponentInstaller::Uninstall() { |
| 126 task_runner_->PostTask( |
| 127 FROM_HERE, |
| 128 base::Bind(&DefaultComponentInstaller::UninstallOnTaskRunner, this)); |
| 129 return true; |
| 130 } |
| 131 |
122 void DefaultComponentInstaller::StartRegistration(ComponentUpdateService* cus) { | 132 void DefaultComponentInstaller::StartRegistration(ComponentUpdateService* cus) { |
123 DCHECK(task_runner_.get()); | 133 DCHECK(task_runner_.get()); |
124 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 134 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
125 base::FilePath base_dir = installer_traits_->GetBaseDirectory(); | 135 base::FilePath base_dir = installer_traits_->GetBaseDirectory(); |
126 if (!base::PathExists(base_dir) && !base::CreateDirectory(base_dir)) { | 136 if (!base::PathExists(base_dir) && !base::CreateDirectory(base_dir)) { |
127 NOTREACHED() << "Could not create the base directory for " | 137 NOTREACHED() << "Could not create the base directory for " |
128 << installer_traits_->GetName() << " (" | 138 << installer_traits_->GetName() << " (" |
129 << base_dir.MaybeAsASCII() << ")."; | 139 << base_dir.MaybeAsASCII() << ")."; |
130 return; | 140 return; |
131 } | 141 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 // browser startup. | 199 // browser startup. |
190 for (const auto& older_path : older_paths) | 200 for (const auto& older_path : older_paths) |
191 base::DeleteFile(older_path, true); | 201 base::DeleteFile(older_path, true); |
192 | 202 |
193 main_task_runner_->PostTask( | 203 main_task_runner_->PostTask( |
194 FROM_HERE, | 204 FROM_HERE, |
195 base::Bind(&DefaultComponentInstaller::FinishRegistration, | 205 base::Bind(&DefaultComponentInstaller::FinishRegistration, |
196 this, cus)); | 206 this, cus)); |
197 } | 207 } |
198 | 208 |
| 209 void DefaultComponentInstaller::UninstallOnTaskRunner() { |
| 210 DCHECK(task_runner_.get()); |
| 211 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 212 const base::FilePath base_dir = installer_traits_->GetBaseDirectory(); |
| 213 |
| 214 base::FileEnumerator file_enumerator(base_dir, false, |
| 215 base::FileEnumerator::DIRECTORIES); |
| 216 for (base::FilePath path = file_enumerator.Next(); !path.value().empty(); |
| 217 path = file_enumerator.Next()) { |
| 218 base::Version version(path.BaseName().MaybeAsASCII()); |
| 219 |
| 220 // Ignore folders that don't have valid version names. These folders are not |
| 221 // managed by the component installer, so do not try to remove them. |
| 222 if (!version.IsValid()) |
| 223 continue; |
| 224 |
| 225 if (!base::DeleteFile(path, true)) |
| 226 DLOG(ERROR) << "Couldn't delete " << path.value(); |
| 227 } |
| 228 |
| 229 // Delete the base directory if it's empty now. |
| 230 if (base::IsDirectoryEmpty(base_dir)) { |
| 231 if (base::DeleteFile(base_dir, false)) |
| 232 DLOG(ERROR) << "Couldn't delete " << base_dir.value(); |
| 233 } |
| 234 } |
| 235 |
199 base::FilePath DefaultComponentInstaller::GetInstallDirectory() { | 236 base::FilePath DefaultComponentInstaller::GetInstallDirectory() { |
200 return installer_traits_->GetBaseDirectory() | 237 return installer_traits_->GetBaseDirectory() |
201 .AppendASCII(current_version_.GetString()); | 238 .AppendASCII(current_version_.GetString()); |
202 } | 239 } |
203 | 240 |
204 void DefaultComponentInstaller::FinishRegistration( | 241 void DefaultComponentInstaller::FinishRegistration( |
205 ComponentUpdateService* cus) { | 242 ComponentUpdateService* cus) { |
206 DCHECK(thread_checker_.CalledOnValidThread()); | 243 DCHECK(thread_checker_.CalledOnValidThread()); |
207 if (installer_traits_->CanAutoUpdate()) { | 244 if (installer_traits_->CanAutoUpdate()) { |
208 CrxComponent crx; | 245 CrxComponent crx; |
(...skipping 19 matching lines...) Expand all Loading... |
228 ComponentReady(manifest_copy.Pass()); | 265 ComponentReady(manifest_copy.Pass()); |
229 } | 266 } |
230 | 267 |
231 void DefaultComponentInstaller::ComponentReady( | 268 void DefaultComponentInstaller::ComponentReady( |
232 scoped_ptr<base::DictionaryValue> manifest) { | 269 scoped_ptr<base::DictionaryValue> manifest) { |
233 installer_traits_->ComponentReady( | 270 installer_traits_->ComponentReady( |
234 current_version_, GetInstallDirectory(), manifest.Pass()); | 271 current_version_, GetInstallDirectory(), manifest.Pass()); |
235 } | 272 } |
236 | 273 |
237 } // namespace component_updater | 274 } // namespace component_updater |
OLD | NEW |