summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/extensions/file_browser_private_api.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/extensions/file_browser_private_api.cc')
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_private_api.cc100
1 files changed, 84 insertions, 16 deletions
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api.cc b/chrome/browser/chromeos/extensions/file_browser_private_api.cc
index da0cbeb..f5e4cad 100644
--- a/chrome/browser/chromeos/extensions/file_browser_private_api.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api.cc
@@ -34,6 +34,7 @@
#include "chrome/browser/chromeos/extensions/file_handler_util.h"
#include "chrome/browser/chromeos/extensions/file_manager_util.h"
#include "chrome/browser/chromeos/system/statistics_provider.h"
+#include "chrome/browser/extensions/app_file_handler_util.h"
#include "chrome/browser/extensions/extension_function_dispatcher.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -75,6 +76,7 @@
#include "webkit/fileapi/file_system_util.h"
#include "webkit/glue/web_intent_service_data.h"
+using app_file_handler_util::FindFileHandlersForMimeTypes;
using chromeos::disks::DiskMountManager;
using content::BrowserContext;
using content::BrowserThread;
@@ -793,17 +795,8 @@ bool GetFileTasksFileBrowserFunction::FindDriveAppTasks(
return true;
}
-// Find Web Intent platform apps that support the View task, and add them to
-// the |result_list|. These will be marked as kTaskWebIntent.
-bool GetFileTasksFileBrowserFunction::FindWebIntentTasks(
- const std::vector<GURL>& file_urls,
- ListValue* result_list) {
- DCHECK(!file_urls.empty());
- ExtensionService* service = profile_->GetExtensionService();
- if (!service)
- return false;
-
- std::set<std::string> mime_types;
+static void GetMimeTypesForFileURLs(const std::vector<GURL>& file_urls,
+ std::set<std::string>* mime_types) {
for (std::vector<GURL>::const_iterator iter = file_urls.begin();
iter != file_urls.end(); ++iter) {
const FilePath file = FilePath(GURL(iter->spec()).ExtractFileName());
@@ -819,12 +812,81 @@ bool GetFileTasksFileBrowserFunction::FindWebIntentTasks(
// If the file doesn't have an extension or its mime-type cannot be
// determined, then indicate that it has the empty mime-type. This will
// only be matched if the Web Intents accepts "*" or "*/*".
- mime_types.insert("");
+ mime_types->insert("");
} else {
- mime_types.insert(mime_type);
+ mime_types->insert(mime_type);
+ }
+ }
+}
+
+bool GetFileTasksFileBrowserFunction::FindAppTasks(
+ const std::vector<GURL>& file_urls,
+ ListValue* result_list) {
+ DCHECK(!file_urls.empty());
+ ExtensionService* service = profile_->GetExtensionService();
+ if (!service)
+ return false;
+
+ std::set<std::string> mime_types;
+ GetMimeTypesForFileURLs(file_urls, &mime_types);
+
+ for (ExtensionSet::const_iterator iter = service->extensions()->begin();
+ iter != service->extensions()->end();
+ ++iter) {
+ const Extension* extension = *iter;
+
+ // We don't support using hosted apps to open files.
+ if (!extension->is_platform_app())
+ continue;
+
+ if (profile_->IsOffTheRecord() &&
+ !service->IsIncognitoEnabled(extension->id()))
+ continue;
+
+ typedef std::vector<const Extension::FileHandlerInfo*> FileHandlerList;
+ FileHandlerList file_handlers =
+ FindFileHandlersForMimeTypes(*extension, mime_types);
+ // TODO(benwells): also support matching by file extension.
+ if (file_handlers.empty())
+ continue;
+
+ for (FileHandlerList::iterator i = file_handlers.begin();
+ i != file_handlers.end(); ++i) {
+ DictionaryValue* task = new DictionaryValue;
+ std::string task_id = file_handler_util::MakeTaskID(extension->id(),
+ file_handler_util::kTaskApp, (*i)->id);
+ task->SetString("taskId", task_id);
+ task->SetString("title", (*i)->title);
+ task->SetBoolean("isDefault", false);
+
+ GURL best_icon = extension->GetIconURL(kPreferredIconSize,
+ ExtensionIconSet::MATCH_BIGGER);
+ if (!best_icon.is_empty())
+ task->SetString("iconUrl", best_icon.spec());
+ else
+ task->SetString("iconUrl", kDefaultIcon);
+
+ task->SetBoolean("driveApp", false);
+ result_list->Append(task);
}
}
+ return true;
+}
+
+// Find Web Intent platform apps that support the View task, and add them to
+// the |result_list|. These will be marked as kTaskWebIntent.
+bool GetFileTasksFileBrowserFunction::FindWebIntentTasks(
+ const std::vector<GURL>& file_urls,
+ ListValue* result_list) {
+ DCHECK(!file_urls.empty());
+ ExtensionService* service = profile_->GetExtensionService();
+ if (!service)
+ return false;
+
+ std::set<std::string> mime_types;
+ GetMimeTypesForFileURLs(file_urls, &mime_types);
+
for (ExtensionSet::const_iterator iter = service->extensions()->begin();
iter != service->extensions()->end();
++iter) {
@@ -958,9 +1020,15 @@ bool GetFileTasksFileBrowserFunction::RunImpl() {
result_list->Append(task);
}
- // Take the union of Web Intents (that platform apps may accept) and all
- // previous Drive and extension tasks. As above, we know there aren't
- // duplicates because they're entirely different kinds of tasks.
+ // Take the union of platform app file handlers, Web Intents that platform
+ // apps may accept, and all previous Drive and extension tasks. As above, we
+ // know there aren't duplicates because they're entirely different kinds of
+ // tasks.
+ if (!FindAppTasks(file_urls, result_list))
+ return false;
+
+ // TODO(benwells): remove the web intents tasks once we no longer support
+ // them.
if (!FindWebIntentTasks(file_urls, result_list))
return false;