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

Side by Side Diff: components/update_client/action_update_check.cc

Issue 2700733002: Mechanical refactoring of the parser and ActionUpdateCheck (Closed)
Patch Set: . Created 3 years, 10 months 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/update_client/action_update_check.h" 5 #include "components/update_client/action_update_check.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 if (!error) 107 if (!error)
108 OnUpdateCheckSucceeded(results); 108 OnUpdateCheckSucceeded(results);
109 else 109 else
110 OnUpdateCheckFailed(error); 110 OnUpdateCheckFailed(error);
111 } 111 }
112 112
113 void ActionUpdateCheck::OnUpdateCheckSucceeded( 113 void ActionUpdateCheck::OnUpdateCheckSucceeded(
114 const UpdateResponse::Results& results) { 114 const UpdateResponse::Results& results) {
115 DCHECK(thread_checker_.CalledOnValidThread()); 115 DCHECK(thread_checker_.CalledOnValidThread());
116 VLOG(1) << "Update check succeeded."; 116 VLOG(1) << "Update check succeeded.";
117 std::vector<UpdateResponse::Result>::const_iterator it;
118 for (it = results.list.begin(); it != results.list.end(); ++it) {
119 CrxUpdateItem* crx = FindUpdateItemById(it->extension_id);
120 if (!crx)
121 continue;
122 117
123 if (crx->state != CrxUpdateItem::State::kChecking) { 118 for (const auto& result : results.list) {
124 NOTREACHED(); 119 CrxUpdateItem* crx = FindUpdateItemById(result.extension_id);
125 continue; // Not updating this CRX now. 120 if (!crx) {
126 } 121 VLOG(1) << "Component not found " << result.extension_id;
127
128 if (it->manifest.version.empty()) {
129 // No version means no update available.
130 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
131 VLOG(1) << "No update available for CRX: " << crx->id;
132 continue; 122 continue;
133 } 123 }
134 124
135 if (!IsVersionNewer(crx->component.version, it->manifest.version)) { 125 DCHECK_EQ(CrxUpdateItem::State::kChecking, crx->state);
136 // The CRX is up to date.
137 ChangeItemState(crx, CrxUpdateItem::State::kUpToDate);
138 VLOG(1) << "Component already up to date: " << crx->id;
139 continue;
140 }
141 126
142 if (!it->manifest.browser_min_version.empty()) { 127 if (result.status == "ok")
143 if (IsVersionNewer(browser_version_, it->manifest.browser_min_version)) { 128 HandleUpdateCheckOK(result, crx);
144 // The CRX is not compatible with this Chrome version. 129 else if (result.status == "noupdate")
145 VLOG(1) << "Ignoring incompatible CRX: " << crx->id; 130 HandleUpdateCheckNoupdate(result, crx);
146 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate); 131 else
147 continue; 132 HandleUpdateCheckError(result, crx);
148 }
149 }
150
151 if (it->manifest.packages.size() != 1) {
152 // Assume one and only one package per CRX.
153 VLOG(1) << "Ignoring multiple packages for CRX: " << crx->id;
154 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
155 continue;
156 }
157
158 // Parse the members of the result and queue an upgrade for this CRX.
159 crx->next_version = base::Version(it->manifest.version);
160
161 VLOG(1) << "Update found for CRX: " << crx->id;
162
163 const auto& package(it->manifest.packages[0]);
164 crx->next_fp = package.fingerprint;
165
166 // Resolve the urls by combining the base urls with the package names.
167 for (size_t i = 0; i != it->crx_urls.size(); ++i) {
168 const GURL url(it->crx_urls[i].Resolve(package.name));
169 if (url.is_valid())
170 crx->crx_urls.push_back(url);
171 }
172 for (size_t i = 0; i != it->crx_diffurls.size(); ++i) {
173 const GURL url(it->crx_diffurls[i].Resolve(package.namediff));
174 if (url.is_valid())
175 crx->crx_diffurls.push_back(url);
176 }
177
178 crx->hash_sha256 = package.hash_sha256;
179 crx->hashdiff_sha256 = package.hashdiff_sha256;
180
181 ChangeItemState(crx, CrxUpdateItem::State::kCanUpdate);
182
183 update_context_->queue.push(crx->id);
184 } 133 }
185 134
186 // All components that are not included in the update response are 135 // All components that are not included in the update response are
187 // considered up to date. 136 // considered up to date.
188 ChangeAllItemsState(CrxUpdateItem::State::kChecking, 137 ChangeAllItemsState(CrxUpdateItem::State::kChecking,
189 CrxUpdateItem::State::kUpToDate); 138 CrxUpdateItem::State::kUpToDate);
190 139
191 if (update_context_->queue.empty()) { 140 if (update_context_->queue.empty()) {
192 VLOG(1) << "Update check completed but no update is needed."; 141 VLOG(1) << "Update check completed but no action is needed.";
193 UpdateComplete(Error::NONE); 142 UpdateComplete(Error::NONE);
194 return; 143 return;
195 } 144 }
196 145
197 // Starts the execution flow of updating the CRXs in this context. 146 // Starts the execution flow of updating the CRXs in this context.
198 UpdateCrx(); 147 UpdateCrx();
199 } 148 }
200 149
150 void ActionUpdateCheck::HandleUpdateCheckOK(
151 const UpdateResponse::Result& result,
152 CrxUpdateItem* crx) {
153 DCHECK(thread_checker_.CalledOnValidThread());
154
155 const auto& manifest = result.manifest;
156
157 if (manifest.version.empty()) {
158 // It can't update without a manifest version.
159 VLOG(1) << "No manifest version available for CRX: " << crx->id;
160 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
161 return;
162 }
163
164 if (!IsVersionNewer(crx->component.version, manifest.version)) {
165 // The CRX is up to date.
166 VLOG(1) << "Component already up to date: " << crx->id;
167 ChangeItemState(crx, CrxUpdateItem::State::kUpToDate);
168 return;
169 }
170
171 if (!manifest.browser_min_version.empty()) {
172 if (IsVersionNewer(browser_version_, manifest.browser_min_version)) {
173 // The CRX is not compatible with this Chrome version.
174 VLOG(1) << "Ignoring incompatible CRX: " << crx->id;
175 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
176 return;
177 }
178 }
179
180 if (manifest.packages.size() != 1) {
181 // Assume one and only one package per CRX.
182 VLOG(1) << "Ignoring multiple packages for CRX: " << crx->id;
183 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
184 return;
185 }
186
187 // Parse the members of the result and queue an upgrade for this CRX.
188 VLOG(1) << "Update found for CRX: " << crx->id;
189
190 crx->next_version = base::Version(manifest.version);
191 const auto& package = manifest.packages.front();
192 crx->next_fp = package.fingerprint;
193
194 // Resolve the urls by combining the base urls with the package names.
195 for (const auto& crx_url : result.crx_urls) {
196 const GURL url = crx_url.Resolve(package.name);
197 if (url.is_valid())
198 crx->crx_urls.push_back(url);
199 }
200 for (const auto& crx_diffurl : result.crx_diffurls) {
201 const GURL url = crx_diffurl.Resolve(package.namediff);
202 if (url.is_valid())
203 crx->crx_diffurls.push_back(url);
204 }
205
206 crx->hash_sha256 = package.hash_sha256;
207 crx->hashdiff_sha256 = package.hashdiff_sha256;
208
209 ChangeItemState(crx, CrxUpdateItem::State::kCanUpdate);
210
211 update_context_->queue.push(crx->id);
212 }
213
214 void ActionUpdateCheck::HandleUpdateCheckNoupdate(
215 const UpdateResponse::Result& result,
216 CrxUpdateItem* crx) {
217 DCHECK(thread_checker_.CalledOnValidThread());
218 VLOG(1) << "No update for CRX: " << crx->id;
219 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
220 }
221
222 void ActionUpdateCheck::HandleUpdateCheckError(
223 const UpdateResponse::Result& result,
224 CrxUpdateItem* crx) {
225 DCHECK(thread_checker_.CalledOnValidThread());
226 VLOG(1) << "Update error for CRX: " << crx->id << ", " << result.status;
227 ChangeItemState(crx, CrxUpdateItem::State::kNoUpdate);
228 }
229
201 void ActionUpdateCheck::OnUpdateCheckFailed(int error) { 230 void ActionUpdateCheck::OnUpdateCheckFailed(int error) {
202 DCHECK(thread_checker_.CalledOnValidThread()); 231 DCHECK(thread_checker_.CalledOnValidThread());
203 DCHECK(error); 232 DCHECK(error);
204 233
205 VLOG(1) << "Update check failed." << error; 234 VLOG(1) << "Update check failed." << error;
206 235
207 ChangeAllItemsState(CrxUpdateItem::State::kChecking, 236 ChangeAllItemsState(CrxUpdateItem::State::kChecking,
208 CrxUpdateItem::State::kNoUpdate); 237 CrxUpdateItem::State::kNoUpdate);
209 238
210 UpdateComplete(Error::UPDATE_CHECK_ERROR); 239 UpdateComplete(Error::UPDATE_CHECK_ERROR);
211 } 240 }
212 241
213 } // namespace update_client 242 } // namespace update_client
OLDNEW
« no previous file with comments | « components/update_client/action_update_check.h ('k') | components/update_client/update_client_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698