Chromium Code Reviews| Index: chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| index 79aae0ff155491c7b23ada8b55bc64af0203ff97..ceeb2b09ac349497a92c4934787ded4d8dadd52b 100644 |
| --- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc |
| @@ -7,13 +7,10 @@ |
| #include <sys/statvfs.h> |
| #include <algorithm> |
| -#include <set> |
| #include <utility> |
| -#include <vector> |
| #include "base/files/file_util.h" |
| #include "base/memory/ptr_util.h" |
| -#include "base/memory/weak_ptr.h" |
| #include "base/posix/eintr_wrapper.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_util.h" |
| @@ -307,6 +304,26 @@ ExtensionFunction::ResponseAction FileManagerPrivateGrantAccessFunction::Run() { |
| return RespondNow(NoArguments()); |
| } |
| +namespace { |
| + |
| +void CallResponseCallbackOnUIThread( |
| + const FileWatchFunctionBase::ResponseCallback& callback, |
| + bool success) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(callback, success)); |
| +} |
| + |
| +void CallNotificationCallbackOnUIThread( |
| + const storage::WatcherManager::NotificationCallback& callback, |
| + storage::WatcherManager::ChangeType type) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(callback, type)); |
| +} |
| + |
| +} // namespace |
| + |
| void FileWatchFunctionBase::Respond(bool success) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| @@ -336,63 +353,95 @@ bool FileWatchFunctionBase::RunAsync() { |
| return true; |
| } |
| - PerformFileWatchOperation(file_system_context, file_system_url, |
| - extension_id()); |
| + file_manager::EventRouter* const event_router = |
| + file_manager::EventRouterFactory::GetForProfile(GetProfile()); |
| + |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| + base::Bind(&FileWatchFunctionBase::RunAsyncOnIOThread, |
| + this, file_system_context, file_system_url, |
| + event_router->GetWeakPtr())); |
| return true; |
| } |
| -void FileManagerPrivateInternalAddFileWatchFunction::PerformFileWatchOperation( |
| +void FileWatchFunctionBase::RunAsyncOnIOThread( |
| scoped_refptr<storage::FileSystemContext> file_system_context, |
| const storage::FileSystemURL& file_system_url, |
| - const std::string& extension_id) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - |
| - file_manager::EventRouter* const event_router = |
| - file_manager::EventRouterFactory::GetForProfile(GetProfile()); |
| + base::WeakPtr<file_manager::EventRouter> event_router) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| storage::WatcherManager* const watcher_manager = |
| file_system_context->GetWatcherManager(file_system_url.type()); |
| - if (watcher_manager) { |
| - watcher_manager->AddWatcher( |
| - file_system_url, false /* recursive */, |
| + |
| + if (!watcher_manager) { |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| base::Bind( |
| - &StatusCallbackToResponseCallback, |
| - base::Bind(&FileManagerPrivateInternalAddFileWatchFunction::Respond, |
| - this)), |
| - base::Bind(&file_manager::EventRouter::OnWatcherManagerNotification, |
| - event_router->GetWeakPtr(), file_system_url, extension_id)); |
| + &FileWatchFunctionBase::PerformFallbackFileWatchOperationOnUIThread, |
| + this, file_system_url, event_router)); |
| return; |
| } |
| + PerformFileWatchOperationOnIOThread(file_system_context, watcher_manager, |
| + file_system_url, event_router); |
| +} |
| + |
| +void FileManagerPrivateInternalAddFileWatchFunction:: |
| + PerformFileWatchOperationOnIOThread( |
| + scoped_refptr<storage::FileSystemContext> file_system_context, |
| + storage::WatcherManager* watcher_manager, |
| + const storage::FileSystemURL& file_system_url, |
| + base::WeakPtr<file_manager::EventRouter> event_router) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + |
| + watcher_manager->AddWatcher( |
| + file_system_url, false /* recursive */, |
| + base::Bind(&StatusCallbackToResponseCallback, |
| + base::Bind(&CallResponseCallbackOnUIThread, |
| + base::Bind(&FileWatchFunctionBase::Respond, this))), |
| + base::Bind( |
| + &CallNotificationCallbackOnUIThread, |
| + base::Bind(&file_manager::EventRouter::OnWatcherManagerNotification, |
| + event_router, file_system_url, extension_id()))); |
| +} |
| + |
| +void FileManagerPrivateInternalAddFileWatchFunction:: |
| + PerformFallbackFileWatchOperationOnUIThread( |
| + const storage::FileSystemURL& file_system_url, |
| + base::WeakPtr<file_manager::EventRouter> event_router) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + DCHECK(event_router); |
| + |
| // Obsolete. Fallback code if storage::WatcherManager is not implemented. |
| - event_router->AddFileWatch( |
| - file_system_url.path(), file_system_url.virtual_path(), extension_id, |
| - base::Bind(&FileManagerPrivateInternalAddFileWatchFunction::Respond, |
| - this)); |
| + event_router->AddFileWatch(file_system_url.path(), |
| + file_system_url.virtual_path(), extension_id(), |
| + base::Bind(&FileWatchFunctionBase::Respond, this)); |
| } |
| void FileManagerPrivateInternalRemoveFileWatchFunction:: |
| - PerformFileWatchOperation( |
| + PerformFileWatchOperationOnIOThread( |
| scoped_refptr<storage::FileSystemContext> file_system_context, |
| + storage::WatcherManager* watcher_manager, |
| const storage::FileSystemURL& file_system_url, |
| - const std::string& extension_id) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + base::WeakPtr<file_manager::EventRouter> event_router) { |
|
tzik
2017/02/23 03:57:18
|event_router| is not used?
Shuhei Takahashi
2017/02/23 04:05:57
It is not used in FileManagerPrivateInternalRemove
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - file_manager::EventRouter* const event_router = |
| - file_manager::EventRouterFactory::GetForProfile(GetProfile()); |
| + watcher_manager->RemoveWatcher( |
| + file_system_url, false /* recursive */, |
| + base::Bind( |
| + &StatusCallbackToResponseCallback, |
| + base::Bind(&CallResponseCallbackOnUIThread, |
| + base::Bind(&FileWatchFunctionBase::Respond, this)))); |
| +} |
| - storage::WatcherManager* const watcher_manager = |
| - file_system_context->GetWatcherManager(file_system_url.type()); |
| - if (watcher_manager) { |
| - watcher_manager->RemoveWatcher( |
| - file_system_url, false /* recursive */, |
| - base::Bind(&StatusCallbackToResponseCallback, |
| - base::Bind(&FileWatchFunctionBase::Respond, this))); |
| - return; |
| - } |
| +void FileManagerPrivateInternalRemoveFileWatchFunction:: |
| + PerformFallbackFileWatchOperationOnUIThread( |
| + const storage::FileSystemURL& file_system_url, |
| + base::WeakPtr<file_manager::EventRouter> event_router) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + DCHECK(event_router); |
| // Obsolete. Fallback code if storage::WatcherManager is not implemented. |
| - event_router->RemoveFileWatch(file_system_url.path(), extension_id); |
| + event_router->RemoveFileWatch(file_system_url.path(), extension_id()); |
| Respond(true); |
| } |