| Index: chrome/browser/sync_file_system/local/local_file_change_tracker.cc | 
| diff --git a/chrome/browser/sync_file_system/local/local_file_change_tracker.cc b/chrome/browser/sync_file_system/local/local_file_change_tracker.cc | 
| index 7cc1653fc5ac9e56cc9858b5a320c9f66087b133..3b42634e62920b9ba7030aec6b3cf791aba77db2 100644 | 
| --- a/chrome/browser/sync_file_system/local/local_file_change_tracker.cc | 
| +++ b/chrome/browser/sync_file_system/local/local_file_change_tracker.cc | 
| @@ -150,9 +150,8 @@ void LocalFileChangeTracker::GetChangesForURL( | 
|  | 
| void LocalFileChangeTracker::ClearChangesForURL(const FileSystemURL& url) { | 
| DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 
| -  // TODO(nhiroki): propagate the error code (see http://crbug.com/152127). | 
| ClearDirtyOnDatabase(url); | 
| - | 
| +  mirror_changes_.erase(url); | 
| FileChangeMap::iterator found = changes_.find(url); | 
| if (found == changes_.end()) | 
| return; | 
| @@ -161,6 +160,39 @@ void LocalFileChangeTracker::ClearChangesForURL(const FileSystemURL& url) { | 
| UpdateNumChanges(); | 
| } | 
|  | 
| +void LocalFileChangeTracker::CreateFreshMirrorForURL( | 
| +    const fileapi::FileSystemURL& url) { | 
| +  DCHECK(!ContainsKey(mirror_changes_, url)); | 
| +  mirror_changes_[url] = ChangeInfo(); | 
| +} | 
| + | 
| +void LocalFileChangeTracker::RemoveMirrorAndCommitChangesForURL( | 
| +    const fileapi::FileSystemURL& url) { | 
| +  FileChangeMap::iterator found = mirror_changes_.find(url); | 
| +  if (found == mirror_changes_.end()) | 
| +    return; | 
| +  mirror_changes_.erase(found); | 
| + | 
| +  if (ContainsKey(changes_, url)) | 
| +    MarkDirtyOnDatabase(url); | 
| +  else | 
| +    ClearDirtyOnDatabase(url); | 
| +  UpdateNumChanges(); | 
| +} | 
| + | 
| +void LocalFileChangeTracker::ResetToMirrorAndCommitChangesForURL( | 
| +    const fileapi::FileSystemURL& url) { | 
| +  FileChangeMap::iterator found = mirror_changes_.find(url); | 
| +  if (found == mirror_changes_.end() || found->second.change_list.empty()) { | 
| +    ClearChangesForURL(url); | 
| +    return; | 
| +  } | 
| +  const ChangeInfo& info = found->second; | 
| +  change_seqs_[info.change_seq] = url; | 
| +  changes_[url] = info; | 
| +  RemoveMirrorAndCommitChangesForURL(url); | 
| +} | 
| + | 
| SyncStatusCode LocalFileChangeTracker::Initialize( | 
| FileSystemContext* file_system_context) { | 
| DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 
| @@ -188,6 +220,7 @@ void LocalFileChangeTracker::GetAllChangedURLs(FileSystemURLSet* urls) { | 
| void LocalFileChangeTracker::DropAllChanges() { | 
| changes_.clear(); | 
| change_seqs_.clear(); | 
| +  mirror_changes_.clear(); | 
| } | 
|  | 
| SyncStatusCode LocalFileChangeTracker::MarkDirtyOnDatabase( | 
| @@ -278,18 +311,30 @@ SyncStatusCode LocalFileChangeTracker::CollectLastDirtyChanges( | 
| void LocalFileChangeTracker::RecordChange( | 
| const FileSystemURL& url, const FileChange& change) { | 
| DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 
| -  ChangeInfo& info = changes_[url]; | 
| -  if (info.change_seq >= 0) | 
| -    change_seqs_.erase(info.change_seq); | 
| +  int change_seq = current_change_seq_++; | 
| +  RecordChangeToChangeMaps(url, change, change_seq, &changes_, &change_seqs_); | 
| +  if (ContainsKey(mirror_changes_, url)) | 
| +    RecordChangeToChangeMaps(url, change, change_seq, &mirror_changes_, NULL); | 
| +  UpdateNumChanges(); | 
| +} | 
| + | 
| +void LocalFileChangeTracker::RecordChangeToChangeMaps( | 
| +    const FileSystemURL& url, | 
| +    const FileChange& change, | 
| +    int new_change_seq, | 
| +    FileChangeMap* changes, | 
| +    ChangeSeqMap* change_seqs) { | 
| +  ChangeInfo& info = (*changes)[url]; | 
| +  if (info.change_seq >= 0 && change_seqs) | 
| +    change_seqs->erase(info.change_seq); | 
| info.change_list.Update(change); | 
| if (info.change_list.empty()) { | 
| -    changes_.erase(url); | 
| -    UpdateNumChanges(); | 
| +    changes->erase(url); | 
| return; | 
| } | 
| -  info.change_seq = current_change_seq_++; | 
| -  change_seqs_[info.change_seq] = url; | 
| -  UpdateNumChanges(); | 
| +  info.change_seq = new_change_seq; | 
| +  if (change_seqs) | 
| +    (*change_seqs)[info.change_seq] = url; | 
| } | 
|  | 
| // TrackerDB ------------------------------------------------------------------- | 
|  |