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

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

Issue 2835803002: Refactor the UpdateEngine and its actions in the component updater. (Closed)
Patch Set: feedback up to #6 Created 3 years, 8 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 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 "components/update_client/update_client.h" 5 #include "components/update_client/update_client.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <queue> 8 #include <queue>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/bind_helpers.h" 14 #include "base/bind_helpers.h"
15 #include "base/callback.h" 15 #include "base/callback.h"
16 #include "base/location.h" 16 #include "base/location.h"
17 #include "base/logging.h" 17 #include "base/logging.h"
18 #include "base/macros.h" 18 #include "base/macros.h"
19 #include "base/memory/ptr_util.h"
19 #include "base/observer_list.h" 20 #include "base/observer_list.h"
20 #include "base/sequenced_task_runner.h" 21 #include "base/sequenced_task_runner.h"
21 #include "base/single_thread_task_runner.h" 22 #include "base/single_thread_task_runner.h"
22 #include "base/threading/sequenced_worker_pool.h" 23 #include "base/threading/sequenced_worker_pool.h"
23 #include "base/threading/thread_checker.h" 24 #include "base/threading/thread_checker.h"
24 #include "base/threading/thread_task_runner_handle.h" 25 #include "base/threading/thread_task_runner_handle.h"
25 #include "components/prefs/pref_registry_simple.h" 26 #include "components/prefs/pref_registry_simple.h"
26 #include "components/update_client/configurator.h" 27 #include "components/update_client/configurator.h"
27 #include "components/update_client/crx_update_item.h" 28 #include "components/update_client/crx_update_item.h"
28 #include "components/update_client/persisted_data.h" 29 #include "components/update_client/persisted_data.h"
29 #include "components/update_client/ping_manager.h" 30 #include "components/update_client/ping_manager.h"
31 #include "components/update_client/task_send_uninstall_ping.h"
30 #include "components/update_client/task_update.h" 32 #include "components/update_client/task_update.h"
31 #include "components/update_client/update_checker.h" 33 #include "components/update_client/update_checker.h"
32 #include "components/update_client/update_client_errors.h" 34 #include "components/update_client/update_client_errors.h"
33 #include "components/update_client/update_client_internal.h" 35 #include "components/update_client/update_client_internal.h"
34 #include "components/update_client/update_engine.h" 36 #include "components/update_client/update_engine.h"
35 #include "components/update_client/update_response.h" 37 #include "components/update_client/update_response.h"
36 #include "components/update_client/utils.h" 38 #include "components/update_client/utils.h"
37 #include "url/gurl.h" 39 #include "url/gurl.h"
38 40
39 namespace update_client { 41 namespace update_client {
40 42
41 CrxUpdateItem::CrxUpdateItem() 43 CrxUpdateItem::CrxUpdateItem() : state(ComponentState::kNew) {}
42 : state(State::kNew), 44
43 on_demand(false), 45 CrxUpdateItem::~CrxUpdateItem() {
44 diff_update_failed(false),
45 error_category(0),
46 error_code(0),
47 extra_code1(0),
48 diff_error_category(0),
49 diff_error_code(0),
50 diff_extra_code1(0) {
51 } 46 }
52 47
53 CrxUpdateItem::CrxUpdateItem(const CrxUpdateItem& other) = default; 48 CrxUpdateItem::CrxUpdateItem(const CrxUpdateItem& other) = default;
54 49
55 CrxUpdateItem::~CrxUpdateItem() {
56 }
57
58 CrxComponent::CrxComponent() 50 CrxComponent::CrxComponent()
59 : allows_background_download(true), 51 : allows_background_download(true),
60 requires_network_encryption(true), 52 requires_network_encryption(true),
61 supports_group_policy_enable_component_updates(false) {} 53 supports_group_policy_enable_component_updates(false) {}
62 54
63 CrxComponent::CrxComponent(const CrxComponent& other) = default; 55 CrxComponent::CrxComponent(const CrxComponent& other) = default;
64 56
65 CrxComponent::~CrxComponent() { 57 CrxComponent::~CrxComponent() {
66 } 58 }
67 59
68 // It is important that an instance of the UpdateClient binds an unretained 60 // It is important that an instance of the UpdateClient binds an unretained
69 // pointer to itself. Otherwise, a life time circular dependency between this 61 // pointer to itself. Otherwise, a life time circular dependency between this
70 // instance and its inner members prevents the destruction of this instance. 62 // instance and its inner members prevents the destruction of this instance.
71 // Using unretained references is allowed in this case since the life time of 63 // Using unretained references is allowed in this case since the life time of
72 // the UpdateClient instance exceeds the life time of its inner members, 64 // the UpdateClient instance exceeds the life time of its inner members,
73 // including any thread objects that might execute callbacks bound to it. 65 // including any thread objects that might execute callbacks bound to it.
74 UpdateClientImpl::UpdateClientImpl( 66 UpdateClientImpl::UpdateClientImpl(
75 const scoped_refptr<Configurator>& config, 67 const scoped_refptr<Configurator>& config,
76 std::unique_ptr<PingManager> ping_manager, 68 std::unique_ptr<PingManager> ping_manager,
77 UpdateChecker::Factory update_checker_factory, 69 UpdateChecker::Factory update_checker_factory,
78 CrxDownloader::Factory crx_downloader_factory) 70 CrxDownloader::Factory crx_downloader_factory)
79 : is_stopped_(false), 71 : is_stopped_(false),
80 config_(config), 72 config_(config),
81 ping_manager_(std::move(ping_manager)), 73 ping_manager_(std::move(ping_manager)),
82 update_engine_( 74 update_engine_(base::MakeUnique<UpdateEngine>(
83 new UpdateEngine(config, 75 config,
84 update_checker_factory, 76 update_checker_factory,
85 crx_downloader_factory, 77 crx_downloader_factory,
86 ping_manager_.get(), 78 ping_manager_.get(),
87 base::Bind(&UpdateClientImpl::NotifyObservers, 79 base::Bind(&UpdateClientImpl::NotifyObservers,
88 base::Unretained(this)))) {} 80 base::Unretained(this)))) {}
89 81
90 UpdateClientImpl::~UpdateClientImpl() { 82 UpdateClientImpl::~UpdateClientImpl() {
91 DCHECK(thread_checker_.CalledOnValidThread()); 83 DCHECK(thread_checker_.CalledOnValidThread());
92 84
93 DCHECK(task_queue_.empty()); 85 DCHECK(task_queue_.empty());
94 DCHECK(tasks_.empty()); 86 DCHECK(tasks_.empty());
95 87
96 config_ = nullptr; 88 config_ = nullptr;
97 } 89 }
98 90
99 void UpdateClientImpl::Install(const std::string& id, 91 void UpdateClientImpl::Install(const std::string& id,
100 const CrxDataCallback& crx_data_callback, 92 const CrxDataCallback& crx_data_callback,
101 const Callback& callback) { 93 const Callback& callback) {
102 DCHECK(thread_checker_.CalledOnValidThread()); 94 DCHECK(thread_checker_.CalledOnValidThread());
103 95
104 if (IsUpdating(id)) { 96 if (IsUpdating(id)) {
105 callback.Run(Error::UPDATE_IN_PROGRESS); 97 callback.Run(Error::UPDATE_IN_PROGRESS);
106 return; 98 return;
107 } 99 }
108 100
109 std::vector<std::string> ids; 101 std::vector<std::string> ids = {id};
110 ids.push_back(id);
111 102
112 // Partially applies |callback| to OnTaskComplete, so this argument is 103 // Partially applies |callback| to OnTaskComplete, so this argument is
113 // available when the task completes, along with the task itself. 104 // available when the task completes, along with the task itself.
114 std::unique_ptr<TaskUpdate> task(new TaskUpdate( 105 std::unique_ptr<TaskUpdate> task = base::MakeUnique<TaskUpdate>(
115 update_engine_.get(), true, ids, crx_data_callback, 106 update_engine_.get(), true, ids, crx_data_callback,
116 base::Bind(&UpdateClientImpl::OnTaskComplete, this, callback))); 107 base::Bind(&UpdateClientImpl::OnTaskComplete, this, callback));
117 108
118 // Install tasks are run concurrently and never queued up. 109 // Install tasks are run concurrently and never queued up.
119 RunTask(std::move(task)); 110 RunTask(std::move(task));
120 } 111 }
121 112
122 void UpdateClientImpl::Update(const std::vector<std::string>& ids, 113 void UpdateClientImpl::Update(const std::vector<std::string>& ids,
123 const CrxDataCallback& crx_data_callback, 114 const CrxDataCallback& crx_data_callback,
124 const Callback& callback) { 115 const Callback& callback) {
125 DCHECK(thread_checker_.CalledOnValidThread()); 116 DCHECK(thread_checker_.CalledOnValidThread());
126 117
127 std::unique_ptr<TaskUpdate> task(new TaskUpdate( 118 std::unique_ptr<TaskUpdate> task = base::MakeUnique<TaskUpdate>(
128 update_engine_.get(), false, ids, crx_data_callback, 119 update_engine_.get(), false, ids, crx_data_callback,
129 base::Bind(&UpdateClientImpl::OnTaskComplete, this, callback))); 120 base::Bind(&UpdateClientImpl::OnTaskComplete, this, callback));
130 121
131 // If no other tasks are running at the moment, run this update task. 122 // If no other tasks are running at the moment, run this update task.
132 // Otherwise, queue the task up. 123 // Otherwise, queue the task up.
133 if (tasks_.empty()) { 124 if (tasks_.empty()) {
134 RunTask(std::move(task)); 125 RunTask(std::move(task));
135 } else { 126 } else {
136 task_queue_.push(task.release()); 127 task_queue_.push(task.release());
137 } 128 }
138 } 129 }
139 130
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 task->Cancel(); 222 task->Cancel();
232 } 223 }
233 } 224 }
234 225
235 void UpdateClientImpl::SendUninstallPing(const std::string& id, 226 void UpdateClientImpl::SendUninstallPing(const std::string& id,
236 const base::Version& version, 227 const base::Version& version,
237 int reason, 228 int reason,
238 const Callback& callback) { 229 const Callback& callback) {
239 DCHECK(thread_checker_.CalledOnValidThread()); 230 DCHECK(thread_checker_.CalledOnValidThread());
240 231
241 // The implementation of PingManager::SendPing contains a self-deleting 232 std::unique_ptr<TaskSendUninstallPing> task =
242 // object responsible for sending the ping. 233 base::MakeUnique<TaskSendUninstallPing>(
243 CrxUpdateItem item; 234 update_engine_.get(), id, version, reason,
244 item.state = CrxUpdateItem::State::kUninstalled; 235 base::Bind(&UpdateClientImpl::OnTaskComplete, base::Unretained(this),
245 item.id = id; 236 callback));
246 item.previous_version = version; 237 RunTask(std::move(task));
247 item.next_version = base::Version("0");
248 item.extra_code1 = reason;
249
250 ping_manager_->SendPing(&item);
251
252 base::ThreadTaskRunnerHandle::Get()->PostTask(
253 FROM_HERE, base::Bind(callback, Error::NONE));
254 } 238 }
255 239
256 scoped_refptr<UpdateClient> UpdateClientFactory( 240 scoped_refptr<UpdateClient> UpdateClientFactory(
257 const scoped_refptr<Configurator>& config) { 241 const scoped_refptr<Configurator>& config) {
258 std::unique_ptr<PingManager> ping_manager(new PingManager(config)); 242 return base::MakeShared<UpdateClientImpl>(
259 return new UpdateClientImpl(config, std::move(ping_manager), 243 config, base::MakeUnique<PingManager>(config), &UpdateChecker::Create,
260 &UpdateChecker::Create, &CrxDownloader::Create); 244 &CrxDownloader::Create);
261 } 245 }
262 246
263 void RegisterPrefs(PrefRegistrySimple* registry) { 247 void RegisterPrefs(PrefRegistrySimple* registry) {
264 PersistedData::RegisterPrefs(registry); 248 PersistedData::RegisterPrefs(registry);
265 } 249 }
266 250
267 } // namespace update_client 251 } // namespace update_client
OLDNEW
« no previous file with comments | « components/update_client/update_client.h ('k') | components/update_client/update_client_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698