OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/file_util.h" | 6 #include "base/file_util.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/values.h" | 9 #include "base/values.h" |
10 #include "base/version.h" | 10 #include "base/version.h" |
11 #include "chrome/browser/component_updater/default_component_installer.h" | 11 #include "chrome/browser/component_updater/default_component_installer.h" |
12 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
13 | 13 |
14 namespace { | 14 namespace { |
15 // Version "0" corresponds to no installed version. By the server's conventions, | 15 // Version "0" corresponds to no installed version. By the server's conventions, |
16 // we represent it as a dotted quad. | 16 // we represent it as a dotted quad. |
17 const char kNullVersion[] = "0.0.0.0"; | 17 const char kNullVersion[] = "0.0.0.0"; |
18 } // namespace | 18 } // namespace |
19 | 19 |
| 20 ComponentInstallerTraits::~ComponentInstallerTraits() { |
| 21 } |
| 22 |
20 DefaultComponentInstaller::DefaultComponentInstaller( | 23 DefaultComponentInstaller::DefaultComponentInstaller( |
21 scoped_ptr<ComponentInstallerTraits> installer_traits) | 24 scoped_ptr<ComponentInstallerTraits> installer_traits) |
22 : current_version_(kNullVersion) { | 25 : current_version_(kNullVersion) { |
23 installer_traits_ = installer_traits.Pass(); | 26 installer_traits_ = installer_traits.Pass(); |
24 } | 27 } |
25 | 28 |
26 DefaultComponentInstaller::~DefaultComponentInstaller() { | 29 DefaultComponentInstaller::~DefaultComponentInstaller() { |
27 } | 30 } |
28 | 31 |
29 void DefaultComponentInstaller::Register(ComponentUpdateService* cus) { | 32 void DefaultComponentInstaller::Register(ComponentUpdateService* cus) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 installer_traits_->GetBaseDirectory().AppendASCII(version.GetString()); | 72 installer_traits_->GetBaseDirectory().AppendASCII(version.GetString()); |
70 if (base::PathExists(install_path)) { | 73 if (base::PathExists(install_path)) { |
71 if (!base::DeleteFile(install_path, true)) | 74 if (!base::DeleteFile(install_path, true)) |
72 return false; | 75 return false; |
73 } | 76 } |
74 if (!InstallHelper(manifest, unpack_path, install_path)) { | 77 if (!InstallHelper(manifest, unpack_path, install_path)) { |
75 base::DeleteFile(install_path, true); | 78 base::DeleteFile(install_path, true); |
76 return false; | 79 return false; |
77 } | 80 } |
78 current_version_ = version; | 81 current_version_ = version; |
79 installer_traits_->ComponentReady(current_version_, GetInstallDirectory()); | 82 current_manifest_.reset(manifest.DeepCopy()); |
| 83 installer_traits_->ComponentReady( |
| 84 current_version_, |
| 85 GetInstallDirectory(), |
| 86 scoped_ptr<base::DictionaryValue>(current_manifest_->DeepCopy()).Pass()); |
80 return true; | 87 return true; |
81 } | 88 } |
82 | 89 |
83 bool DefaultComponentInstaller::GetInstalledFile( | 90 bool DefaultComponentInstaller::GetInstalledFile( |
84 const std::string& file, | 91 const std::string& file, |
85 base::FilePath* installed_file) { | 92 base::FilePath* installed_file) { |
86 if (current_version_.Equals(base::Version(kNullVersion))) | 93 if (current_version_.Equals(base::Version(kNullVersion))) |
87 return false; // No component has been installed yet. | 94 return false; // No component has been installed yet. |
88 | 95 |
89 *installed_file = | 96 *installed_file = |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 } | 133 } |
127 } else { | 134 } else { |
128 latest_dir = path; | 135 latest_dir = path; |
129 latest_version = version; | 136 latest_version = version; |
130 found = true; | 137 found = true; |
131 } | 138 } |
132 } | 139 } |
133 | 140 |
134 if (found) { | 141 if (found) { |
135 current_version_ = latest_version; | 142 current_version_ = latest_version; |
| 143 // TODO(waffles): Why do we save these as members rather than passing them |
| 144 // to FinishRegistration()? |
136 base::ReadFileToString(latest_dir.AppendASCII("manifest.fingerprint"), | 145 base::ReadFileToString(latest_dir.AppendASCII("manifest.fingerprint"), |
137 ¤t_fingerprint_); | 146 ¤t_fingerprint_); |
| 147 current_manifest_.reset(ReadComponentManifest(latest_dir)); |
| 148 if (!current_manifest_) { |
| 149 DLOG(ERROR) << "Failed to read manifest for " |
| 150 << installer_traits_->GetName() << " (" |
| 151 << base_dir.MaybeAsASCII() << ")."; |
| 152 return; |
| 153 } |
138 } | 154 } |
139 | 155 |
140 // Remove older versions of the component. None should be in use during | 156 // Remove older versions of the component. None should be in use during |
141 // browser startup. | 157 // browser startup. |
142 for (std::vector<base::FilePath>::iterator iter = older_dirs.begin(); | 158 for (std::vector<base::FilePath>::iterator iter = older_dirs.begin(); |
143 iter != older_dirs.end(); ++iter) { | 159 iter != older_dirs.end(); ++iter) { |
144 base::DeleteFile(*iter, true); | 160 base::DeleteFile(*iter, true); |
145 } | 161 } |
146 | 162 |
147 content::BrowserThread::PostTask( | 163 content::BrowserThread::PostTask( |
(...skipping 19 matching lines...) Expand all Loading... |
167 installer_traits_->GetHash(&crx.pk_hash); | 183 installer_traits_->GetHash(&crx.pk_hash); |
168 ComponentUpdateService::Status status = cus->RegisterComponent(crx); | 184 ComponentUpdateService::Status status = cus->RegisterComponent(crx); |
169 if (status != ComponentUpdateService::kOk && | 185 if (status != ComponentUpdateService::kOk && |
170 status != ComponentUpdateService::kReplaced) { | 186 status != ComponentUpdateService::kReplaced) { |
171 NOTREACHED() << "Component registration failed for " | 187 NOTREACHED() << "Component registration failed for " |
172 << installer_traits_->GetName(); | 188 << installer_traits_->GetName(); |
173 return; | 189 return; |
174 } | 190 } |
175 | 191 |
176 if (current_version_.CompareTo(base::Version(kNullVersion)) > 0) { | 192 if (current_version_.CompareTo(base::Version(kNullVersion)) > 0) { |
| 193 // TODO(waffles): Why is this function called on the FILE thread? The only |
| 194 // implementation just posts back to the UI thread. Should we instead post |
| 195 // to UI in Install()? |
| 196 scoped_ptr<base::DictionaryValue> manifest_copy( |
| 197 current_manifest_->DeepCopy()); |
177 content::BrowserThread::PostTask( | 198 content::BrowserThread::PostTask( |
178 content::BrowserThread::FILE, FROM_HERE, | 199 content::BrowserThread::FILE, FROM_HERE, |
179 base::Bind(&ComponentInstallerTraits::ComponentReady, | 200 base::Bind(&ComponentInstallerTraits::ComponentReady, |
180 base::Unretained(installer_traits_.get()), | 201 base::Unretained(installer_traits_.get()), |
181 current_version_, | 202 current_version_, |
182 GetInstallDirectory())); | 203 GetInstallDirectory(), |
| 204 base::Passed(&manifest_copy))); |
183 } | 205 } |
184 } | 206 } |
OLD | NEW |