Index: chrome/browser/chromeos/file_system_provider/provided_file_system.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/provided_file_system.cc b/chrome/browser/chromeos/file_system_provider/provided_file_system.cc |
index cdf2a466f01ab01c14b0121692573a987ebf1b57..c4e6cd3759f34b13f74ee283d6e2403f2c9abb67 100644 |
--- a/chrome/browser/chromeos/file_system_provider/provided_file_system.cc |
+++ b/chrome/browser/chromeos/file_system_provider/provided_file_system.cc |
@@ -501,34 +501,40 @@ void ProvidedFileSystem::RemoveObserver(ProvidedFileSystemObserver* observer) { |
observers_.RemoveObserver(observer); |
} |
-bool ProvidedFileSystem::Notify( |
+void ProvidedFileSystem::Notify( |
const base::FilePath& entry_path, |
bool recursive, |
storage::WatcherManager::ChangeType change_type, |
scoped_ptr<ProvidedFileSystemObserver::Changes> changes, |
- const std::string& tag) { |
+ const std::string& tag, |
+ const storage::AsyncFileUtil::StatusCallback& callback) { |
const WatcherKey key(entry_path, recursive); |
const auto& watcher_it = watchers_.find(key); |
- if (watcher_it == watchers_.end()) |
- return false; |
+ if (watcher_it == watchers_.end()) { |
+ callback.Run(base::File::FILE_ERROR_NOT_FOUND); |
+ return; |
+ } |
// The tag must be provided if and only if it's explicitly supported. |
- if (file_system_info_.supports_notify_tag() == tag.empty()) |
- return false; |
+ if (file_system_info_.supports_notify_tag() == tag.empty()) { |
+ callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); |
+ return; |
+ } |
+ |
+ // It's illegal to provide a tag which is not unique. |
+ if (!tag.empty() && tag == watcher_it->second.last_tag) { |
+ callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); |
+ return; |
+ } |
// The object is owned by AutoUpdated, so the reference is valid as long as |
// callbacks created with AutoUpdater::CreateCallback(). |
const ProvidedFileSystemObserver::Changes& changes_ref = *changes.get(); |
- scoped_refptr<AutoUpdater> auto_updater( |
- new AutoUpdater(base::Bind(&ProvidedFileSystem::OnNotifyCompleted, |
- weak_ptr_factory_.GetWeakPtr(), |
- entry_path, |
- recursive, |
- change_type, |
- base::Passed(&changes), |
- watcher_it->second.last_tag, |
- tag))); |
+ scoped_refptr<AutoUpdater> auto_updater(new AutoUpdater( |
+ base::Bind(&ProvidedFileSystem::OnNotifyCompleted, |
+ weak_ptr_factory_.GetWeakPtr(), entry_path, recursive, |
+ change_type, base::Passed(&changes), tag, callback))); |
// Call all notification callbacks (if any). |
for (const auto& subscriber_it : watcher_it->second.subscribers) { |
@@ -546,8 +552,6 @@ bool ProvidedFileSystem::Notify( |
change_type, |
changes_ref, |
auto_updater->CreateCallback())); |
- |
- return true; |
} |
base::WeakPtr<ProvidedFileSystemInterface> ProvidedFileSystem::GetWeakPtr() { |
@@ -607,23 +611,18 @@ void ProvidedFileSystem::OnNotifyCompleted( |
bool recursive, |
storage::WatcherManager::ChangeType change_type, |
scoped_ptr<ProvidedFileSystemObserver::Changes> /* changes */, |
- const std::string& last_tag, |
- const std::string& tag) { |
+ const std::string& tag, |
+ const storage::AsyncFileUtil::StatusCallback& callback) { |
const WatcherKey key(entry_path, recursive); |
const Watchers::iterator it = watchers_.find(key); |
// Check if the entry is still watched. |
- if (it == watchers_.end()) |
- return; |
- |
- // Another following notification finished earlier. |
- if (it->second.last_tag != last_tag) |
+ if (it == watchers_.end()) { |
+ callback.Run(base::File::FILE_ERROR_NOT_FOUND); |
return; |
+ } |
- // It's illegal to provide a tag which is not unique. As for now only an error |
- // message is printed, but we may want to pass the error to the providing |
- // extension. TODO(mtomasz): Consider it. |
- if (!tag.empty() && tag == it->second.last_tag) |
- LOG(ERROR) << "Tag specified, but same as the previous one."; |
+ // TODO(mtomasz): Add an async queue around notify and other watcher related |
+ // methods so there is no race. |
it->second.last_tag = tag; |
@@ -643,6 +642,8 @@ void ProvidedFileSystem::OnNotifyCompleted( |
base::Bind(&EmptyStatusCallback)); |
} |
} |
+ |
+ callback.Run(base::File::FILE_OK); |
} |
} // namespace file_system_provider |