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

Side by Side Diff: chrome/browser/sync/glue/session_model_associator.cc

Issue 10152003: sync: Make BaseNode lookup-related Init functions return specific failures. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 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 | Annotate | Revision Log
OLDNEW
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 "chrome/browser/sync/glue/session_model_associator.h" 5 #include "chrome/browser/sync/glue/session_model_associator.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 NOTREACHED(); 137 NOTREACHED();
138 return false; 138 return false;
139 } 139 }
140 140
141 bool SessionModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) { 141 bool SessionModelAssociator::SyncModelHasUserCreatedNodes(bool* has_nodes) {
142 DCHECK(CalledOnValidThread()); 142 DCHECK(CalledOnValidThread());
143 CHECK(has_nodes); 143 CHECK(has_nodes);
144 *has_nodes = false; 144 *has_nodes = false;
145 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 145 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
146 sync_api::ReadNode root(&trans); 146 sync_api::ReadNode root(&trans);
147 if (!root.InitByTagLookup(kSessionsTag)) { 147 if (root.InitByTagLookup(kSessionsTag) != sync_api::BaseNode::INIT_OK) {
148 LOG(ERROR) << kNoSessionsFolderError; 148 LOG(ERROR) << kNoSessionsFolderError;
149 return false; 149 return false;
150 } 150 }
151 // The sync model has user created nodes iff the sessions folder has 151 // The sync model has user created nodes iff the sessions folder has
152 // any children. 152 // any children.
153 *has_nodes = root.HasChildren(); 153 *has_nodes = root.HasChildren();
154 return true; 154 return true;
155 } 155 }
156 156
157 int64 SessionModelAssociator::GetSyncIdFromChromeId(const size_t& id) { 157 int64 SessionModelAssociator::GetSyncIdFromChromeId(const size_t& id) {
158 DCHECK(CalledOnValidThread()); 158 DCHECK(CalledOnValidThread());
159 return GetSyncIdFromSessionTag(TabIdToTag(GetCurrentMachineTag(), id)); 159 return GetSyncIdFromSessionTag(TabIdToTag(GetCurrentMachineTag(), id));
160 } 160 }
161 161
162 int64 SessionModelAssociator::GetSyncIdFromSessionTag(const std::string& tag) { 162 int64 SessionModelAssociator::GetSyncIdFromSessionTag(const std::string& tag) {
163 DCHECK(CalledOnValidThread()); 163 DCHECK(CalledOnValidThread());
164 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 164 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
165 sync_api::ReadNode node(&trans); 165 sync_api::ReadNode node(&trans);
166 if (!node.InitByClientTagLookup(SESSIONS, tag)) 166 if (node.InitByClientTagLookup(SESSIONS, tag) != sync_api::BaseNode::INIT_OK)
167 return sync_api::kInvalidId; 167 return sync_api::kInvalidId;
168 return node.GetId(); 168 return node.GetId();
169 } 169 }
170 170
171 const SyncedTabDelegate* 171 const SyncedTabDelegate*
172 SessionModelAssociator::GetChromeNodeFromSyncId(int64 sync_id) { 172 SessionModelAssociator::GetChromeNodeFromSyncId(int64 sync_id) {
173 NOTREACHED(); 173 NOTREACHED();
174 return NULL; 174 return NULL;
175 } 175 }
176 176
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 current_session->windows[window_id], 265 current_session->windows[window_id],
266 &synced_session_tracker_); 266 &synced_session_tracker_);
267 } 267 }
268 } 268 }
269 } 269 }
270 // Free memory for closed windows and tabs. 270 // Free memory for closed windows and tabs.
271 synced_session_tracker_.CleanupSession(local_tag); 271 synced_session_tracker_.CleanupSession(local_tag);
272 272
273 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 273 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
274 sync_api::WriteNode header_node(&trans); 274 sync_api::WriteNode header_node(&trans);
275 if (!header_node.InitByIdLookup(local_session_syncid_)) { 275 if (header_node.InitByIdLookup(local_session_syncid_) !=
276 sync_api::BaseNode::INIT_OK) {
276 if (error) { 277 if (error) {
277 *error = error_handler_->CreateAndUploadError( 278 *error = error_handler_->CreateAndUploadError(
278 FROM_HERE, 279 FROM_HERE,
279 "Failed to load local session header node.", 280 "Failed to load local session header node.",
280 model_type()); 281 model_type());
281 } 282 }
282 return false; 283 return false;
283 } 284 }
284 header_node.SetSessionSpecifics(specifics); 285 header_node.SetSessionSpecifics(specifics);
285 if (waiting_for_change_) QuitLoopForSubtleTesting(); 286 if (waiting_for_change_) QuitLoopForSubtleTesting();
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 421
421 // If the url changed, kick off the favicon load for the new url. 422 // If the url changed, kick off the favicon load for the new url.
422 bool url_changed = false; 423 bool url_changed = false;
423 if (tab_link->url().is_valid() && tab_link->url() != old_tab_url) { 424 if (tab_link->url().is_valid() && tab_link->url() != old_tab_url) {
424 url_changed = true; 425 url_changed = true;
425 LoadFaviconForTab(tab_link); 426 LoadFaviconForTab(tab_link);
426 } 427 }
427 428
428 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 429 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
429 sync_api::WriteNode tab_node(&trans); 430 sync_api::WriteNode tab_node(&trans);
430 if (!tab_node.InitByIdLookup(sync_id)) { 431 if (tab_node.InitByIdLookup(sync_id) != sync_api::BaseNode::INIT_OK) {
431 if (error) { 432 if (error) {
432 *error = error_handler_->CreateAndUploadError( 433 *error = error_handler_->CreateAndUploadError(
433 FROM_HERE, 434 FROM_HERE,
434 "Failed to look up local tab node", 435 "Failed to look up local tab node",
435 model_type()); 436 model_type());
436 } 437 }
437 return false; 438 return false;
438 } 439 }
439 440
440 // Preserve the existing favicon only if the url didn't change. 441 // Preserve the existing favicon only if the url didn't change.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 // up to date. 495 // up to date.
495 496
496 if (favicon.is_valid()) { 497 if (favicon.is_valid()) {
497 DCHECK_EQ(handle, tab_link->favicon_load_handle()); 498 DCHECK_EQ(handle, tab_link->favicon_load_handle());
498 tab_link->set_favicon_load_handle(0); 499 tab_link->set_favicon_load_handle(0);
499 DCHECK_EQ(favicon.icon_type, history::FAVICON); 500 DCHECK_EQ(favicon.icon_type, history::FAVICON);
500 DCHECK_NE(tab_link->sync_id(), sync_api::kInvalidId); 501 DCHECK_NE(tab_link->sync_id(), sync_api::kInvalidId);
501 // Load the sync tab node and update the favicon data. 502 // Load the sync tab node and update the favicon data.
502 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 503 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
503 sync_api::WriteNode tab_node(&trans); 504 sync_api::WriteNode tab_node(&trans);
504 if (!tab_node.InitByIdLookup(tab_link->sync_id())) { 505 if (tab_node.InitByIdLookup(tab_link->sync_id()) !=
506 sync_api::BaseNode::INIT_OK) {
505 LOG(WARNING) << "Failed to load sync tab node for tab id " << tab_id 507 LOG(WARNING) << "Failed to load sync tab node for tab id " << tab_id
506 << " and url " << tab_link->url().spec(); 508 << " and url " << tab_link->url().spec();
507 return; 509 return;
508 } 510 }
509 sync_pb::SessionSpecifics session_specifics = 511 sync_pb::SessionSpecifics session_specifics =
510 tab_node.GetSessionSpecifics(); 512 tab_node.GetSessionSpecifics();
511 DCHECK(session_specifics.has_tab()); 513 DCHECK(session_specifics.has_tab());
512 sync_pb::SessionTab* tab = session_specifics.mutable_tab(); 514 sync_pb::SessionTab* tab = session_specifics.mutable_tab();
513 if (favicon.image_data->size() > 0) { 515 if (favicon.image_data->size() > 0) {
514 DVLOG(1) << "Storing session favicon for " 516 DVLOG(1) << "Storing session favicon for "
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 DCHECK_EQ(0U, tab_pool_.capacity()); 654 DCHECK_EQ(0U, tab_pool_.capacity());
653 655
654 local_session_syncid_ = sync_api::kInvalidId; 656 local_session_syncid_ = sync_api::kInvalidId;
655 657
656 // Read any available foreign sessions and load any session data we may have. 658 // Read any available foreign sessions and load any session data we may have.
657 // If we don't have any local session data in the db, create a header node. 659 // If we don't have any local session data in the db, create a header node.
658 { 660 {
659 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 661 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
660 662
661 sync_api::ReadNode root(&trans); 663 sync_api::ReadNode root(&trans);
662 if (!root.InitByTagLookup(syncable::ModelTypeToRootTag(model_type()))) { 664 if (root.InitByTagLookup(syncable::ModelTypeToRootTag(model_type())) !=
665 sync_api::BaseNode::INIT_OK) {
663 return error_handler_->CreateAndUploadError( 666 return error_handler_->CreateAndUploadError(
664 FROM_HERE, 667 FROM_HERE,
665 kNoSessionsFolderError, 668 kNoSessionsFolderError,
666 model_type()); 669 model_type());
667 } 670 }
668 671
669 // Make sure we have a machine tag. 672 // Make sure we have a machine tag.
670 if (current_machine_tag_.empty()) { 673 if (current_machine_tag_.empty()) {
671 InitializeCurrentMachineTag(&trans); 674 InitializeCurrentMachineTag(&trans);
672 // The session name is retrieved asynchronously so it might not come back 675 // The session name is retrieved asynchronously so it might not come back
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 sync_api::WriteTransaction* trans, 805 sync_api::WriteTransaction* trans,
803 SyncError* error) { 806 SyncError* error) {
804 DCHECK(CalledOnValidThread()); 807 DCHECK(CalledOnValidThread());
805 DCHECK(tab_pool_.empty()); 808 DCHECK(tab_pool_.empty());
806 DCHECK_EQ(local_session_syncid_, sync_api::kInvalidId); 809 DCHECK_EQ(local_session_syncid_, sync_api::kInvalidId);
807 810
808 // Iterate through the nodes and associate any foreign sessions. 811 // Iterate through the nodes and associate any foreign sessions.
809 int64 id = root.GetFirstChildId(); 812 int64 id = root.GetFirstChildId();
810 while (id != sync_api::kInvalidId) { 813 while (id != sync_api::kInvalidId) {
811 sync_api::WriteNode sync_node(trans); 814 sync_api::WriteNode sync_node(trans);
812 if (!sync_node.InitByIdLookup(id)) { 815 if (sync_node.InitByIdLookup(id) != sync_api::BaseNode::INIT_OK) {
813 if (error) { 816 if (error) {
814 *error = error_handler_->CreateAndUploadError( 817 *error = error_handler_->CreateAndUploadError(
815 FROM_HERE, 818 FROM_HERE,
816 "Failed to load sync node", 819 "Failed to load sync node",
817 model_type()); 820 model_type());
818 } 821 }
819 return false; 822 return false;
820 } 823 }
821 int64 next_id = sync_node.GetSuccessorId(); 824 int64 next_id = sync_node.GetSuccessorId();
822 825
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1223 tab_syncid_pool_.resize(tab_syncid_pool_.size() + 1); 1226 tab_syncid_pool_.resize(tab_syncid_pool_.size() + 1);
1224 tab_syncid_pool_[static_cast<size_t>(++tab_pool_fp_)] = sync_id; 1227 tab_syncid_pool_[static_cast<size_t>(++tab_pool_fp_)] = sync_id;
1225 } 1228 }
1226 1229
1227 int64 SessionModelAssociator::TabNodePool::GetFreeTabNode() { 1230 int64 SessionModelAssociator::TabNodePool::GetFreeTabNode() {
1228 DCHECK_GT(machine_tag_.length(), 0U); 1231 DCHECK_GT(machine_tag_.length(), 0U);
1229 if (tab_pool_fp_ == -1) { 1232 if (tab_pool_fp_ == -1) {
1230 // Tab pool has no free nodes, allocate new one. 1233 // Tab pool has no free nodes, allocate new one.
1231 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 1234 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
1232 sync_api::ReadNode root(&trans); 1235 sync_api::ReadNode root(&trans);
1233 if (!root.InitByTagLookup(kSessionsTag)) { 1236 if (root.InitByTagLookup(kSessionsTag) != sync_api::BaseNode::INIT_OK) {
1234 LOG(ERROR) << kNoSessionsFolderError; 1237 LOG(ERROR) << kNoSessionsFolderError;
1235 return sync_api::kInvalidId; 1238 return sync_api::kInvalidId;
1236 } 1239 }
1237 size_t tab_node_id = tab_syncid_pool_.size(); 1240 size_t tab_node_id = tab_syncid_pool_.size();
1238 std::string tab_node_tag = TabIdToTag(machine_tag_, tab_node_id); 1241 std::string tab_node_tag = TabIdToTag(machine_tag_, tab_node_id);
1239 sync_api::WriteNode tab_node(&trans); 1242 sync_api::WriteNode tab_node(&trans);
1240 if (!tab_node.InitUniqueByCreation(SESSIONS, root, tab_node_tag)) { 1243 if (!tab_node.InitUniqueByCreation(SESSIONS, root, tab_node_tag)) {
1241 LOG(ERROR) << "Could not create new node with tag " 1244 LOG(ERROR) << "Could not create new node with tag "
1242 << tab_node_tag << "!"; 1245 << tab_node_tag << "!";
1243 return sync_api::kInvalidId; 1246 return sync_api::kInvalidId;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 return; 1359 return;
1357 } 1360 }
1358 1361
1359 if (!DisassociateForeignSession(tag)) { 1362 if (!DisassociateForeignSession(tag)) {
1360 // We don't have any data for this session, our work here is done! 1363 // We don't have any data for this session, our work here is done!
1361 return; 1364 return;
1362 } 1365 }
1363 1366
1364 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 1367 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
1365 sync_api::ReadNode root(&trans); 1368 sync_api::ReadNode root(&trans);
1366 if (!root.InitByTagLookup(kSessionsTag)) { 1369 if (root.InitByTagLookup(kSessionsTag) != sync_api::BaseNode::INIT_OK) {
1367 LOG(ERROR) << kNoSessionsFolderError; 1370 LOG(ERROR) << kNoSessionsFolderError;
1368 return; 1371 return;
1369 } 1372 }
1370 int64 id = root.GetFirstChildId(); 1373 int64 id = root.GetFirstChildId();
1371 while (id != sync_api::kInvalidId) { 1374 while (id != sync_api::kInvalidId) {
1372 sync_api::WriteNode sync_node(&trans); 1375 sync_api::WriteNode sync_node(&trans);
1373 if (!sync_node.InitByIdLookup(id)) { 1376 if (sync_node.InitByIdLookup(id) != sync_api::BaseNode::INIT_OK) {
1374 LOG(ERROR) << "Failed to fetch sync node for id " << id; 1377 LOG(ERROR) << "Failed to fetch sync node for id " << id;
1375 continue; 1378 continue;
1376 } 1379 }
1377 id = sync_node.GetSuccessorId(); 1380 id = sync_node.GetSuccessorId();
1378 const sync_pb::SessionSpecifics& specifics = 1381 const sync_pb::SessionSpecifics& specifics =
1379 sync_node.GetSessionSpecifics(); 1382 sync_node.GetSessionSpecifics();
1380 if (specifics.session_tag() == tag) 1383 if (specifics.session_tag() == tag)
1381 sync_node.Remove(); 1384 sync_node.Remove();
1382 } 1385 }
1383 } 1386 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 bool SessionModelAssociator::CryptoReadyIfNecessary() { 1452 bool SessionModelAssociator::CryptoReadyIfNecessary() {
1450 // We only access the cryptographer while holding a transaction. 1453 // We only access the cryptographer while holding a transaction.
1451 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 1454 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
1452 const syncable::ModelTypeSet encrypted_types = 1455 const syncable::ModelTypeSet encrypted_types =
1453 sync_api::GetEncryptedTypes(&trans); 1456 sync_api::GetEncryptedTypes(&trans);
1454 return !encrypted_types.Has(SESSIONS) || 1457 return !encrypted_types.Has(SESSIONS) ||
1455 sync_service_->IsCryptographerReady(&trans); 1458 sync_service_->IsCryptographerReady(&trans);
1456 } 1459 }
1457 1460
1458 } // namespace browser_sync 1461 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/session_change_processor.cc ('k') | chrome/browser/sync/glue/theme_change_processor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698