Index: chrome/browser/sync_file_system/local/local_file_sync_context.cc |
diff --git a/chrome/browser/sync_file_system/local/local_file_sync_context.cc b/chrome/browser/sync_file_system/local/local_file_sync_context.cc |
index c3acb566899c56f79a5676e6f2833decff7361c0..d80f2be30ad718fa1524d9af831239eeab1d295d 100644 |
--- a/chrome/browser/sync_file_system/local/local_file_sync_context.cc |
+++ b/chrome/browser/sync_file_system/local/local_file_sync_context.cc |
@@ -498,7 +498,8 @@ void LocalFileSyncContext::HasPendingLocalChanges( |
void LocalFileSyncContext::PromoteDemotedChanges( |
const GURL& origin, |
- fileapi::FileSystemContext* file_system_context) { |
+ fileapi::FileSystemContext* file_system_context, |
+ const base::Closure& callback) { |
// This is initially called on UI thread and to be relayed to FILE thread. |
DCHECK(file_system_context); |
if (!file_system_context->default_file_task_runner()-> |
@@ -507,7 +508,8 @@ void LocalFileSyncContext::PromoteDemotedChanges( |
file_system_context->default_file_task_runner()->PostTask( |
FROM_HERE, |
base::Bind(&LocalFileSyncContext::PromoteDemotedChanges, |
- this, origin, make_scoped_refptr(file_system_context))); |
+ this, origin, make_scoped_refptr(file_system_context), |
+ callback)); |
return; |
} |
@@ -515,21 +517,25 @@ void LocalFileSyncContext::PromoteDemotedChanges( |
SyncFileSystemBackend::GetBackend(file_system_context); |
DCHECK(backend); |
DCHECK(backend->change_tracker()); |
- if (!backend->change_tracker()->PromoteDemotedChanges()) |
+ if (!backend->change_tracker()->PromoteDemotedChanges()) { |
+ ui_task_runner_->PostTask(FROM_HERE, callback); |
return; |
+ } |
io_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&LocalFileSyncContext::UpdateChangesForOrigin, |
- this, origin)); |
+ this, origin, callback)); |
} |
-void LocalFileSyncContext::UpdateChangesForOrigin(const GURL& origin) { |
+void LocalFileSyncContext::UpdateChangesForOrigin( |
+ const GURL& origin, |
+ const base::Closure& callback) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
if (shutdown_on_io_) |
return; |
origins_with_pending_changes_.insert(origin); |
- ScheduleNotifyChangesUpdatedOnIOThread(); |
+ ScheduleNotifyChangesUpdatedOnIOThread(callback); |
} |
void LocalFileSyncContext::AddOriginChangeObserver( |
@@ -559,7 +565,7 @@ void LocalFileSyncContext::OnSyncEnabled(const FileSystemURL& url) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
if (shutdown_on_io_) |
return; |
- UpdateChangesForOrigin(url.origin()); |
+ UpdateChangesForOrigin(url.origin(), NoopClosure()); |
if (url_syncable_callback_.is_null() || |
sync_status()->IsWriting(url_waiting_sync_on_io_)) { |
return; |
@@ -577,35 +583,40 @@ void LocalFileSyncContext::OnWriteEnabled(const FileSystemURL& url) { |
LocalFileSyncContext::~LocalFileSyncContext() { |
} |
-void LocalFileSyncContext::ScheduleNotifyChangesUpdatedOnIOThread() { |
+void LocalFileSyncContext::ScheduleNotifyChangesUpdatedOnIOThread( |
+ const base::Closure& callback) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
if (shutdown_on_io_) |
return; |
if (base::Time::Now() > last_notified_changes_ + NotifyChangesDuration()) { |
- NotifyAvailableChangesOnIOThread(); |
+ NotifyAvailableChangesOnIOThread(callback); |
} else if (!timer_on_io_->IsRunning()) { |
timer_on_io_->Start( |
- FROM_HERE, NotifyChangesDuration(), this, |
- &LocalFileSyncContext::NotifyAvailableChangesOnIOThread); |
+ FROM_HERE, NotifyChangesDuration(), |
+ base::Bind(&LocalFileSyncContext::NotifyAvailableChangesOnIOThread, |
+ base::Unretained(this), callback)); |
} |
} |
-void LocalFileSyncContext::NotifyAvailableChangesOnIOThread() { |
+void LocalFileSyncContext::NotifyAvailableChangesOnIOThread( |
+ const base::Closure& callback) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
if (shutdown_on_io_) |
return; |
ui_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&LocalFileSyncContext::NotifyAvailableChanges, |
- this, origins_with_pending_changes_)); |
+ this, origins_with_pending_changes_, callback)); |
last_notified_changes_ = base::Time::Now(); |
origins_with_pending_changes_.clear(); |
} |
void LocalFileSyncContext::NotifyAvailableChanges( |
- const std::set<GURL>& origins) { |
+ const std::set<GURL>& origins, |
+ const base::Closure& callback) { |
FOR_EACH_OBSERVER(LocalOriginChangeObserver, origin_change_observers_, |
OnChangesAvailableInOrigins(origins)); |
+ callback.Run(); |
} |
void LocalFileSyncContext::ShutdownOnIOThread() { |
@@ -722,7 +733,7 @@ void LocalFileSyncContext::DidInitializeChangeTrackerOnIOThread( |
origins_with_pending_changes_.insert(origins_with_changes->begin(), |
origins_with_changes->end()); |
- ScheduleNotifyChangesUpdatedOnIOThread(); |
+ ScheduleNotifyChangesUpdatedOnIOThread(NoopClosure()); |
InitializeFileSystemContextOnIOThread(source_url, file_system_context, |
GURL(), std::string(), |
@@ -939,7 +950,7 @@ void LocalFileSyncContext::ClearSyncFlagOnIOThread( |
} |
// Since a sync has finished the number of changes must have been updated. |
- UpdateChangesForOrigin(url.origin()); |
+ UpdateChangesForOrigin(url.origin(), NoopClosure()); |
} |
void LocalFileSyncContext::FinalizeSnapshotSyncOnIOThread( |
@@ -950,7 +961,7 @@ void LocalFileSyncContext::FinalizeSnapshotSyncOnIOThread( |
sync_status()->EndWriting(url); |
// Since a sync has finished the number of changes must have been updated. |
- UpdateChangesForOrigin(url.origin()); |
+ UpdateChangesForOrigin(url.origin(), NoopClosure()); |
} |
void LocalFileSyncContext::DidApplyRemoteChange( |