OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/sync/driver/about_sync_util.h" | 5 #include "components/sync/driver/about_sync_util.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/logging.h" | |
11 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
12 #include "base/strings/string16.h" | 13 #include "base/strings/string16.h" |
13 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
14 #include "base/values.h" | 15 #include "base/values.h" |
15 #include "components/signin/core/browser/signin_manager_base.h" | 16 #include "components/signin/core/browser/signin_manager_base.h" |
16 #include "components/sync/driver/sync_service.h" | 17 #include "components/sync/driver/sync_service.h" |
17 #include "components/sync/engine/cycle/sync_cycle_snapshot.h" | 18 #include "components/sync/engine/cycle/sync_cycle_snapshot.h" |
18 #include "components/sync/engine/sync_status.h" | 19 #include "components/sync/engine/sync_status.h" |
19 #include "components/sync/engine/sync_string_conversions.h" | 20 #include "components/sync/engine/sync_string_conversions.h" |
20 #include "components/sync/model/time.h" | 21 #include "components/sync/model/time.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 // Creates a 'section' for display on about:sync, consisting of a title and a | 70 // Creates a 'section' for display on about:sync, consisting of a title and a |
70 // list of fields. Returns a pointer to the new section. Note that | 71 // list of fields. Returns a pointer to the new section. Note that |
71 // |parent_list|, not the caller, owns the newly added section. | 72 // |parent_list|, not the caller, owns the newly added section. |
72 base::ListValue* AddSection(base::ListValue* parent_list, | 73 base::ListValue* AddSection(base::ListValue* parent_list, |
73 const std::string& title) { | 74 const std::string& title) { |
74 std::unique_ptr<base::DictionaryValue> section(new base::DictionaryValue()); | 75 std::unique_ptr<base::DictionaryValue> section(new base::DictionaryValue()); |
75 base::ListValue* section_contents = new base::ListValue(); | 76 base::ListValue* section_contents = new base::ListValue(); |
76 section->SetString("title", title); | 77 section->SetString("title", title); |
77 section->Set("data", section_contents); | 78 section->Set("data", section_contents); |
78 section->SetBoolean("is_sensitive", false); | 79 section->SetBoolean("is_sensitive", false); |
80 // If the following |Append| results in a reallocation, pointers to | |
81 // |parent_list| and its members will be invalidated. This would result in | |
skym
2017/03/16 19:52:39
Wait, I thought I understood this, but now I'm con
jdoerrie
2017/03/23 18:11:17
My bad, your understanding is correct. I updated t
| |
82 // use-after-free in |*SyncStat::SetValue|. This is why the following CHECK is | |
83 // necessary to ensure no reallocation takes place. | |
84 CHECK_LT(parent_list->GetSize(), parent_list->capacity()); | |
79 parent_list->Append(std::move(section)); | 85 parent_list->Append(std::move(section)); |
80 return section_contents; | 86 return section_contents; |
81 } | 87 } |
82 | 88 |
83 // Same as AddSection, but for data that should be elided when dumped into text | 89 // Same as AddSection, but for data that should be elided when dumped into text |
84 // form and posted in a public forum (e.g. unique identifiers). | 90 // form and posted in a public forum (e.g. unique identifiers). |
85 base::ListValue* AddSensitiveSection(base::ListValue* parent_list, | 91 base::ListValue* AddSensitiveSection(base::ListValue* parent_list, |
86 const std::string& title) { | 92 const std::string& title) { |
87 std::unique_ptr<base::DictionaryValue> section(new base::DictionaryValue()); | 93 std::unique_ptr<base::DictionaryValue> section(new base::DictionaryValue()); |
88 base::ListValue* section_contents = new base::ListValue(); | 94 base::ListValue* section_contents = new base::ListValue(); |
89 section->SetString("title", title); | 95 section->SetString("title", title); |
90 section->Set("data", section_contents); | 96 section->Set("data", section_contents); |
91 section->SetBoolean("is_sensitive", true); | 97 section->SetBoolean("is_sensitive", true); |
98 // If the following |Append| results in a reallocation, pointers to | |
99 // |parent_list| and its members will be invalidated. This would result in | |
100 // use-after-free in |*SyncStat::SetValue|. This is why the following CHECK is | |
101 // necessary to ensure no reallocation takes place. | |
102 CHECK_LT(parent_list->GetSize(), parent_list->capacity()); | |
92 parent_list->Append(std::move(section)); | 103 parent_list->Append(std::move(section)); |
93 return section_contents; | 104 return section_contents; |
94 } | 105 } |
95 | 106 |
96 // The following helper classes help manage the about:sync fields which will be | 107 // The following helper classes help manage the about:sync fields which will be |
97 // populated in method in ConstructAboutInformation. | 108 // populated in method in ConstructAboutInformation. |
98 // | 109 // |
99 // Each instance of one of thse classes indicates a field in about:sync. Each | 110 // Each instance of one of thse classes indicates a field in about:sync. Each |
100 // field will be serialized to a DictionaryValue with entries for 'stat_name', | 111 // field will be serialized to a DictionaryValue with entries for 'stat_name', |
101 // 'stat_value' and 'is_valid'. | 112 // 'stat_value' and 'is_valid'. |
102 | 113 |
103 class StringSyncStat { | 114 class StringSyncStat { |
104 public: | 115 public: |
105 StringSyncStat(base::ListValue* section, const std::string& key); | 116 StringSyncStat(base::ListValue* section, const std::string& key); |
106 void SetValue(const std::string& value); | 117 void SetValue(const std::string& value); |
107 void SetValue(const base::string16& value); | 118 void SetValue(const base::string16& value); |
108 | 119 |
109 private: | 120 private: |
110 // Owned by the |section| passed in during construction. | 121 // Owned by the |section| passed in during construction. |
111 base::DictionaryValue* stat_; | 122 base::DictionaryValue* stat_; |
112 }; | 123 }; |
113 | 124 |
114 StringSyncStat::StringSyncStat(base::ListValue* section, | 125 StringSyncStat::StringSyncStat(base::ListValue* section, |
115 const std::string& key) { | 126 const std::string& key) { |
116 stat_ = new base::DictionaryValue(); | 127 stat_ = new base::DictionaryValue(); |
117 stat_->SetString("stat_name", key); | 128 stat_->SetString("stat_name", key); |
118 stat_->SetString("stat_value", "Uninitialized"); | 129 stat_->SetString("stat_value", "Uninitialized"); |
119 stat_->SetBoolean("is_valid", false); | 130 stat_->SetBoolean("is_valid", false); |
131 // |stat_| will be invalidated by |Append|, so it needs to be reset. | |
132 // Furthermore, if |Append| results in a reallocation, |stat_| members of | |
133 // other SyncStats will be invalidated. This is why the following check is | |
134 // necessary, so that it is guaranteed that a reallocation will not happen. | |
135 CHECK_LT(section->GetSize(), section->capacity()); | |
120 section->Append(base::WrapUnique(stat_)); | 136 section->Append(base::WrapUnique(stat_)); |
137 section->GetDictionary(section->GetSize() - 1, &stat_); | |
skym
2017/03/15 16:57:23
Are these GetDictionary(x, DictionaryValue**) meth
brettw
2017/03/15 22:14:14
These should all be removed, see the design doc I
| |
121 } | 138 } |
122 | 139 |
123 void StringSyncStat::SetValue(const std::string& value) { | 140 void StringSyncStat::SetValue(const std::string& value) { |
124 stat_->SetString("stat_value", value); | 141 stat_->SetString("stat_value", value); |
125 stat_->SetBoolean("is_valid", true); | 142 stat_->SetBoolean("is_valid", true); |
126 } | 143 } |
127 | 144 |
128 void StringSyncStat::SetValue(const base::string16& value) { | 145 void StringSyncStat::SetValue(const base::string16& value) { |
129 stat_->SetString("stat_value", value); | 146 stat_->SetString("stat_value", value); |
130 stat_->SetBoolean("is_valid", true); | 147 stat_->SetBoolean("is_valid", true); |
131 } | 148 } |
132 | 149 |
133 class BoolSyncStat { | 150 class BoolSyncStat { |
134 public: | 151 public: |
135 BoolSyncStat(base::ListValue* section, const std::string& key); | 152 BoolSyncStat(base::ListValue* section, const std::string& key); |
136 void SetValue(bool value); | 153 void SetValue(bool value); |
137 | 154 |
138 private: | 155 private: |
139 // Owned by the |section| passed in during construction. | 156 // Owned by the |section| passed in during construction. |
140 base::DictionaryValue* stat_; | 157 base::DictionaryValue* stat_; |
141 }; | 158 }; |
142 | 159 |
143 BoolSyncStat::BoolSyncStat(base::ListValue* section, const std::string& key) { | 160 BoolSyncStat::BoolSyncStat(base::ListValue* section, const std::string& key) { |
144 stat_ = new base::DictionaryValue(); | 161 stat_ = new base::DictionaryValue(); |
145 stat_->SetString("stat_name", key); | 162 stat_->SetString("stat_name", key); |
146 stat_->SetBoolean("stat_value", false); | 163 stat_->SetBoolean("stat_value", false); |
147 stat_->SetBoolean("is_valid", false); | 164 stat_->SetBoolean("is_valid", false); |
165 // |stat_| will be invalidated by |Append|, so it needs to be reset. | |
166 // Furthermore, if |Append| results in a reallocation, |stat_| members of | |
167 // other SyncStats will be invalidated. This is why the following check is | |
168 // necessary, so that it is guaranteed that a reallocation will not happen. | |
169 CHECK_LT(section->GetSize(), section->capacity()); | |
148 section->Append(base::WrapUnique(stat_)); | 170 section->Append(base::WrapUnique(stat_)); |
171 section->GetDictionary(section->GetSize() - 1, &stat_); | |
149 } | 172 } |
150 | 173 |
151 void BoolSyncStat::SetValue(bool value) { | 174 void BoolSyncStat::SetValue(bool value) { |
152 stat_->SetBoolean("stat_value", value); | 175 stat_->SetBoolean("stat_value", value); |
153 stat_->SetBoolean("is_valid", true); | 176 stat_->SetBoolean("is_valid", true); |
154 } | 177 } |
155 | 178 |
156 class IntSyncStat { | 179 class IntSyncStat { |
157 public: | 180 public: |
158 IntSyncStat(base::ListValue* section, const std::string& key); | 181 IntSyncStat(base::ListValue* section, const std::string& key); |
159 void SetValue(int value); | 182 void SetValue(int value); |
160 | 183 |
161 private: | 184 private: |
162 // Owned by the |section| passed in during construction. | 185 // Owned by the |section| passed in during construction. |
163 base::DictionaryValue* stat_; | 186 base::DictionaryValue* stat_; |
164 }; | 187 }; |
165 | 188 |
166 IntSyncStat::IntSyncStat(base::ListValue* section, const std::string& key) { | 189 IntSyncStat::IntSyncStat(base::ListValue* section, const std::string& key) { |
167 stat_ = new base::DictionaryValue(); | 190 stat_ = new base::DictionaryValue(); |
168 stat_->SetString("stat_name", key); | 191 stat_->SetString("stat_name", key); |
169 stat_->SetInteger("stat_value", 0); | 192 stat_->SetInteger("stat_value", 0); |
170 stat_->SetBoolean("is_valid", false); | 193 stat_->SetBoolean("is_valid", false); |
194 // |stat_| will be invalidated by |Append|, so it needs to be reset. | |
195 // Furthermore, if |Append| results in a reallocation, |stat_| members of | |
196 // other SyncStats will be invalidated. This is why the following check is | |
197 // necessary, so that it is guaranteed that a reallocation will not happen. | |
198 CHECK_LT(section->GetSize(), section->capacity()); | |
171 section->Append(base::WrapUnique(stat_)); | 199 section->Append(base::WrapUnique(stat_)); |
200 section->GetDictionary(section->GetSize() - 1, &stat_); | |
172 } | 201 } |
173 | 202 |
174 void IntSyncStat::SetValue(int value) { | 203 void IntSyncStat::SetValue(int value) { |
175 stat_->SetInteger("stat_value", value); | 204 stat_->SetInteger("stat_value", value); |
176 stat_->SetBoolean("is_valid", true); | 205 stat_->SetBoolean("is_valid", true); |
177 } | 206 } |
178 | 207 |
179 // Returns a string describing the chrome version environment. Version format: | 208 // Returns a string describing the chrome version environment. Version format: |
180 // <Build Info> <OS> <Version number> (<Last change>)<channel or "-devel"> | 209 // <Build Info> <OS> <Version number> (<Last change>)<channel or "-devel"> |
181 // If version information is unavailable, returns "invalid." | 210 // If version information is unavailable, returns "invalid." |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
244 // classes defined above. | 273 // classes defined above. |
245 std::unique_ptr<base::DictionaryValue> ConstructAboutInformation( | 274 std::unique_ptr<base::DictionaryValue> ConstructAboutInformation( |
246 SyncService* service, | 275 SyncService* service, |
247 SigninManagerBase* signin, | 276 SigninManagerBase* signin, |
248 version_info::Channel channel) { | 277 version_info::Channel channel) { |
249 std::unique_ptr<base::DictionaryValue> about_info( | 278 std::unique_ptr<base::DictionaryValue> about_info( |
250 new base::DictionaryValue()); | 279 new base::DictionaryValue()); |
251 | 280 |
252 // 'details': A list of sections. | 281 // 'details': A list of sections. |
253 base::ListValue* stats_list = new base::ListValue(); | 282 base::ListValue* stats_list = new base::ListValue(); |
283 stats_list->Reserve(12); | |
skym
2017/03/15 16:57:23
I've always really disliked how this file was impl
brettw
2017/03/15 22:14:14
Can you add TODOs referencing said bug on the Stat
jdoerrie
2017/03/23 18:11:17
Done.
| |
254 | 284 |
255 // The following lines define the sections and their fields. For each field, | 285 // The following lines define the sections and their fields. For each field, |
256 // a class is instantiated, which allows us to reference the fields in | 286 // a class is instantiated, which allows us to reference the fields in |
257 // 'setter' code later on in this function. | 287 // 'setter' code later on in this function. |
258 base::ListValue* section_summary = AddSection(stats_list, "Summary"); | 288 base::ListValue* section_summary = AddSection(stats_list, "Summary"); |
289 section_summary->Reserve(1); | |
259 StringSyncStat summary_string(section_summary, "Summary"); | 290 StringSyncStat summary_string(section_summary, "Summary"); |
260 | 291 |
261 base::ListValue* section_version = AddSection(stats_list, "Version Info"); | 292 base::ListValue* section_version = AddSection(stats_list, "Version Info"); |
293 section_version->Reserve(2); | |
262 StringSyncStat client_version(section_version, "Client Version"); | 294 StringSyncStat client_version(section_version, "Client Version"); |
263 StringSyncStat server_url(section_version, "Server URL"); | 295 StringSyncStat server_url(section_version, "Server URL"); |
264 | 296 |
265 base::ListValue* section_identity = | 297 base::ListValue* section_identity = |
266 AddSensitiveSection(stats_list, kIdentityTitle); | 298 AddSensitiveSection(stats_list, kIdentityTitle); |
299 section_identity->Reserve(3); | |
267 StringSyncStat sync_id(section_identity, "Sync Client ID"); | 300 StringSyncStat sync_id(section_identity, "Sync Client ID"); |
268 StringSyncStat invalidator_id(section_identity, "Invalidator Client ID"); | 301 StringSyncStat invalidator_id(section_identity, "Invalidator Client ID"); |
269 StringSyncStat username(section_identity, "Username"); | 302 StringSyncStat username(section_identity, "Username"); |
270 | 303 |
271 base::ListValue* section_credentials = AddSection(stats_list, "Credentials"); | 304 base::ListValue* section_credentials = AddSection(stats_list, "Credentials"); |
305 section_credentials->Reserve(4); | |
272 StringSyncStat request_token_time(section_credentials, "Requested Token"); | 306 StringSyncStat request_token_time(section_credentials, "Requested Token"); |
273 StringSyncStat receive_token_time(section_credentials, "Received Token"); | 307 StringSyncStat receive_token_time(section_credentials, "Received Token"); |
274 StringSyncStat token_request_status(section_credentials, | 308 StringSyncStat token_request_status(section_credentials, |
275 "Token Request Status"); | 309 "Token Request Status"); |
276 StringSyncStat next_token_request(section_credentials, "Next Token Request"); | 310 StringSyncStat next_token_request(section_credentials, "Next Token Request"); |
277 | 311 |
278 base::ListValue* section_local = AddSection(stats_list, "Local State"); | 312 base::ListValue* section_local = AddSection(stats_list, "Local State"); |
313 section_local->Reserve(7); | |
279 StringSyncStat server_connection(section_local, "Server Connection"); | 314 StringSyncStat server_connection(section_local, "Server Connection"); |
280 StringSyncStat last_synced(section_local, "Last Synced"); | 315 StringSyncStat last_synced(section_local, "Last Synced"); |
281 BoolSyncStat is_setup_complete(section_local, | 316 BoolSyncStat is_setup_complete(section_local, |
282 "Sync First-Time Setup Complete"); | 317 "Sync First-Time Setup Complete"); |
283 StringSyncStat backend_initialization(section_local, | 318 StringSyncStat backend_initialization(section_local, |
284 "Sync Backend Initialization"); | 319 "Sync Backend Initialization"); |
285 BoolSyncStat is_syncing(section_local, "Syncing"); | 320 BoolSyncStat is_syncing(section_local, "Syncing"); |
286 BoolSyncStat is_local_sync_enabled(section_local, | 321 BoolSyncStat is_local_sync_enabled(section_local, |
287 "Local sync backend enabled"); | 322 "Local sync backend enabled"); |
288 StringSyncStat local_backend_path(section_local, "Local backend path"); | 323 StringSyncStat local_backend_path(section_local, "Local backend path"); |
289 | 324 |
290 base::ListValue* section_network = AddSection(stats_list, "Network"); | 325 base::ListValue* section_network = AddSection(stats_list, "Network"); |
326 section_network->Reserve(3); | |
291 BoolSyncStat is_throttled(section_network, "Throttled"); | 327 BoolSyncStat is_throttled(section_network, "Throttled"); |
292 StringSyncStat retry_time(section_network, "Retry time (maybe stale)"); | 328 StringSyncStat retry_time(section_network, "Retry time (maybe stale)"); |
293 BoolSyncStat are_notifications_enabled(section_network, | 329 BoolSyncStat are_notifications_enabled(section_network, |
294 "Notifications Enabled"); | 330 "Notifications Enabled"); |
295 | 331 |
296 base::ListValue* section_encryption = AddSection(stats_list, "Encryption"); | 332 base::ListValue* section_encryption = AddSection(stats_list, "Encryption"); |
333 section_encryption->Reserve(9); | |
297 BoolSyncStat is_using_explicit_passphrase(section_encryption, | 334 BoolSyncStat is_using_explicit_passphrase(section_encryption, |
298 "Explicit Passphrase"); | 335 "Explicit Passphrase"); |
299 BoolSyncStat is_passphrase_required(section_encryption, | 336 BoolSyncStat is_passphrase_required(section_encryption, |
300 "Passphrase Required"); | 337 "Passphrase Required"); |
301 BoolSyncStat is_cryptographer_ready(section_encryption, | 338 BoolSyncStat is_cryptographer_ready(section_encryption, |
302 "Cryptographer Ready"); | 339 "Cryptographer Ready"); |
303 BoolSyncStat has_pending_keys(section_encryption, | 340 BoolSyncStat has_pending_keys(section_encryption, |
304 "Cryptographer Has Pending Keys"); | 341 "Cryptographer Has Pending Keys"); |
305 StringSyncStat encrypted_types(section_encryption, "Encrypted Types"); | 342 StringSyncStat encrypted_types(section_encryption, "Encrypted Types"); |
306 BoolSyncStat has_keystore_key(section_encryption, "Has Keystore Key"); | 343 BoolSyncStat has_keystore_key(section_encryption, "Has Keystore Key"); |
307 StringSyncStat keystore_migration_time(section_encryption, | 344 StringSyncStat keystore_migration_time(section_encryption, |
308 "Keystore Migration Time"); | 345 "Keystore Migration Time"); |
309 StringSyncStat passphrase_type(section_encryption, "Passphrase Type"); | 346 StringSyncStat passphrase_type(section_encryption, "Passphrase Type"); |
310 StringSyncStat passphrase_time(section_encryption, "Passphrase Time"); | 347 StringSyncStat passphrase_time(section_encryption, "Passphrase Time"); |
311 | 348 |
312 base::ListValue* section_last_session = | 349 base::ListValue* section_last_session = |
313 AddSection(stats_list, "Status from Last Completed Session"); | 350 AddSection(stats_list, "Status from Last Completed Session"); |
351 section_last_session->Reserve(4); | |
314 StringSyncStat session_source(section_last_session, "Sync Source"); | 352 StringSyncStat session_source(section_last_session, "Sync Source"); |
315 StringSyncStat get_key_result(section_last_session, "GetKey Step Result"); | 353 StringSyncStat get_key_result(section_last_session, "GetKey Step Result"); |
316 StringSyncStat download_result(section_last_session, "Download Step Result"); | 354 StringSyncStat download_result(section_last_session, "Download Step Result"); |
317 StringSyncStat commit_result(section_last_session, "Commit Step Result"); | 355 StringSyncStat commit_result(section_last_session, "Commit Step Result"); |
318 | 356 |
319 base::ListValue* section_counters = AddSection(stats_list, "Running Totals"); | 357 base::ListValue* section_counters = AddSection(stats_list, "Running Totals"); |
358 section_counters->Reserve(7); | |
320 IntSyncStat notifications_received(section_counters, | 359 IntSyncStat notifications_received(section_counters, |
321 "Notifications Received"); | 360 "Notifications Received"); |
322 IntSyncStat updates_received(section_counters, "Updates Downloaded"); | 361 IntSyncStat updates_received(section_counters, "Updates Downloaded"); |
323 IntSyncStat tombstone_updates(section_counters, "Tombstone Updates"); | 362 IntSyncStat tombstone_updates(section_counters, "Tombstone Updates"); |
324 IntSyncStat reflected_updates(section_counters, "Reflected Updates"); | 363 IntSyncStat reflected_updates(section_counters, "Reflected Updates"); |
325 IntSyncStat successful_commits(section_counters, "Successful Commits"); | 364 IntSyncStat successful_commits(section_counters, "Successful Commits"); |
326 IntSyncStat conflicts_resolved_local_wins(section_counters, | 365 IntSyncStat conflicts_resolved_local_wins(section_counters, |
327 "Conflicts Resolved: Client Wins"); | 366 "Conflicts Resolved: Client Wins"); |
328 IntSyncStat conflicts_resolved_server_wins(section_counters, | 367 IntSyncStat conflicts_resolved_server_wins(section_counters, |
329 "Conflicts Resolved: Server Wins"); | 368 "Conflicts Resolved: Server Wins"); |
330 | 369 |
331 base::ListValue* section_this_cycle = | 370 base::ListValue* section_this_cycle = |
332 AddSection(stats_list, "Transient Counters (this cycle)"); | 371 AddSection(stats_list, "Transient Counters (this cycle)"); |
372 section_this_cycle->Reserve(4); | |
333 IntSyncStat encryption_conflicts(section_this_cycle, "Encryption Conflicts"); | 373 IntSyncStat encryption_conflicts(section_this_cycle, "Encryption Conflicts"); |
334 IntSyncStat hierarchy_conflicts(section_this_cycle, "Hierarchy Conflicts"); | 374 IntSyncStat hierarchy_conflicts(section_this_cycle, "Hierarchy Conflicts"); |
335 IntSyncStat server_conflicts(section_this_cycle, "Server Conflicts"); | 375 IntSyncStat server_conflicts(section_this_cycle, "Server Conflicts"); |
336 IntSyncStat committed_items(section_this_cycle, "Committed Items"); | 376 IntSyncStat committed_items(section_this_cycle, "Committed Items"); |
337 | 377 |
338 base::ListValue* section_that_cycle = AddSection( | 378 base::ListValue* section_that_cycle = AddSection( |
339 stats_list, "Transient Counters (last cycle of last completed session)"); | 379 stats_list, "Transient Counters (last cycle of last completed session)"); |
380 section_that_cycle->Reserve(3); | |
340 IntSyncStat updates_downloaded(section_that_cycle, "Updates Downloaded"); | 381 IntSyncStat updates_downloaded(section_that_cycle, "Updates Downloaded"); |
341 IntSyncStat committed_count(section_that_cycle, "Committed Count"); | 382 IntSyncStat committed_count(section_that_cycle, "Committed Count"); |
342 IntSyncStat entries(section_that_cycle, "Entries"); | 383 IntSyncStat entries(section_that_cycle, "Entries"); |
343 | 384 |
344 base::ListValue* section_nudge_info = | 385 base::ListValue* section_nudge_info = |
345 AddSection(stats_list, "Nudge Source Counters"); | 386 AddSection(stats_list, "Nudge Source Counters"); |
387 section_nudge_info->Reserve(3); | |
346 IntSyncStat nudge_source_notification(section_nudge_info, | 388 IntSyncStat nudge_source_notification(section_nudge_info, |
347 "Server Invalidations"); | 389 "Server Invalidations"); |
348 IntSyncStat nudge_source_local(section_nudge_info, "Local Changes"); | 390 IntSyncStat nudge_source_local(section_nudge_info, "Local Changes"); |
349 IntSyncStat nudge_source_local_refresh(section_nudge_info, "Local Refreshes"); | 391 IntSyncStat nudge_source_local_refresh(section_nudge_info, "Local Refreshes"); |
350 | 392 |
351 // This list of sections belongs in the 'details' field of the returned | 393 // This list of sections belongs in the 'details' field of the returned |
352 // message. | 394 // message. |
353 about_info->Set(kDetailsKey, stats_list); | 395 about_info->Set(kDetailsKey, stats_list); |
354 | 396 |
355 // Populate all the fields we declared above. | 397 // Populate all the fields we declared above. |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
484 full_status.sync_protocol_error.error_type != UNKNOWN_ERROR && | 526 full_status.sync_protocol_error.error_type != UNKNOWN_ERROR && |
485 full_status.sync_protocol_error.error_type != SYNC_SUCCESS; | 527 full_status.sync_protocol_error.error_type != SYNC_SUCCESS; |
486 | 528 |
487 about_info->SetBoolean("actionable_error_detected", | 529 about_info->SetBoolean("actionable_error_detected", |
488 actionable_error_detected); | 530 actionable_error_detected); |
489 | 531 |
490 // NOTE: We won't bother showing any of the following values unless | 532 // NOTE: We won't bother showing any of the following values unless |
491 // actionable_error_detected is set. | 533 // actionable_error_detected is set. |
492 | 534 |
493 base::ListValue* actionable_error = new base::ListValue(); | 535 base::ListValue* actionable_error = new base::ListValue(); |
536 actionable_error->Reserve(4); | |
494 about_info->Set("actionable_error", actionable_error); | 537 about_info->Set("actionable_error", actionable_error); |
495 | 538 |
496 StringSyncStat error_type(actionable_error, "Error Type"); | 539 StringSyncStat error_type(actionable_error, "Error Type"); |
497 StringSyncStat action(actionable_error, "Action"); | 540 StringSyncStat action(actionable_error, "Action"); |
498 StringSyncStat url(actionable_error, "URL"); | 541 StringSyncStat url(actionable_error, "URL"); |
499 StringSyncStat description(actionable_error, "Error Description"); | 542 StringSyncStat description(actionable_error, "Error Description"); |
500 | 543 |
501 if (actionable_error_detected) { | 544 if (actionable_error_detected) { |
502 error_type.SetValue( | 545 error_type.SetValue( |
503 GetSyncErrorTypeString(full_status.sync_protocol_error.error_type)); | 546 GetSyncErrorTypeString(full_status.sync_protocol_error.error_type)); |
(...skipping 18 matching lines...) Expand all Loading... | |
522 } | 565 } |
523 | 566 |
524 about_info->Set("type_status", service->GetTypeStatusMap()); | 567 about_info->Set("type_status", service->GetTypeStatusMap()); |
525 | 568 |
526 return about_info; | 569 return about_info; |
527 } | 570 } |
528 | 571 |
529 } // namespace sync_ui_util | 572 } // namespace sync_ui_util |
530 | 573 |
531 } // namespace syncer | 574 } // namespace syncer |
OLD | NEW |