Index: chrome/browser/sync/glue/typed_url_change_processor.cc |
diff --git a/chrome/browser/sync/glue/typed_url_change_processor.cc b/chrome/browser/sync/glue/typed_url_change_processor.cc |
index 04c7ba0724bf4ef848b915136f25262cefc50117..505f2b8b8494c5ad66e9406ba3195b14387f9813 100644 |
--- a/chrome/browser/sync/glue/typed_url_change_processor.cc |
+++ b/chrome/browser/sync/glue/typed_url_change_processor.cc |
@@ -169,10 +169,15 @@ void TypedUrlChangeProcessor::HandleURLsVisited( |
sync_api::WriteNode update_node(&trans); |
if (!update_node.InitByClientTagLookup(syncable::TYPED_URLS, tag)) { |
// If we don't know about it yet, it will be added later. |
+ // TODO(atwilson): This can result in this URL not being synced until the |
+ // next full association, as we may not get another notification for this |
+ // URL if the navigation resulted in a redirect (http://crbug.com/85135). |
return; |
} |
sync_pb::TypedUrlSpecifics typed_url(update_node.GetTypedUrlSpecifics()); |
- typed_url.add_visit(visits.back().visit_time.ToInternalValue()); |
+ typed_url.add_visits(visits.back().visit_time.ToInternalValue()); |
+ typed_url.add_visit_transitions( |
+ visits.back().transition & PageTransition::CORE_MASK); |
update_node.SetTypedUrlSpecifics(typed_url); |
} |
@@ -225,28 +230,31 @@ void TypedUrlChangeProcessor::ApplyChangesFromSyncModel( |
GURL url(typed_url.url()); |
if (sync_api::SyncManager::ChangeRecord::ACTION_ADD == changes[i].action) { |
- DCHECK(typed_url.visit_size()); |
- if (!typed_url.visit_size()) { |
+ DCHECK(typed_url.visits_size()); |
+ if (!typed_url.visits_size()) { |
continue; |
} |
- history::URLRow new_url = |
- TypedUrlModelAssociator::TypedUrlSpecificsToURLRow(typed_url); |
+ history::URLRow new_url(GURL(typed_url.url())); |
+ TypedUrlModelAssociator::UpdateURLRowFromTypedUrlSpecifics( |
+ typed_url, &new_url); |
model_associator_->Associate(&new_url.url().spec(), changes[i].id); |
new_urls.push_back(new_url); |
- // The latest visit gets added automatically, so skip it. |
- std::vector<base::Time> added_visits; |
- for (int c = 0; c < typed_url.visit_size() - 1; ++c) { |
- DCHECK(typed_url.visit(c) < typed_url.visit(c + 1)); |
- added_visits.push_back( |
- base::Time::FromInternalValue(typed_url.visit(c))); |
+ std::vector<history::VisitInfo> added_visits; |
+ for (int c = 0; c < typed_url.visits_size(); ++c) { |
+ DCHECK(c == 0 || typed_url.visits(c) > typed_url.visits(c - 1)); |
+ added_visits.push_back(history::VisitInfo( |
+ base::Time::FromInternalValue(typed_url.visits(c)), |
+ typed_url.visit_transitions(c))); |
} |
- new_visits.push_back( |
- std::pair<GURL, std::vector<base::Time> >(url, added_visits)); |
+ new_visits.push_back(std::pair<GURL, std::vector<history::VisitInfo> >( |
+ url, added_visits)); |
} else { |
+ DCHECK_EQ(sync_api::SyncManager::ChangeRecord::ACTION_UPDATE, |
+ changes[i].action); |
history::URLRow old_url; |
if (!history_backend_->GetURL(url, &old_url)) { |
error_handler()->OnUnrecoverableError(FROM_HERE, |
@@ -261,8 +269,9 @@ void TypedUrlChangeProcessor::ApplyChangesFromSyncModel( |
return; |
} |
- history::URLRow new_url = |
- TypedUrlModelAssociator::TypedUrlSpecificsToURLRow(typed_url); |
+ history::URLRow new_url(old_url); |
+ TypedUrlModelAssociator::UpdateURLRowFromTypedUrlSpecifics( |
+ typed_url, &new_url); |
updated_urls.push_back( |
std::pair<history::URLID, history::URLRow>(old_url.id(), new_url)); |
@@ -272,13 +281,13 @@ void TypedUrlChangeProcessor::ApplyChangesFromSyncModel( |
new_url.title())); |
} |
- std::vector<base::Time> added_visits; |
+ std::vector<history::VisitInfo> added_visits; |
history::VisitVector removed_visits; |
TypedUrlModelAssociator::DiffVisits(visits, typed_url, |
&added_visits, &removed_visits); |
if (added_visits.size()) { |
- new_visits.push_back( |
- std::pair<GURL, std::vector<base::Time> >(url, added_visits)); |
+ new_visits.push_back(std::pair<GURL, std::vector<history::VisitInfo> >( |
+ url, added_visits)); |
} |
if (removed_visits.size()) { |
deleted_visits.insert(deleted_visits.end(), removed_visits.begin(), |