| Index: chrome/browser/chromeos/file_manager/open_util.cc
|
| diff --git a/chrome/browser/chromeos/file_manager/open_util.cc b/chrome/browser/chromeos/file_manager/open_util.cc
|
| index de05b8b7c39c07a9983d9acfe069d6a204b9daa6..ae334e360479c6d9d183449eae134b54b1b76dc9 100644
|
| --- a/chrome/browser/chromeos/file_manager/open_util.cc
|
| +++ b/chrome/browser/chromeos/file_manager/open_util.cc
|
| @@ -15,6 +15,7 @@
|
| #include "chrome/browser/chromeos/file_manager/path_util.h"
|
| #include "chrome/browser/chromeos/file_manager/url_util.h"
|
| #include "chrome/browser/extensions/api/file_handlers/mime_util.h"
|
| +#include "chrome/browser/platform_util_internal.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_finder.h"
|
| #include "chrome/browser/ui/browser_window.h"
|
| @@ -35,25 +36,14 @@ 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,
|
| - int message_id) {
|
| - Browser* browser = chrome::FindTabbedBrowser(
|
| - profile, false, chrome::HOST_DESKTOP_TYPE_ASH);
|
| - chrome::ShowMessageBox(
|
| - browser ? browser->window()->GetNativeWindow() : NULL,
|
| - l10n_util::GetStringFUTF16(
|
| - IDS_FILE_BROWSER_ERROR_VIEWING_FILE_TITLE,
|
| - base::UTF8ToUTF16(file_path.BaseName().AsUTF8Unsafe())),
|
| - l10n_util::GetStringUTF16(message_id),
|
| - chrome::MESSAGE_BOX_TYPE_WARNING);
|
| -}
|
| +bool shell_operations_allowed = true;
|
|
|
| // Executes the |task| for the file specified by |url|.
|
| void ExecuteFileTaskForUrl(Profile* profile,
|
| const file_tasks::TaskDescriptor& task,
|
| const GURL& url) {
|
| + if (!shell_operations_allowed)
|
| + return;
|
| storage::FileSystemContext* file_system_context =
|
| GetFileSystemContextForExtensionId(profile, kFileManagerAppId);
|
|
|
| @@ -75,6 +65,8 @@ void OpenFileManagerWithInternalActionId(Profile* profile,
|
| const GURL& url,
|
| const std::string& action_id) {
|
| DCHECK(action_id == "open" || action_id == "select");
|
| + if (!shell_operations_allowed)
|
| + return;
|
| content::RecordAction(base::UserMetricsAction("ShowFileBrowserFullTab"));
|
|
|
| file_tasks::TaskDescriptor task(kFileManagerAppId,
|
| @@ -83,11 +75,11 @@ void OpenFileManagerWithInternalActionId(Profile* profile,
|
| ExecuteFileTaskForUrl(profile, task, url);
|
| }
|
|
|
| -// Opens the file with fetched MIME type and calls the callback.
|
| +// Opens the file with fetched MIME type and warns the user on failure.
|
| void OpenFileWithMimeType(Profile* profile,
|
| + const platform_util::OpenOperationCallback& callback,
|
| const base::FilePath& path,
|
| const GURL& url,
|
| - const base::Callback<void(bool)>& callback,
|
| const std::string& mime_type) {
|
| extensions::app_file_handler_util::PathAndMimeTypeSet path_mime_set;
|
| path_mime_set.insert(std::make_pair(path, mime_type));
|
| @@ -104,109 +96,110 @@ void OpenFileWithMimeType(Profile* profile,
|
| &tasks);
|
|
|
| if (tasks.empty()) {
|
| - callback.Run(false);
|
| + callback.Run(platform_util::OPEN_FAILED_NO_HANLDER_FOR_FILE_TYPE);
|
| return;
|
| }
|
|
|
| const file_tasks::FullTaskDescriptor* chosen_task = &tasks[0];
|
| - for (size_t i = 0; i < tasks.size(); ++i) {
|
| - if (tasks[i].is_default()) {
|
| - chosen_task = &tasks[i];
|
| + for (const auto& task : tasks) {
|
| + if (task.is_default()) {
|
| + chosen_task = &task;
|
| break;
|
| }
|
| }
|
|
|
| - ExecuteFileTaskForUrl(profile, chosen_task->task_descriptor(), url);
|
| - callback.Run(true);
|
| -}
|
| -
|
| -// Opens the file specified by |url| by finding and executing a file task for
|
| -// the file. In case of success, calls |callback| with true. Otherwise the
|
| -// returned value is false.
|
| -void OpenFile(Profile* profile,
|
| - const base::FilePath& path,
|
| - const GURL& url,
|
| - const base::Callback<void(bool)>& callback) {
|
| - extensions::app_file_handler_util::GetMimeTypeForLocalPath(
|
| - profile,
|
| - path,
|
| - base::Bind(&OpenFileWithMimeType, profile, path, url, callback));
|
| -}
|
| -
|
| -// Called when execution of ContinueOpenItem() is completed.
|
| -void OnContinueOpenItemCompleted(Profile* profile,
|
| - const base::FilePath& file_path,
|
| - bool result) {
|
| - if (!result) {
|
| - int message;
|
| - if (file_path.Extension() == FILE_PATH_LITERAL(".dmg"))
|
| - message = IDS_FILE_BROWSER_ERROR_VIEWING_FILE_FOR_DMG;
|
| - else if (file_path.Extension() == FILE_PATH_LITERAL(".exe") ||
|
| - file_path.Extension() == FILE_PATH_LITERAL(".msi"))
|
| - message = IDS_FILE_BROWSER_ERROR_VIEWING_FILE_FOR_EXECUTABLE;
|
| - else
|
| - message = IDS_FILE_BROWSER_ERROR_VIEWING_FILE;
|
| - ShowWarningMessageBox(profile, file_path, message);
|
| - }
|
| + if (shell_operations_allowed)
|
| + ExecuteFileTaskForUrl(profile, chosen_task->task_descriptor(), url);
|
| + callback.Run(platform_util::OPEN_SUCCEEDED);
|
| }
|
|
|
| -// Used to implement OpenItem().
|
| void ContinueOpenItem(Profile* profile,
|
| const base::FilePath& file_path,
|
| const GURL& url,
|
| - base::File::Error error) {
|
| + platform_util::internal::OpenItemType expected_type,
|
| + const platform_util::OpenOperationCallback& callback,
|
| + base::File::Error error,
|
| + const base::File::Info& file_info) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + if (error != base::File::FILE_OK) {
|
| + callback.Run(error == base::File::FILE_ERROR_NOT_FOUND
|
| + ? platform_util::OPEN_FAILED_PATH_NOT_FOUND
|
| + : platform_util::OPEN_FAILED_FILE_ERROR);
|
| + return;
|
| + }
|
|
|
| - if (error == base::File::FILE_OK) {
|
| - // A directory exists at |url|. Open it with the file manager.
|
| + if (expected_type == platform_util::internal::OPEN_FOLDER &&
|
| + file_info.is_directory) {
|
| OpenFileManagerWithInternalActionId(profile, url, "open");
|
| - } else {
|
| - // |url| should be a file. Open it.
|
| - OpenFile(profile,
|
| - file_path,
|
| - url,
|
| - base::Bind(&OnContinueOpenItemCompleted, profile, file_path));
|
| + callback.Run(platform_util::OPEN_SUCCEEDED);
|
| + return;
|
| }
|
| -}
|
|
|
| -// Converts the |path| passed from external callers to the filesystem URL
|
| -// that the file manager can correctly handle.
|
| -//
|
| -// When conversion fails, it shows a warning dialog UI and returns false.
|
| -bool ConvertPath(Profile* profile, const base::FilePath& path, GURL* url) {
|
| - if (!ConvertAbsoluteFilePathToFileSystemUrl(
|
| - profile, path, kFileManagerAppId, url)) {
|
| - ShowWarningMessageBox(profile, path,
|
| - IDS_FILE_BROWSER_ERROR_UNRESOLVABLE_FILE);
|
| - return false;
|
| + if (expected_type == platform_util::internal::OPEN_FILE &&
|
| + !file_info.is_directory) {
|
| + extensions::app_file_handler_util::GetMimeTypeForLocalPath(
|
| + profile, file_path,
|
| + base::Bind(&OpenFileWithMimeType, profile, callback, file_path, url));
|
| + return;
|
| }
|
| - return true;
|
| -}
|
|
|
| -} // namespace
|
| + callback.Run(platform_util::OPEN_FAILED_INVALID_TYPE);
|
| +}
|
|
|
| -void OpenItem(Profile* profile, const base::FilePath& file_path) {
|
| +void VerifyAndOpenItem(Profile* profile,
|
| + const base::FilePath& file_path,
|
| + platform_util::internal::OpenItemType expected_type,
|
| + const platform_util::OpenOperationCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| GURL url;
|
| - if (!ConvertPath(profile, file_path, &url))
|
| + if (!ConvertAbsoluteFilePathToFileSystemUrl(profile, file_path,
|
| + kFileManagerAppId, &url)) {
|
| + callback.Run(platform_util::OPEN_FAILED_PATH_NOT_FOUND);
|
| return;
|
| + }
|
|
|
| - CheckIfDirectoryExists(
|
| - GetFileSystemContextForExtensionId(profile, kFileManagerAppId),
|
| - url,
|
| - base::Bind(&ContinueOpenItem, profile, file_path, url));
|
| + GetMetadataForPath(
|
| + GetFileSystemContextForExtensionId(profile, kFileManagerAppId), url,
|
| + base::Bind(&ContinueOpenItem, profile, file_path, url, expected_type,
|
| + callback));
|
| }
|
|
|
| -void ShowItemInFolder(Profile* profile, const base::FilePath& file_path) {
|
| +} // namespace
|
| +
|
| +void OpenFile(Profile* profile,
|
| + const base::FilePath& file_path,
|
| + const platform_util::OpenOperationCallback& callback) {
|
| + VerifyAndOpenItem(profile, file_path, platform_util::internal::OPEN_FILE,
|
| + callback);
|
| +}
|
| +
|
| +void OpenFolder(Profile* profile,
|
| + const base::FilePath& file_path,
|
| + const platform_util::OpenOperationCallback& callback) {
|
| + VerifyAndOpenItem(profile, file_path, platform_util::internal::OPEN_FOLDER,
|
| + callback);
|
| +}
|
| +
|
| +void ShowItemInFolder(Profile* profile,
|
| + const base::FilePath& file_path,
|
| + const platform_util::OpenOperationCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| GURL url;
|
| - if (!ConvertPath(profile, file_path, &url))
|
| + if (!ConvertAbsoluteFilePathToFileSystemUrl(profile, file_path,
|
| + kFileManagerAppId, &url)) {
|
| + callback.Run(platform_util::OPEN_FAILED_PATH_NOT_FOUND);
|
| return;
|
| + }
|
|
|
| // This action changes the selection so we do not reuse existing tabs.
|
| OpenFileManagerWithInternalActionId(profile, url, "select");
|
| + callback.Run(platform_util::OPEN_SUCCEEDED);
|
| +}
|
| +
|
| +void DisableShellOperationsForTesting() {
|
| + shell_operations_allowed = false;
|
| }
|
|
|
| } // namespace util
|
|
|