| Index: chrome/browser/chromeos/extensions/file_manager/open_util.cc
|
| diff --git a/chrome/browser/chromeos/extensions/file_manager/open_util.cc b/chrome/browser/chromeos/extensions/file_manager/open_util.cc
|
| deleted file mode 100644
|
| index d3f9bbafc5746fbc8ff11b9db941a6766a16b8a8..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/extensions/file_manager/open_util.cc
|
| +++ /dev/null
|
| @@ -1,337 +0,0 @@
|
| -// Copyright (c) 2012 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/chromeos/extensions/file_manager/open_util.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/logging.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/chromeos/extensions/file_manager/app_id.h"
|
| -#include "chrome/browser/chromeos/extensions/file_manager/file_browser_handlers.h"
|
| -#include "chrome/browser/chromeos/extensions/file_manager/file_tasks.h"
|
| -#include "chrome/browser/chromeos/extensions/file_manager/fileapi_util.h"
|
| -#include "chrome/browser/chromeos/extensions/file_manager/mime_util.h"
|
| -#include "chrome/browser/chromeos/extensions/file_manager/url_util.h"
|
| -#include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| -#include "chrome/browser/extensions/extension_system.h"
|
| -#include "chrome/browser/google_apis/task_util.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/profiles/profile_manager.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_finder.h"
|
| -#include "chrome/browser/ui/browser_tabstrip.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#include "chrome/browser/ui/extensions/application_launch.h"
|
| -#include "chrome/browser/ui/simple_message_box.h"
|
| -#include "chrome/common/extensions/api/file_browser_handlers/file_browser_handler.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/storage_partition.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "webkit/browser/fileapi/file_system_backend.h"
|
| -#include "webkit/browser/fileapi/file_system_context.h"
|
| -#include "webkit/browser/fileapi/file_system_operation_runner.h"
|
| -#include "webkit/browser/fileapi/file_system_url.h"
|
| -
|
| -using content::BrowserContext;
|
| -using content::BrowserThread;
|
| -using content::UserMetricsAction;
|
| -using extensions::Extension;
|
| -using extensions::app_file_handler_util::FindFileHandlersForFiles;
|
| -using extensions::app_file_handler_util::PathAndMimeTypeSet;
|
| -using fileapi::FileSystemURL;
|
| -
|
| -namespace file_manager {
|
| -namespace util {
|
| -namespace {
|
| -
|
| -// Shows a warning message box saying that the file could not be opened.
|
| -void ShowWarningMessageBox(Profile* profile, const base::FilePath& file_path) {
|
| - // TODO: if FindOrCreateTabbedBrowser creates a new browser the returned
|
| - // browser is leaked.
|
| - Browser* browser =
|
| - chrome::FindOrCreateTabbedBrowser(profile,
|
| - chrome::HOST_DESKTOP_TYPE_ASH);
|
| - chrome::ShowMessageBox(
|
| - browser->window()->GetNativeWindow(),
|
| - l10n_util::GetStringFUTF16(
|
| - IDS_FILE_BROWSER_ERROR_VIEWING_FILE_TITLE,
|
| - UTF8ToUTF16(file_path.BaseName().value())),
|
| - l10n_util::GetStringUTF16(IDS_FILE_BROWSER_ERROR_VIEWING_FILE),
|
| - chrome::MESSAGE_BOX_TYPE_WARNING);
|
| -}
|
| -
|
| -// Grants file system access to the file manager.
|
| -bool GrantFileSystemAccessToFileBrowser(Profile* profile) {
|
| - // The file manager always runs in the site for its extension id, so that
|
| - // is the site for which file access permissions should be granted.
|
| - fileapi::ExternalFileSystemBackend* backend =
|
| - GetFileSystemContextForExtensionId(
|
| - profile, kFileManagerAppId)->external_backend();
|
| - if (!backend)
|
| - return false;
|
| - backend->GrantFullAccessToExtension(kFileManagerAppId);
|
| - return true;
|
| -}
|
| -
|
| -// Executes the |task| for the file specified by |url|.
|
| -void ExecuteFileTaskForUrl(Profile* profile,
|
| - const file_tasks::TaskDescriptor& task,
|
| - const GURL& url) {
|
| - // If the file manager has not been open yet then it did not request access
|
| - // to the file system. Do it now.
|
| - if (!GrantFileSystemAccessToFileBrowser(profile))
|
| - return;
|
| -
|
| - fileapi::FileSystemContext* file_system_context =
|
| - GetFileSystemContextForExtensionId(
|
| - profile, kFileManagerAppId);
|
| -
|
| - // We are executing the task on behalf of the file manager.
|
| - const GURL source_url = GetFileManagerMainPageUrl();
|
| - std::vector<FileSystemURL> urls;
|
| - urls.push_back(file_system_context->CrackURL(url));
|
| -
|
| - file_tasks::ExecuteFileTask(
|
| - profile,
|
| - source_url,
|
| - kFileManagerAppId,
|
| - 0, // no tab id
|
| - task,
|
| - urls,
|
| - file_tasks::FileTaskFinishedCallback());
|
| -}
|
| -
|
| -// Opens the file manager for the specified |file_path|. Used to implement
|
| -// internal handlers of special action IDs:
|
| -//
|
| -// "open" - Open the file manager for the given folder.
|
| -// "auto-open" - Open the file manager for the given removal drive and close
|
| -// the file manager when the removal drive is unmounted.
|
| -// "select" - Open the file manager for the given file. The folder containing
|
| -// the file will be opened with the file selected.
|
| -void OpenFileManagerWithInternalActionId(const base::FilePath& file_path,
|
| - const std::string& action_id) {
|
| - DCHECK(action_id == "auto-open" ||
|
| - action_id == "open" ||
|
| - action_id == "select");
|
| -
|
| - content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab"));
|
| - Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
|
| -
|
| - GURL url;
|
| - if (!ConvertAbsoluteFilePathToFileSystemUrl(
|
| - profile, file_path, kFileManagerAppId, &url))
|
| - return;
|
| -
|
| - file_tasks::TaskDescriptor task(kFileManagerAppId,
|
| - file_tasks::TASK_TYPE_FILE_BROWSER_HANDLER,
|
| - action_id);
|
| - ExecuteFileTaskForUrl(profile, task, url);
|
| -}
|
| -
|
| -// Opens the file specified by |file_path| and |url| with a file handler,
|
| -// preferably the default handler for the type of the file. Returns false if
|
| -// no file handler is found.
|
| -bool OpenFileWithFileHandler(Profile* profile,
|
| - const base::FilePath& file_path,
|
| - const GURL& url,
|
| - const std::string& mime_type,
|
| - const std::string& default_task_id) {
|
| - ExtensionService* service = profile->GetExtensionService();
|
| - if (!service)
|
| - return false;
|
| -
|
| - PathAndMimeTypeSet files;
|
| - files.insert(std::make_pair(file_path, mime_type));
|
| - const extensions::FileHandlerInfo* first_handler = NULL;
|
| - const extensions::Extension* extension_for_first_handler = NULL;
|
| -
|
| - // If we find the default handler, we execute it immediately, but otherwise,
|
| - // we remember the first handler, and if there was no default handler, simply
|
| - // execute the first one.
|
| - for (ExtensionSet::const_iterator iter = service->extensions()->begin();
|
| - iter != service->extensions()->end();
|
| - ++iter) {
|
| - const Extension* extension = iter->get();
|
| -
|
| - // We don't support using hosted apps to open files.
|
| - if (!extension->is_platform_app())
|
| - continue;
|
| -
|
| - // We only support apps that specify "incognito: split" if in incognito
|
| - // mode.
|
| - if (profile->IsOffTheRecord() &&
|
| - !service->IsIncognitoEnabled(extension->id()))
|
| - continue;
|
| -
|
| - typedef std::vector<const extensions::FileHandlerInfo*> FileHandlerList;
|
| - FileHandlerList file_handlers = FindFileHandlersForFiles(*extension, files);
|
| - for (FileHandlerList::iterator i = file_handlers.begin();
|
| - i != file_handlers.end(); ++i) {
|
| - const extensions::FileHandlerInfo* handler = *i;
|
| - std::string task_id = file_tasks::MakeTaskID(
|
| - extension->id(),
|
| - file_tasks::TASK_TYPE_FILE_HANDLER,
|
| - handler->id);
|
| - if (task_id == default_task_id) {
|
| - file_tasks::TaskDescriptor task(extension->id(),
|
| - file_tasks::TASK_TYPE_FILE_HANDLER,
|
| - handler->id);
|
| - ExecuteFileTaskForUrl(profile, task, url);
|
| - return true;
|
| -
|
| - } else if (!first_handler) {
|
| - first_handler = handler;
|
| - extension_for_first_handler = extension;
|
| - }
|
| - }
|
| - }
|
| - if (first_handler) {
|
| - file_tasks::TaskDescriptor task(extension_for_first_handler->id(),
|
| - file_tasks::TASK_TYPE_FILE_HANDLER,
|
| - first_handler->id);
|
| - ExecuteFileTaskForUrl(profile, task, url);
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// Opens the file specified by |file_path| and |url| with the file browser
|
| -// handler specified by |handler|. Returns false if failed to open the file.
|
| -bool OpenFileWithFileBrowserHandler(Profile* profile,
|
| - const base::FilePath& file_path,
|
| - const FileBrowserHandler& handler,
|
| - const GURL& url) {
|
| - file_tasks::TaskDescriptor task(handler.extension_id(),
|
| - file_tasks::TASK_TYPE_FILE_BROWSER_HANDLER,
|
| - handler.id());
|
| - ExecuteFileTaskForUrl(profile, task, url);
|
| - return true;
|
| -}
|
| -
|
| -// Opens the file specified by |file_path| with a handler (either of file
|
| -// browser handler or file handler, preferably the default handler for the
|
| -// type of the file), or opens the file with the browser. Returns false if
|
| -// failed to open the file.
|
| -bool OpenFileWithHandler(Profile* profile, const base::FilePath& file_path) {
|
| - GURL url;
|
| - if (!ConvertAbsoluteFilePathToFileSystemUrl(
|
| - profile, file_path, kFileManagerAppId, &url))
|
| - return false;
|
| -
|
| - std::string mime_type = GetMimeTypeForPath(file_path);
|
| - std::string default_task_id = file_tasks::GetDefaultTaskIdFromPrefs(
|
| - *profile->GetPrefs(), mime_type, file_path.Extension());
|
| -
|
| - // We choose the file handler from the following in decreasing priority or
|
| - // fail if none support the file type:
|
| - // 1. default file browser handler
|
| - // 2. default file handler
|
| - // 3. a fallback handler (e.g. opening in the browser)
|
| - // 4. non-default file handler
|
| - // 5. non-default file browser handler
|
| - // Note that there can be at most one of default extension and default app.
|
| - const FileBrowserHandler* handler =
|
| - file_browser_handlers::FindFileBrowserHandlerForURLAndPath(
|
| - profile, url, file_path);
|
| - if (!handler) {
|
| - return OpenFileWithFileHandler(
|
| - profile, file_path, url, mime_type, default_task_id);
|
| - }
|
| -
|
| - const file_tasks::TaskDescriptor task_descriptor(
|
| - handler->extension_id(),
|
| - file_tasks::TASK_TYPE_FILE_BROWSER_HANDLER,
|
| - handler->id());
|
| - const std::string handler_task_id =
|
| - file_tasks::TaskDescriptorToId(task_descriptor);
|
| - if (handler_task_id != default_task_id &&
|
| - !file_browser_handlers::IsFallbackFileBrowserHandler(task_descriptor) &&
|
| - OpenFileWithFileHandler(
|
| - profile, file_path, url, mime_type, default_task_id)) {
|
| - return true;
|
| - }
|
| - return OpenFileWithFileBrowserHandler(profile, file_path, *handler, url);
|
| -}
|
| -
|
| -// Used to implement OpenItem().
|
| -void ContinueOpenItem(Profile* profile,
|
| - const base::FilePath& file_path,
|
| - base::PlatformFileError error) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (error == base::PLATFORM_FILE_OK) {
|
| - // A directory exists at |file_path|. Open it with the file manager.
|
| - OpenFileManagerWithInternalActionId(file_path, "open");
|
| - } else {
|
| - // |file_path| should be a file. Open it with a handler.
|
| - if (!OpenFileWithHandler(profile, file_path))
|
| - ShowWarningMessageBox(profile, file_path);
|
| - }
|
| -}
|
| -
|
| -// Used to implement CheckIfDirectoryExists().
|
| -void CheckIfDirectoryExistsOnIOThread(
|
| - scoped_refptr<fileapi::FileSystemContext> file_system_context,
|
| - const GURL& url,
|
| - const fileapi::FileSystemOperationRunner::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - fileapi::FileSystemURL file_system_url = file_system_context->CrackURL(url);
|
| - file_system_context->operation_runner()->DirectoryExists(
|
| - file_system_url, callback);
|
| -}
|
| -
|
| -// Checks if a directory exists at |url|.
|
| -void CheckIfDirectoryExists(
|
| - scoped_refptr<fileapi::FileSystemContext> file_system_context,
|
| - const GURL& url,
|
| - const fileapi::FileSystemOperationRunner::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&CheckIfDirectoryExistsOnIOThread,
|
| - file_system_context,
|
| - url,
|
| - google_apis::CreateRelayCallback(callback)));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void OpenRemovableDrive(const base::FilePath& file_path) {
|
| - OpenFileManagerWithInternalActionId(file_path, "auto-open");
|
| -}
|
| -
|
| -void OpenItem(const base::FilePath& file_path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
|
| - GURL url;
|
| - if (!ConvertAbsoluteFilePathToFileSystemUrl(
|
| - profile, file_path, kFileManagerAppId, &url) ||
|
| - !GrantFileSystemAccessToFileBrowser(profile)) {
|
| - ShowWarningMessageBox(profile, file_path);
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<fileapi::FileSystemContext> file_system_context =
|
| - GetFileSystemContextForExtensionId(
|
| - profile, kFileManagerAppId);
|
| -
|
| - CheckIfDirectoryExists(file_system_context, url,
|
| - base::Bind(&ContinueOpenItem, profile, file_path));
|
| -}
|
| -
|
| -void ShowItemInFolder(const base::FilePath& file_path) {
|
| - // This action changes the selection so we do not reuse existing tabs.
|
| - OpenFileManagerWithInternalActionId(file_path, "select");
|
| -}
|
| -
|
| -} // namespace util
|
| -} // namespace file_manager
|
|
|