| Index: chrome/browser/extensions/api/file_system/entry_watcher_service.cc
|
| diff --git a/chrome/browser/extensions/api/file_system/entry_watcher_service.cc b/chrome/browser/extensions/api/file_system/entry_watcher_service.cc
|
| deleted file mode 100644
|
| index aa68fc01328ffa2530fd83b1cd52a79e57a9b51d..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/api/file_system/entry_watcher_service.cc
|
| +++ /dev/null
|
| @@ -1,253 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/extensions/api/file_system/entry_watcher_service.h"
|
| -
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "chrome/browser/extensions/extension_util.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/common/extensions/api/file_system.h"
|
| -#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
| -#include "content/public/browser/browser_context.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/storage_partition.h"
|
| -#include "extensions/browser/event_router.h"
|
| -#include "storage/browser/fileapi/file_system_context.h"
|
| -
|
| -namespace extensions {
|
| -namespace {
|
| -
|
| -// Default implementation for dispatching an event. Can be replaced for unit
|
| -// tests by EntryWatcherService::SetDispatchEventImplForTesting().
|
| -void DispatchEventImpl(EventRouter* event_router,
|
| - const std::string& extension_id,
|
| - scoped_ptr<Event> event) {
|
| - event_router->DispatchEventToExtension(extension_id, event.Pass());
|
| -}
|
| -
|
| -// Default implementation for acquiring a file system context for a specific
|
| -// |extension_id| and |context|.
|
| -storage::FileSystemContext* GetFileSystemContextImpl(
|
| - const std::string& extension_id,
|
| - content::BrowserContext* context) {
|
| - const GURL site = util::GetSiteForExtensionId(extension_id, context);
|
| - return content::BrowserContext::GetStoragePartitionForSite(context, site)
|
| - ->GetFileSystemContext();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -EntryWatcherService::EntryWatcherService(content::BrowserContext* context)
|
| - : context_(context),
|
| - dispatch_event_impl_(
|
| - base::Bind(&DispatchEventImpl, EventRouter::Get(context))),
|
| - get_file_system_context_impl_(base::Bind(&GetFileSystemContextImpl)),
|
| - observing_(this),
|
| - weak_ptr_factory_(this) {
|
| - // TODO(mtomasz): Restore persistent watchers.
|
| -}
|
| -
|
| -EntryWatcherService::~EntryWatcherService() {
|
| -}
|
| -
|
| -void EntryWatcherService::SetDispatchEventImplForTesting(
|
| - const DispatchEventImplCallback& callback) {
|
| - dispatch_event_impl_ = callback;
|
| -}
|
| -
|
| -void EntryWatcherService::SetGetFileSystemContextImplForTesting(
|
| - const GetFileSystemContextImplCallback& callback) {
|
| - get_file_system_context_impl_ = callback;
|
| -}
|
| -
|
| -void EntryWatcherService::WatchDirectory(
|
| - const std::string& extension_id,
|
| - const storage::FileSystemURL& url,
|
| - bool recursive,
|
| - const storage::WatcherManager::StatusCallback& callback) {
|
| - // TODO(mtomasz): Add support for recursive watchers.
|
| - if (recursive) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION));
|
| - return;
|
| - }
|
| -
|
| - storage::FileSystemContext* const context =
|
| - get_file_system_context_impl_.Run(extension_id, context_);
|
| - DCHECK(context);
|
| -
|
| - storage::WatcherManager* const watcher_manager =
|
| - context->GetWatcherManager(url.type());
|
| - if (!watcher_manager) {
|
| - // Post a task instead of calling the callback directly, since the caller
|
| - // may expect the callback to be called asynchronously.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION));
|
| - return;
|
| - }
|
| -
|
| - // Passing a pointer to WatcherManager is safe, since the pointer is required
|
| - // to be valid until shutdown.
|
| - context->default_file_task_runner()->PostNonNestableTask(
|
| - FROM_HERE,
|
| - base::Bind(&storage::WatcherManager::WatchDirectory,
|
| - base::Unretained(watcher_manager), // Outlives the service.
|
| - url,
|
| - recursive,
|
| - base::Bind(&EntryWatcherService::OnWatchDirectoryCompleted,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - watcher_manager, // Outlives the service.
|
| - extension_id,
|
| - url,
|
| - recursive,
|
| - callback)));
|
| -}
|
| -
|
| -void EntryWatcherService::UnwatchEntry(
|
| - const std::string& extension_id,
|
| - const storage::FileSystemURL& url,
|
| - const storage::WatcherManager::StatusCallback& callback) {
|
| - storage::FileSystemContext* const context =
|
| - get_file_system_context_impl_.Run(extension_id, context_);
|
| - DCHECK(context);
|
| -
|
| - storage::WatcherManager* const watcher_manager =
|
| - context->GetWatcherManager(url.type());
|
| - if (!watcher_manager) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, base::File::FILE_ERROR_INVALID_OPERATION));
|
| - return;
|
| - }
|
| -
|
| - // Passing a pointer to WatcherManager is safe, since the pointer is required
|
| - // to be valid until shutdown.
|
| - context->default_file_task_runner()->PostNonNestableTask(
|
| - FROM_HERE,
|
| - base::Bind(&storage::WatcherManager::UnwatchEntry,
|
| - base::Unretained(watcher_manager), // Outlives the service.
|
| - url,
|
| - base::Bind(&EntryWatcherService::OnUnwatchEntryCompleted,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - extension_id,
|
| - url,
|
| - callback)));
|
| -}
|
| -
|
| -std::vector<storage::FileSystemURL> EntryWatcherService::GetWatchedEntries(
|
| - const std::string& extension_id) {
|
| - std::vector<storage::FileSystemURL> result;
|
| - for (WatcherMap::const_iterator it = watchers_.begin(); it != watchers_.end();
|
| - ++it) {
|
| - const std::map<std::string, EntryWatcher>::const_iterator watcher_it =
|
| - it->second.find(extension_id);
|
| - if (watcher_it != it->second.end())
|
| - result.push_back(watcher_it->second.url);
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -void EntryWatcherService::OnEntryChanged(const storage::FileSystemURL& url) {
|
| - const WatcherMap::const_iterator it = watchers_.find(url);
|
| - DCHECK(it != watchers_.end());
|
| - for (std::map<std::string, EntryWatcher>::const_iterator watcher_it =
|
| - it->second.begin();
|
| - watcher_it != it->second.end();
|
| - ++watcher_it) {
|
| - const std::string& extension_id = watcher_it->first;
|
| - api::file_system::EntryChangedEvent event;
|
| - dispatch_event_impl_.Run(
|
| - extension_id,
|
| - make_scoped_ptr(
|
| - new Event(api::file_system::OnEntryChanged::kEventName,
|
| - api::file_system::OnEntryChanged::Create(event))));
|
| - }
|
| -}
|
| -
|
| -void EntryWatcherService::OnEntryRemoved(const storage::FileSystemURL& url) {
|
| - WatcherMap::const_iterator it = watchers_.find(url);
|
| - DCHECK(it != watchers_.end());
|
| - for (std::map<std::string, EntryWatcher>::const_iterator watcher_it =
|
| - it->second.begin();
|
| - watcher_it != it->second.end();
|
| - ++watcher_it) {
|
| - const std::string& extension_id = watcher_it->first;
|
| - api::file_system::EntryRemovedEvent event;
|
| - dispatch_event_impl_.Run(
|
| - extension_id,
|
| - make_scoped_ptr(
|
| - new Event(api::file_system::OnEntryRemoved::kEventName,
|
| - api::file_system::OnEntryRemoved::Create(event))));
|
| - }
|
| -}
|
| -
|
| -void EntryWatcherService::OnWatchDirectoryCompleted(
|
| - storage::WatcherManager* watcher_manager,
|
| - const std::string& extension_id,
|
| - const storage::FileSystemURL& url,
|
| - bool recursive,
|
| - const storage::WatcherManager::StatusCallback& callback,
|
| - base::File::Error result) {
|
| - if (result != base::File::FILE_OK) {
|
| - callback.Run(result);
|
| - return;
|
| - }
|
| -
|
| - storage::FileSystemContext* const context =
|
| - get_file_system_context_impl_.Run(extension_id, context_);
|
| - DCHECK(context);
|
| -
|
| - // Observe the manager if not observed yet.
|
| - if (!observing_.IsObserving(watcher_manager))
|
| - observing_.Add(watcher_manager);
|
| -
|
| - watchers_[url][extension_id] =
|
| - EntryWatcher(url, true /* directory */, recursive);
|
| -
|
| - // TODO(mtomasz): Save in preferences.
|
| -
|
| - callback.Run(base::File::FILE_OK);
|
| -}
|
| -
|
| -void EntryWatcherService::OnUnwatchEntryCompleted(
|
| - const std::string& extension_id,
|
| - const storage::FileSystemURL& url,
|
| - const storage::WatcherManager::StatusCallback& callback,
|
| - base::File::Error result) {
|
| - if (result != base::File::FILE_OK) {
|
| - callback.Run(result);
|
| - return;
|
| - }
|
| -
|
| - if (watchers_[url].erase(extension_id) == 0) {
|
| - callback.Run(base::File::FILE_ERROR_NOT_FOUND);
|
| - return;
|
| - }
|
| -
|
| - if (watchers_[url].empty())
|
| - watchers_.erase(url);
|
| -
|
| - // TODO(mtomasz): Save in preferences.
|
| -
|
| - callback.Run(base::File::FILE_OK);
|
| -}
|
| -
|
| -EntryWatcherService::EntryWatcher::EntryWatcher()
|
| - : directory(false), recursive(false) {
|
| -}
|
| -
|
| -EntryWatcherService::EntryWatcher::EntryWatcher(
|
| - const storage::FileSystemURL& url,
|
| - bool directory,
|
| - bool recursive)
|
| - : url(url), directory(directory), recursive(recursive) {
|
| -}
|
| -
|
| -EntryWatcherService::EntryWatcher::~EntryWatcher() {
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|