| Index: chrome/browser/chromeos/extensions/file_handler_util.cc
|
| diff --git a/chrome/browser/chromeos/extensions/file_handler_util.cc b/chrome/browser/chromeos/extensions/file_handler_util.cc
|
| index dc5aa726cd1369365d4c5418ddbb440e7111d5d9..b6b56e4c97f31656e1a6116e5744107320fc8d2a 100644
|
| --- a/chrome/browser/chromeos/extensions/file_handler_util.cc
|
| +++ b/chrome/browser/chromeos/extensions/file_handler_util.cc
|
| @@ -49,6 +49,7 @@ using content::ChildProcessSecurityPolicy;
|
| using content::SiteInstance;
|
| using content::WebContents;
|
| using extensions::Extension;
|
| +using fileapi::FileSystemURL;
|
|
|
| namespace file_handler_util {
|
|
|
| @@ -347,27 +348,19 @@ FileBrowserHandlerSet::iterator FindHandler(
|
| // Given the list of selected files, returns array of file action tasks
|
| // that are shared between them.
|
| void FindDefaultTasks(Profile* profile,
|
| - const std::vector<GURL>& files_list,
|
| + const std::vector<FilePath>& files_list,
|
| const FileBrowserHandlerSet& common_tasks,
|
| FileBrowserHandlerSet* default_tasks) {
|
| DCHECK(default_tasks);
|
| default_tasks->clear();
|
|
|
| std::set<std::string> default_ids;
|
| - for (std::vector<GURL>::const_iterator it = files_list.begin();
|
| + for (std::vector<FilePath>::const_iterator it = files_list.begin();
|
| it != files_list.end(); ++it) {
|
| - // Get the default task for this file based only on the extension (since
|
| - // we don't have MIME types here), and add it to the set of default tasks.
|
| - fileapi::FileSystemURL filesystem_url(*it);
|
| - if (filesystem_url.is_valid() &&
|
| - (filesystem_url.type() == fileapi::kFileSystemTypeDrive ||
|
| - filesystem_url.type() == fileapi::kFileSystemTypeNativeMedia ||
|
| - filesystem_url.type() == fileapi::kFileSystemTypeNativeLocal)) {
|
| - std::string task_id = file_handler_util::GetDefaultTaskIdFromPrefs(
|
| - profile, "", filesystem_url.virtual_path().Extension());
|
| - if (!task_id.empty())
|
| - default_ids.insert(task_id);
|
| - }
|
| + std::string task_id = file_handler_util::GetDefaultTaskIdFromPrefs(
|
| + profile, "", it->Extension());
|
| + if (!task_id.empty())
|
| + default_ids.insert(task_id);
|
| }
|
|
|
| const FileBrowserHandler* builtin_task = NULL;
|
| @@ -454,8 +447,10 @@ bool FindCommonTasks(Profile* profile,
|
| return true;
|
| }
|
|
|
| -bool GetTaskForURL(
|
| - Profile* profile, const GURL& url, const FileBrowserHandler** handler) {
|
| +bool GetTaskForURLAndPath(Profile* profile,
|
| + const GURL& url,
|
| + const FilePath& file_path,
|
| + const FileBrowserHandler** handler) {
|
| std::vector<GURL> file_urls;
|
| file_urls.push_back(url);
|
|
|
| @@ -467,7 +462,10 @@ bool GetTaskForURL(
|
| if (common_tasks.empty())
|
| return false;
|
|
|
| - FindDefaultTasks(profile, file_urls, common_tasks, &default_tasks);
|
| + std::vector<FilePath> file_paths;
|
| + file_paths.push_back(file_path);
|
| +
|
| + FindDefaultTasks(profile, file_paths, common_tasks, &default_tasks);
|
|
|
| // If there's none, or more than one, then we don't have a canonical default.
|
| if (!default_tasks.empty()) {
|
| @@ -488,7 +486,7 @@ bool GetTaskForURL(
|
| class ExtensionTaskExecutor : public FileTaskExecutor {
|
| public:
|
| // FileTaskExecutor overrides.
|
| - virtual bool ExecuteAndNotify(const std::vector<GURL>& file_urls,
|
| + virtual bool ExecuteAndNotify(const std::vector<FileSystemURL>& file_urls,
|
| const FileTaskFinishedCallback& done) OVERRIDE;
|
|
|
| private:
|
| @@ -507,7 +505,6 @@ class ExtensionTaskExecutor : public FileTaskExecutor {
|
| FileDefinition();
|
| ~FileDefinition();
|
|
|
| - GURL target_file_url;
|
| FilePath virtual_path;
|
| FilePath absolute_path;
|
| bool is_directory;
|
| @@ -520,7 +517,7 @@ class ExtensionTaskExecutor : public FileTaskExecutor {
|
| const GURL& handler_base_url,
|
| const scoped_refptr<const extensions::Extension>& handler,
|
| int handler_pid,
|
| - const std::vector<GURL>& file_urls);
|
| + const std::vector<FileSystemURL>& file_urls);
|
|
|
| void ExecuteDoneOnUIThread(bool success);
|
| void ExecuteFileActionsOnUIThread(const std::string& file_system_name,
|
| @@ -548,7 +545,7 @@ class ExtensionTaskExecutor : public FileTaskExecutor {
|
| class WebIntentTaskExecutor : public FileTaskExecutor {
|
| public:
|
| // FileTaskExecutor overrides.
|
| - virtual bool ExecuteAndNotify(const std::vector<GURL>& file_urls,
|
| + virtual bool ExecuteAndNotify(const std::vector<FileSystemURL>& file_urls,
|
| const FileTaskFinishedCallback& done) OVERRIDE;
|
|
|
| private:
|
| @@ -569,7 +566,7 @@ class WebIntentTaskExecutor : public FileTaskExecutor {
|
| class AppTaskExecutor : public FileTaskExecutor {
|
| public:
|
| // FileTaskExecutor overrides.
|
| - virtual bool ExecuteAndNotify(const std::vector<GURL>& file_urls,
|
| + virtual bool ExecuteAndNotify(const std::vector<FileSystemURL>& file_urls,
|
| const FileTaskFinishedCallback& done) OVERRIDE;
|
|
|
| private:
|
| @@ -639,12 +636,12 @@ FileTaskExecutor::FileTaskExecutor(Profile* profile,
|
| FileTaskExecutor::~FileTaskExecutor() {
|
| }
|
|
|
| -bool FileTaskExecutor::Execute(const std::vector<GURL>& file_urls) {
|
| +bool FileTaskExecutor::Execute(const std::vector<FileSystemURL>& file_urls) {
|
| return ExecuteAndNotify(file_urls, FileTaskFinishedCallback());
|
| }
|
|
|
| bool FileTaskExecutor::FileBrowserHasAccessPermissionForFiles(
|
| - const std::vector<GURL>& files) {
|
| + const std::vector<FileSystemURL>& files) {
|
| // Check if the file browser extension has permissions for the files in its
|
| // file system context.
|
| GURL site = extensions::ExtensionSystem::Get(profile())->extension_service()->
|
| @@ -657,13 +654,12 @@ bool FileTaskExecutor::FileBrowserHasAccessPermissionForFiles(
|
| return false;
|
|
|
| for (size_t i = 0; i < files.size(); ++i) {
|
| - fileapi::FileSystemURL url(files[i]);
|
| // Make sure this url really being used by the right caller extension.
|
| - if (source_url_.GetOrigin() != url.origin())
|
| + if (source_url_.GetOrigin() != files[i].origin())
|
| return false;
|
|
|
| - if (!chromeos::CrosMountPointProvider::CanHandleURL(url) ||
|
| - !external_provider->IsAccessAllowed(url)) {
|
| + if (!chromeos::CrosMountPointProvider::CanHandleURL(files[i]) ||
|
| + !external_provider->IsAccessAllowed(files[i])) {
|
| return false;
|
| }
|
| }
|
| @@ -702,7 +698,7 @@ class ExtensionTaskExecutor::ExecuteTasksFileSystemCallbackDispatcher {
|
| scoped_refptr<const Extension> handler_extension,
|
| int handler_pid,
|
| const std::string& action_id,
|
| - const std::vector<GURL>& file_urls) {
|
| + const std::vector<FileSystemURL>& file_urls) {
|
| return base::Bind(
|
| &ExecuteTasksFileSystemCallbackDispatcher::DidOpenFileSystem,
|
| base::Owned(new ExecuteTasksFileSystemCallbackDispatcher(
|
| @@ -719,8 +715,8 @@ class ExtensionTaskExecutor::ExecuteTasksFileSystemCallbackDispatcher {
|
| }
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| ExtensionTaskExecutor::FileDefinitionList file_list;
|
| - for (std::vector<GURL>::iterator iter = origin_file_urls_.begin();
|
| - iter != origin_file_urls_.end();
|
| + for (std::vector<FileSystemURL>::iterator iter = urls_.begin();
|
| + iter != urls_.end();
|
| ++iter) {
|
| // Set up file permission access.
|
| ExtensionTaskExecutor::FileDefinition file;
|
| @@ -765,19 +761,19 @@ class ExtensionTaskExecutor::ExecuteTasksFileSystemCallbackDispatcher {
|
| const scoped_refptr<const Extension>& handler_extension,
|
| int handler_pid,
|
| const std::string& action_id,
|
| - const std::vector<GURL>& file_urls)
|
| + const std::vector<FileSystemURL>& file_urls)
|
| : executor_(executor),
|
| file_system_context_handler_(file_system_context_handler),
|
| handler_extension_(handler_extension),
|
| handler_pid_(handler_pid),
|
| action_id_(action_id),
|
| - origin_file_urls_(file_urls) {
|
| + urls_(file_urls) {
|
| DCHECK(executor_);
|
| }
|
|
|
| // Checks legitimacy of file url and grants file RO access permissions from
|
| // handler (target) extension and its renderer process.
|
| - bool SetupFileAccessPermissions(const GURL& origin_file_url,
|
| + bool SetupFileAccessPermissions(const FileSystemURL& url,
|
| FileDefinition* file) {
|
| if (!handler_extension_.get())
|
| return false;
|
| @@ -785,8 +781,6 @@ class ExtensionTaskExecutor::ExecuteTasksFileSystemCallbackDispatcher {
|
| if (handler_pid_ == 0)
|
| return false;
|
|
|
| - fileapi::FileSystemURL url(origin_file_url);
|
| -
|
| fileapi::ExternalFileSystemMountPointProvider* external_provider_handler =
|
| file_system_context_handler_->external_provider();
|
|
|
| @@ -816,11 +810,6 @@ class ExtensionTaskExecutor::ExecuteTasksFileSystemCallbackDispatcher {
|
| handler_extension_->id(), virtual_path);
|
|
|
| // Output values.
|
| - GURL target_origin_url(Extension::GetBaseURLFromExtensionId(
|
| - handler_extension_->id()));
|
| - GURL base_url = fileapi::GetFileSystemRootURI(target_origin_url,
|
| - fileapi::kFileSystemTypeExternal);
|
| - file->target_file_url = GURL(base_url.spec() + virtual_path.value());
|
| file->virtual_path = virtual_path;
|
| file->is_directory = file_info.is_directory;
|
| file->absolute_path = local_path;
|
| @@ -832,7 +821,7 @@ class ExtensionTaskExecutor::ExecuteTasksFileSystemCallbackDispatcher {
|
| scoped_refptr<const Extension> handler_extension_;
|
| int handler_pid_;
|
| std::string action_id_;
|
| - std::vector<GURL> origin_file_urls_;
|
| + std::vector<FileSystemURL> urls_;
|
| DISALLOW_COPY_AND_ASSIGN(ExecuteTasksFileSystemCallbackDispatcher);
|
| };
|
|
|
| @@ -851,7 +840,7 @@ ExtensionTaskExecutor::ExtensionTaskExecutor(
|
| ExtensionTaskExecutor::~ExtensionTaskExecutor() {}
|
|
|
| bool ExtensionTaskExecutor::ExecuteAndNotify(
|
| - const std::vector<GURL>& file_urls,
|
| + const std::vector<FileSystemURL>& file_urls,
|
| const FileTaskFinishedCallback& done) {
|
| if (!FileBrowserHasAccessPermissionForFiles(file_urls))
|
| return false;
|
| @@ -895,7 +884,7 @@ void ExtensionTaskExecutor::RequestFileEntryOnFileThread(
|
| const GURL& handler_base_url,
|
| const scoped_refptr<const Extension>& handler,
|
| int handler_pid,
|
| - const std::vector<GURL>& file_urls) {
|
| + const std::vector<FileSystemURL>& file_urls) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| GURL origin_url = handler_base_url.GetOrigin();
|
| file_system_context_handler->OpenFileSystem(
|
| @@ -1036,15 +1025,14 @@ WebIntentTaskExecutor::WebIntentTaskExecutor(
|
| WebIntentTaskExecutor::~WebIntentTaskExecutor() {}
|
|
|
| bool WebIntentTaskExecutor::ExecuteAndNotify(
|
| - const std::vector<GURL>& file_urls,
|
| + const std::vector<FileSystemURL>& file_urls,
|
| const FileTaskFinishedCallback& done) {
|
| if (!FileBrowserHasAccessPermissionForFiles(file_urls))
|
| return false;
|
|
|
| for (size_t i = 0; i != file_urls.size(); ++i) {
|
| - fileapi::FileSystemURL url(file_urls[i]);
|
| extensions::LaunchPlatformAppWithPath(profile(), GetExtension(),
|
| - url.path());
|
| + file_urls[i].path());
|
| }
|
|
|
| if (!done.is_null())
|
| @@ -1066,20 +1054,18 @@ AppTaskExecutor::AppTaskExecutor(
|
| AppTaskExecutor::~AppTaskExecutor() {}
|
|
|
| bool AppTaskExecutor::ExecuteAndNotify(
|
| - const std::vector<GURL>& file_urls,
|
| + const std::vector<FileSystemURL>& file_urls,
|
| const FileTaskFinishedCallback& done) {
|
| if (!FileBrowserHasAccessPermissionForFiles(file_urls))
|
| return false;
|
|
|
| for (size_t i = 0; i != file_urls.size(); ++i) {
|
| - fileapi::FileSystemURL url(file_urls[i]);
|
| extensions::LaunchPlatformAppWithFileHandler(profile(), GetExtension(),
|
| - action_id_, url.path());
|
| + action_id_, file_urls[i].path());
|
| }
|
|
|
| if (!done.is_null())
|
| done.Run(true);
|
| -
|
| return true;
|
| }
|
|
|
|
|