summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/extensions/file_browser_private_api.cc
diff options
context:
space:
mode:
authorjeremya@chromium.org <jeremya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-22 01:58:42 +0000
committerjeremya@chromium.org <jeremya@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-22 01:58:42 +0000
commitaf8dc08e617ea9c7757795318e50652601a0ec6f (patch)
tree4b16cc16929d0cbb9f0a6572877d17ee68ce341c /chrome/browser/chromeos/extensions/file_browser_private_api.cc
parentad65e6b83eb295f4499fcbd299ade2815e05893f (diff)
downloadchromium_src-af8dc08e617ea9c7757795318e50652601a0ec6f.zip
chromium_src-af8dc08e617ea9c7757795318e50652601a0ec6f.tar.gz
chromium_src-af8dc08e617ea9c7757795318e50652601a0ec6f.tar.bz2
Introduce a FileHandlerInfo structure seperate to web intents for platform apps.
For now we check both intents and file handlers in the platform app launching code, but once intents go away from extensions entirely we can remove the extra check. R=benwells@chromium.org TBR=jhawkins@chromium.org Review URL: https://chromiumcodereview.appspot.com/11312034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@169191 0039d316-1c4b-4281-b951-d872f2087c98
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;