158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/file_tasks.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <algorithm>
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <utility>
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/command_line.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/values.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_id.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/drive_app_registry.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/pref_names.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_prefs.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension_builder.h"
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h"
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "url/gurl.h"
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace file_manager {
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace file_tasks {
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Registers the default task preferences. Used for testing
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// ChooseAndSetDefaultTask().
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void RegisterDefaultTaskPreferences(TestingPrefServiceSimple* pref_service) {
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(pref_service);
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pref_service->registry()->RegisterDictionaryPref(
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      prefs::kDefaultTasksByMimeType);
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pref_service->registry()->RegisterDictionaryPref(
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      prefs::kDefaultTasksBySuffix);
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Updates the default task preferences per the given dictionary values. Used
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// for testing ChooseAndSetDefaultTask.
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void UpdateDefaultTaskPreferences(TestingPrefServiceSimple* pref_service,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const base::DictionaryValue& mime_types,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const base::DictionaryValue& suffixes) {
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(pref_service);
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pref_service->Set(prefs::kDefaultTasksByMimeType, mime_types);
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pref_service->Set(prefs::kDefaultTasksBySuffix, suffixes);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest,
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     FullTaskDescriptor_NonDriveAppWithIconAndDefault) {
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FullTaskDescriptor full_descriptor(
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TaskDescriptor("app-id",
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     TASK_TYPE_FILE_BROWSER_HANDLER,
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "action-id"),
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "task title",
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GURL("http://example.com/icon.png"),
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      true /* is_default */);
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string task_id =
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TaskDescriptorToId(full_descriptor.task_descriptor());
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id|file|action-id", task_id);
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("http://example.com/icon.png", full_descriptor.icon_url().spec());
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("task title", full_descriptor.task_title());
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(full_descriptor.is_default());
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest,
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     FullTaskDescriptor_DriveAppWithoutIconAndNotDefault) {
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FullTaskDescriptor full_descriptor(
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TaskDescriptor("app-id",
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     TASK_TYPE_DRIVE_APP,
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "action-id"),
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "task title",
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GURL(),  // No icon URL.
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      false /* is_default */);
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string task_id =
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TaskDescriptorToId(full_descriptor.task_descriptor());
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id|drive|action-id", task_id);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(full_descriptor.icon_url().is_empty());
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("task title", full_descriptor.task_title());
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(full_descriptor.is_default());
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, MakeTaskID) {
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id|file|action-id",
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            MakeTaskID("app-id", TASK_TYPE_FILE_BROWSER_HANDLER, "action-id"));
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id|app|action-id",
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            MakeTaskID("app-id", TASK_TYPE_FILE_HANDLER, "action-id"));
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id|drive|action-id",
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            MakeTaskID("app-id", TASK_TYPE_DRIVE_APP, "action-id"));
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, TaskDescriptorToId) {
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id|file|action-id",
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            TaskDescriptorToId(TaskDescriptor("app-id",
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                              TASK_TYPE_FILE_BROWSER_HANDLER,
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                              "action-id")));
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_FileBrowserHandler) {
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ParseTaskID("app-id|file|action-id", &task));
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id", task.app_id);
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(TASK_TYPE_FILE_BROWSER_HANDLER, task.task_type);
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("action-id", task.action_id);
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_FileHandler) {
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ParseTaskID("app-id|app|action-id", &task));
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id", task.app_id);
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(TASK_TYPE_FILE_HANDLER, task.task_type);
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("action-id", task.action_id);
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_DriveApp) {
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ParseTaskID("app-id|drive|action-id", &task));
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id", task.app_id);
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(TASK_TYPE_DRIVE_APP, task.task_type);
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("action-id", task.action_id);
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_Legacy) {
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // A legacy task ID only has two parts. The task type should be
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TASK_TYPE_FILE_BROWSER_HANDLER.
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ParseTaskID("app-id|action-id", &task));
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id", task.app_id);
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(TASK_TYPE_FILE_BROWSER_HANDLER, task.task_type);
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("action-id", task.action_id);
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_LegacyDrive) {
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // A legacy task ID only has two parts. For Drive app, the app ID is
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // prefixed with "drive-app:".
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ParseTaskID("drive-app:app-id|action-id", &task));
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("app-id", task.app_id);
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(TASK_TYPE_DRIVE_APP, task.task_type);
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("action-id", task.action_id);
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_Invalid) {
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(ParseTaskID("invalid", &task));
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ParseTaskID_UnknownTaskType) {
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor task;
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(ParseTaskID("app-id|unknown|action-id", &task));
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, FindDriveAppTasks) {
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestingProfile profile;
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // For DriveAppRegistry, which checks CurrentlyOn(BrowserThread::UI).
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle;
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Foo.app can handle "text/plain" and "text/html"
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<google_apis::AppResource> foo_app(new google_apis::AppResource);
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  foo_app->set_product_id("foo_app_id");
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  foo_app->set_application_id("foo_app_id");
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  foo_app->set_name("Foo");
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  foo_app->set_object_type("foo_object_type");
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedVector<std::string> foo_mime_types;
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  foo_mime_types.push_back(new std::string("text/plain"));
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  foo_mime_types.push_back(new std::string("text/html"));
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  foo_app->set_primary_mimetypes(foo_mime_types.Pass());
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Bar.app can only handle "text/plain".
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<google_apis::AppResource> bar_app(new google_apis::AppResource);
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bar_app->set_product_id("bar_app_id");
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bar_app->set_application_id("bar_app_id");
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bar_app->set_name("Bar");
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bar_app->set_object_type("bar_object_type");
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedVector<std::string> bar_mime_types;
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bar_mime_types.push_back(new std::string("text/plain"));
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bar_app->set_primary_mimetypes(bar_mime_types.Pass());
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Prepare DriveAppRegistry from Foo.app and Bar.app.
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedVector<google_apis::AppResource> app_resources;
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  app_resources.push_back(foo_app.release());
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  app_resources.push_back(bar_app.release());
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  google_apis::AppList app_list;
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  app_list.set_items(app_resources.Pass());
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  drive::DriveAppRegistry drive_app_registry(NULL);
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  drive_app_registry.UpdateFromAppList(app_list);
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Find apps for a "text/plain" file. Foo.app and Bar.app should be found.
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PathAndMimeTypeSet path_mime_set;
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.insert(
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::make_pair(
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&profile).AppendASCII("foo.txt"),
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          "text/plain"));
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FindDriveAppTasks(drive_app_registry,
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    path_mime_set,
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    &tasks);
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2U, tasks.size());
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Sort the app IDs, as the order is not guaranteed.
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::string> app_ids;
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  app_ids.push_back(tasks[0].task_descriptor().app_id);
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  app_ids.push_back(tasks[1].task_descriptor().app_id);
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::sort(app_ids.begin(), app_ids.end());
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Confirm that both Foo.app and Bar.app are found.
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("bar_app_id", app_ids[0]);
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("foo_app_id", app_ids[1]);
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Find apps for "text/plain" and "text/html" files. Only Foo.app should be
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // found.
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.clear();
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.insert(
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::make_pair(
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&profile).AppendASCII("foo.txt"),
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          "text/plain"));
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.insert(
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::make_pair(
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&profile).AppendASCII("foo.html"),
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          "text/html"));
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tasks.clear();
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FindDriveAppTasks(drive_app_registry,
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    path_mime_set,
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    &tasks);
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1U, tasks.size());
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm that only Foo.app is found.
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("foo_app_id", tasks[0].task_descriptor().app_id);
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Add a "text/plain" file not on Drive. No tasks should be found.
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.insert(
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::make_pair(base::FilePath::FromUTF8Unsafe("not_on_drive.txt"),
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "text/plain"));
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tasks.clear();
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FindDriveAppTasks(drive_app_registry,
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    path_mime_set,
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    &tasks);
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Confirm no tasks are found.
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(tasks.empty());
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that the right task is chosen from multiple choices per mime types
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// and file extensions.
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ChooseAndSetDefaultTask_MultipleTasks) {
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestingPrefServiceSimple pref_service;
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RegisterDefaultTaskPreferences(&pref_service);
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Text.app and Nice.app were found for "foo.txt".
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor text_app_task("text-app-id",
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               TASK_TYPE_FILE_HANDLER,
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               "action-id");
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor nice_app_task("nice-app-id",
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               TASK_TYPE_FILE_HANDLER,
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               "action-id");
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tasks.push_back(FullTaskDescriptor(
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text_app_task,
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Text.app",
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GURL("http://example.com/text_app.png"),
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      false /* is_default */));
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tasks.push_back(FullTaskDescriptor(
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      nice_app_task,
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Nice.app",
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GURL("http://example.com/nice_app.png"),
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      false /* is_default */));
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PathAndMimeTypeSet path_mime_set;
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.insert(std::make_pair(
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("foo.txt"),
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "text/plain"));
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // None of them should be chosen as default, as nothing is set in the
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // preferences.
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChooseAndSetDefaultTask(pref_service, path_mime_set, &tasks);
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tasks[0].is_default());
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tasks[1].is_default());
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set Text.app as default for "text/plain" in the preferences.
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue empty;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue mime_types;
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  mime_types.SetStringWithoutPathExpansion(
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "text/plain",
29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TaskDescriptorToId(text_app_task));
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UpdateDefaultTaskPreferences(&pref_service, mime_types, empty);
29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Text.app should be chosen as default.
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChooseAndSetDefaultTask(pref_service, path_mime_set, &tasks);
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(tasks[0].is_default());
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tasks[1].is_default());
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Change it back to non-default for testing further.
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tasks[0].set_is_default(false);
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Clear the preferences and make sure none of them are default.
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UpdateDefaultTaskPreferences(&pref_service, empty, empty);
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChooseAndSetDefaultTask(pref_service, path_mime_set, &tasks);
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tasks[0].is_default());
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tasks[1].is_default());
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set Nice.app as default for ".txt" in the preferences.
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue suffixes;
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  suffixes.SetStringWithoutPathExpansion(
31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ".txt",
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TaskDescriptorToId(nice_app_task));
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UpdateDefaultTaskPreferences(&pref_service, empty, suffixes);
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Now Nice.app should be chosen as default.
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChooseAndSetDefaultTask(pref_service, path_mime_set, &tasks);
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(tasks[0].is_default());
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(tasks[1].is_default());
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that Files.app's internal file browser handler is chosen as default
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// even if nothing is set in the preferences.
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(FileManagerFileTasksTest, ChooseAndSetDefaultTask_FallbackFileBrowser) {
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestingPrefServiceSimple pref_service;
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RegisterDefaultTaskPreferences(&pref_service);
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Files.app's internal file browser handler was found for "foo.txt".
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TaskDescriptor files_app_task(kFileManagerAppId,
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                TASK_TYPE_FILE_BROWSER_HANDLER,
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                "view-in-browser");
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tasks.push_back(FullTaskDescriptor(
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      files_app_task,
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "View in browser",
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GURL("http://example.com/some_icon.png"),
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      false /* is_default */));
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PathAndMimeTypeSet path_mime_set;
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  path_mime_set.insert(std::make_pair(
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("foo.txt"),
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "text/plain"));
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The internal file browser handler should be chosen as default, as it's a
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // fallback file browser handler.
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ChooseAndSetDefaultTask(pref_service, path_mime_set, &tasks);
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(tasks[0].is_default());
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test using the test extension system, which needs lots of setup.
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class FileManagerFileTasksComplexTest : public testing::Test {
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FileManagerFileTasksComplexTest()
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : command_line_(CommandLine::NO_PROGRAM),
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        extension_service_(NULL) {
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    extensions::TestExtensionSystem* test_extension_system =
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        static_cast<extensions::TestExtensionSystem*>(
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            extensions::ExtensionSystem::Get(&test_profile_));
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    extension_service_ = test_extension_system->CreateExtensionService(
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        &command_line_,
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::FilePath()  /* install_directory */,
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        false  /* autoupdate_enabled*/);
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestingProfile test_profile_;
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CommandLine command_line_;
3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ExtensionService* extension_service_;  // Owned by test_profile_;
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The basic logic is similar to a test case for FindDriveAppTasks above.
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(FileManagerFileTasksComplexTest, FindFileHandlerTasks) {
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Random IDs generated by
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // % ruby -le 'print (0...32).to_a.map{(?a + rand(16)).chr}.join'
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kFooId[] = "hhgbjpmdppecanaaogonaigmmifgpaph";
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kBarId[] = "odlhccgofgkadkkhcmhgnhgahonahoca";
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char kEphemeralId[] = "opoomfdlbjcbjinalcjdjfoiikdeaoel";
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Foo.app can handle "text/plain" and "text/html".
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extensions::ExtensionBuilder foo_app;
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  foo_app.SetManifest(extensions::DictionaryBuilder()
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("name", "Foo")
3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("version", "1.0.0")
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("manifest_version", 2)
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("app",
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::DictionaryBuilder()
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Set("background",
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                extensions::DictionaryBuilder()
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("scripts",
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     extensions::ListBuilder()
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("background.js"))))
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("file_handlers",
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::DictionaryBuilder()
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Set("text",
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                extensions::DictionaryBuilder()
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("title", "Text")
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("types",
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     extensions::ListBuilder()
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("text/plain")
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("text/html")))));
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  foo_app.SetID(kFooId);
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_service_->AddExtension(foo_app.Build().get());
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Bar.app can only handle "text/plain".
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extensions::ExtensionBuilder bar_app;
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bar_app.SetManifest(extensions::DictionaryBuilder()
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("name", "Bar")
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("version", "1.0.0")
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("manifest_version", 2)
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("app",
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::DictionaryBuilder()
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Set("background",
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                extensions::DictionaryBuilder()
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("scripts",
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     extensions::ListBuilder()
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("background.js"))))
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("file_handlers",
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::DictionaryBuilder()
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Set("text",
4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                extensions::DictionaryBuilder()
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("title", "Text")
4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("types",
4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     extensions::ListBuilder()
4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("text/plain")))));
4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bar_app.SetID(kBarId);
4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_service_->AddExtension(bar_app.Build().get());
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Ephemeral.app is an ephemeral app that can handle "text/plain".
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // It should not ever be found as ephemeral apps cannot be file handlers.
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionBuilder ephemeral_app;
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ephemeral_app.SetManifest(
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::DictionaryBuilder()
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("name", "Ephemeral")
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("version", "1.0.0")
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("manifest_version", 2)
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("app",
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               extensions::DictionaryBuilder().Set(
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   "background",
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   extensions::DictionaryBuilder().Set(
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       "scripts",
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       extensions::ListBuilder().Append("background.js"))))
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("file_handlers",
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               extensions::DictionaryBuilder().Set(
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   "text",
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   extensions::DictionaryBuilder().Set("title", "Text").Set(
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       "types",
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       extensions::ListBuilder().Append("text/plain")))));
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ephemeral_app.SetID(kEphemeralId);
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> built_ephemeral_app(
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ephemeral_app.Build());
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extension_service_->AddExtension(built_ephemeral_app.get());
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionPrefs* extension_prefs =
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionPrefs::Get(&test_profile_);
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extension_prefs->OnExtensionInstalled(built_ephemeral_app.get(),
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        extensions::Extension::ENABLED,
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        syncer::StringOrdinal(),
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        extensions::kInstallFlagIsEphemeral,
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        std::string());
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Find apps for a "text/plain" file. Foo.app and Bar.app should be found.
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PathAndMimeTypeSet path_mime_set;
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  path_mime_set.insert(
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::make_pair(
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&test_profile_).AppendASCII(
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              "foo.txt"),
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          "text/plain"));
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindFileHandlerTasks(&test_profile_, path_mime_set, &tasks);
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(2U, tasks.size());
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Sort the app IDs, as the order is not guaranteed.
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> app_ids;
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[0].task_descriptor().app_id);
4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[1].task_descriptor().app_id);
4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::sort(app_ids.begin(), app_ids.end());
4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm that both Foo.app and Bar.app are found.
4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kFooId, app_ids[0]);
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kBarId, app_ids[1]);
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Find apps for "text/plain" and "text/html" files. Only Foo.app should be
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // found.
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  path_mime_set.clear();
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  path_mime_set.insert(
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::make_pair(
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&test_profile_).AppendASCII(
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              "foo.txt"),
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          "text/plain"));
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  path_mime_set.insert(
4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::make_pair(
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&test_profile_).AppendASCII(
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              "foo.html"),
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          "text/html"));
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tasks.clear();
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindFileHandlerTasks(&test_profile_, path_mime_set, &tasks);
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(1U, tasks.size());
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm that only Foo.app is found.
4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kFooId, tasks[0].task_descriptor().app_id);
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Add an "image/png" file. No tasks should be found.
5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  path_mime_set.insert(
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::make_pair(base::FilePath::FromUTF8Unsafe("foo.png"),
5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     "image/png"));
5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tasks.clear();
5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindFileHandlerTasks(&test_profile_, path_mime_set, &tasks);
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm no tasks are found.
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tasks.empty());
5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// The basic logic is similar to a test case for FindDriveAppTasks above.
5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(FileManagerFileTasksComplexTest, FindFileBrowserHandlerTasks) {
5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Copied from FindFileHandlerTasks test above.
5144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kFooId[] = "hhgbjpmdppecanaaogonaigmmifgpaph";
5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kBarId[] = "odlhccgofgkadkkhcmhgnhgahonahoca";
516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const char kEphemeralId[] = "opoomfdlbjcbjinalcjdjfoiikdeaoel";
5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Foo.app can handle ".txt" and ".html".
5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This one is an extension, and has "file_browser_handlers"
5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extensions::ExtensionBuilder foo_app;
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  foo_app.SetManifest(extensions::DictionaryBuilder()
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("name", "Foo")
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("version", "1.0.0")
5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("manifest_version", 2)
5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("file_browser_handlers",
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::ListBuilder()
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Append(extensions::DictionaryBuilder()
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("id", "open")
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("default_title", "open")
5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("file_filters",
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        extensions::ListBuilder()
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        .Append("filesystem:*.txt")
5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        .Append("filesystem:*.html")))));
5344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  foo_app.SetID(kFooId);
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_service_->AddExtension(foo_app.Build().get());
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Bar.app can only handle ".txt".
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extensions::ExtensionBuilder bar_app;
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bar_app.SetManifest(extensions::DictionaryBuilder()
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("name", "Bar")
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("version", "1.0.0")
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("manifest_version", 2)
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("file_browser_handlers",
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::ListBuilder()
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Append(extensions::DictionaryBuilder()
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("id", "open")
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("default_title", "open")
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("file_filters",
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        extensions::ListBuilder()
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        .Append("filesystem:*.txt")))));
5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bar_app.SetID(kBarId);
5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_service_->AddExtension(bar_app.Build().get());
5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Ephemeral.app is an ephemeral app that can handle ".txt".
555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // It should not ever be found as ephemeral apps cannot be file browser
556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // handlers.
557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionBuilder ephemeral_app;
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ephemeral_app.SetManifest(
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::DictionaryBuilder()
560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("name", "Ephemeral")
561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("version", "1.0.0")
562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("manifest_version", 2)
563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          .Set("file_browser_handlers",
564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               extensions::ListBuilder().Append(
565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   extensions::DictionaryBuilder()
566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       .Set("id", "open")
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       .Set("default_title", "open")
568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       .Set("file_filters",
569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            extensions::ListBuilder().Append(
570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                "filesystem:*.txt")))));
571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ephemeral_app.SetID(kEphemeralId);
572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> built_ephemeral_app(
573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ephemeral_app.Build());
574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extension_service_->AddExtension(built_ephemeral_app.get());
575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionPrefs* extension_prefs =
576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionPrefs::Get(&test_profile_);
577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extension_prefs->OnExtensionInstalled(built_ephemeral_app.get(),
578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        extensions::Extension::ENABLED,
579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        syncer::StringOrdinal(),
580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        extensions::kInstallFlagIsEphemeral,
581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        std::string());
582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Find apps for a ".txt" file. Foo.app and Bar.app should be found.
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<GURL> file_urls;
5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_urls.push_back(GURL("filesystem:chrome-extension://id/dir/foo.txt"));
5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindFileBrowserHandlerTasks(&test_profile_, file_urls, &tasks);
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(2U, tasks.size());
5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Sort the app IDs, as the order is not guaranteed.
5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> app_ids;
5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[0].task_descriptor().app_id);
5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[1].task_descriptor().app_id);
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::sort(app_ids.begin(), app_ids.end());
5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm that both Foo.app and Bar.app are found.
5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kFooId, app_ids[0]);
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kBarId, app_ids[1]);
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Find apps for ".txt" and ".html" files. Only Foo.app should be found.
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_urls.clear();
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_urls.push_back(GURL("filesystem:chrome-extension://id/dir/foo.txt"));
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_urls.push_back(GURL("filesystem:chrome-extension://id/dir/foo.html"));
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tasks.clear();
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindFileBrowserHandlerTasks(&test_profile_, file_urls, &tasks);
6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(1U, tasks.size());
6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm that only Foo.app is found.
6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kFooId, tasks[0].task_descriptor().app_id);
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Add an ".png" file. No tasks should be found.
6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_urls.push_back(GURL("filesystem:chrome-extension://id/dir/foo.png"));
6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  tasks.clear();
6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindFileBrowserHandlerTasks(&test_profile_, file_urls, &tasks);
6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm no tasks are found.
6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(tasks.empty());
6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test that all kinds of apps (file handler, file browser handler, and Drive
6184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// app) are returned.
6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(FileManagerFileTasksComplexTest, FindAllTypesOfTasks) {
6204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // kFooId and kBarId copied from FindFileHandlerTasks test above.
6214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kFooId[] = "hhgbjpmdppecanaaogonaigmmifgpaph";
6224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kBarId[] = "odlhccgofgkadkkhcmhgnhgahonahoca";
6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char kBazId[] = "plifkpkakemokpflgbnnigcoldgcbdmc";
6244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Foo.app can handle "text/plain".
6264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This is a packaged app (file handler).
6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extensions::ExtensionBuilder foo_app;
6284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  foo_app.SetManifest(extensions::DictionaryBuilder()
6294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("name", "Foo")
6304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("version", "1.0.0")
6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("manifest_version", 2)
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("app",
6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::DictionaryBuilder()
6344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Set("background",
6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                extensions::DictionaryBuilder()
6364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("scripts",
6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     extensions::ListBuilder()
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("background.js"))))
6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("file_handlers",
6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::DictionaryBuilder()
6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Set("text",
6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                extensions::DictionaryBuilder()
6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("title", "Text")
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                .Set("types",
6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     extensions::ListBuilder()
6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     .Append("text/plain")))));
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  foo_app.SetID(kFooId);
6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_service_->AddExtension(foo_app.Build().get());
6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Bar.app can only handle ".txt".
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This is an extension (file browser handler).
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extensions::ExtensionBuilder bar_app;
6534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bar_app.SetManifest(extensions::DictionaryBuilder()
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("name", "Bar")
6554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("version", "1.0.0")
6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("manifest_version", 2)
6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      .Set("file_browser_handlers",
6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           extensions::ListBuilder()
6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           .Append(extensions::DictionaryBuilder()
6604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("id", "open")
6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("default_title", "open")
6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   .Set("file_filters",
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        extensions::ListBuilder()
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                        .Append("filesystem:*.txt")))));
6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bar_app.SetID(kBarId);
6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  extension_service_->AddExtension(bar_app.Build().get());
6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Baz.app can handle "text/plain".
6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This is a Drive app.
6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<google_apis::AppResource> baz_app(new google_apis::AppResource);
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  baz_app->set_product_id("baz_app_id");
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  baz_app->set_application_id(kBazId);
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  baz_app->set_name("Baz");
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  baz_app->set_object_type("baz_object_type");
6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedVector<std::string> baz_mime_types;
6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  baz_mime_types.push_back(new std::string("text/plain"));
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  baz_app->set_primary_mimetypes(baz_mime_types.Pass());
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Set up DriveAppRegistry.
6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedVector<google_apis::AppResource> app_resources;
6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_resources.push_back(baz_app.release());
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  google_apis::AppList app_list;
6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_list.set_items(app_resources.Pass());
6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  drive::DriveAppRegistry drive_app_registry(NULL);
6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  drive_app_registry.UpdateFromAppList(app_list);
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Find apps for "foo.txt". All apps should be found.
6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PathAndMimeTypeSet path_mime_set;
6884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<GURL> file_urls;
6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  path_mime_set.insert(
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      std::make_pair(
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&test_profile_).AppendASCII(
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              "foo.txt"),
6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          "text/plain"));
6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  file_urls.push_back(GURL("filesystem:chrome-extension://id/dir/foo.txt"));
6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FindAllTypesOfTasks(&test_profile_,
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      &drive_app_registry,
6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      path_mime_set,
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      file_urls,
7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      &tasks);
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(3U, tasks.size());
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Sort the app IDs, as the order is not guaranteed.
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> app_ids;
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[0].task_descriptor().app_id);
7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[1].task_descriptor().app_id);
7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  app_ids.push_back(tasks[2].task_descriptor().app_id);
7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::sort(app_ids.begin(), app_ids.end());
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Confirm that all apps are found.
7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kFooId, app_ids[0]);
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kBarId, app_ids[1]);
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kBazId, app_ids[2]);
7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
7154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(FileManagerFileTasksComplexTest, FindAllTypesOfTasks_GoogleDocument) {
7178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // kFooId and kBarId copied from FindFileHandlerTasks test above.
7188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const char kFooId[] = "hhgbjpmdppecanaaogonaigmmifgpaph";
7198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const char kBarId[] = "odlhccgofgkadkkhcmhgnhgahonahoca";
7208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Foo.app can handle ".gdoc" files.
7228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<google_apis::AppResource> foo_app(new google_apis::AppResource);
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  foo_app->set_product_id("foo_app");
7248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  foo_app->set_application_id(kFooId);
7258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  foo_app->set_name("Foo");
7268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  foo_app->set_object_type("foo_object_type");
7278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ScopedVector<std::string> foo_extensions;
7288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  foo_extensions.push_back(new std::string("gdoc"));  // Not ".gdoc"
7298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  foo_app->set_primary_file_extensions(foo_extensions.Pass());
7308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Prepare DriveAppRegistry from Foo.app.
7328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ScopedVector<google_apis::AppResource> app_resources;
7338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  app_resources.push_back(foo_app.release());
7348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  google_apis::AppList app_list;
7358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  app_list.set_items(app_resources.Pass());
7368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  drive::DriveAppRegistry drive_app_registry(NULL);
7378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  drive_app_registry.UpdateFromAppList(app_list);
7388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Bar.app can handle ".gdoc" files.
7408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // This is an extension (file browser handler).
7418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extensions::ExtensionBuilder bar_app;
7428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bar_app.SetManifest(extensions::DictionaryBuilder()
7438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      .Set("name", "Bar")
7448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      .Set("version", "1.0.0")
7458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      .Set("manifest_version", 2)
7468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      .Set("file_browser_handlers",
7478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                           extensions::ListBuilder()
7488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                           .Append(extensions::DictionaryBuilder()
7498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   .Set("id", "open")
7508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   .Set("default_title", "open")
7518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                   .Set("file_filters",
7528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                        extensions::ListBuilder()
7538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                        .Append("filesystem:*.gdoc")))));
7548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bar_app.SetID(kBarId);
7558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extension_service_->AddExtension(bar_app.Build().get());
7568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Files.app can handle ".gdoc" files.
7588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // The ID "kFileManagerAppId" used here is precisely the one that identifies
7598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // the Chrome OS Files.app application.
7608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extensions::ExtensionBuilder files_app;
7618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  files_app.SetManifest(extensions::DictionaryBuilder()
7628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       .Set("name", "Files")
7638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       .Set("version", "1.0.0")
7648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       .Set("manifest_version", 2)
7658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       .Set("file_browser_handlers",
7668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                            extensions::ListBuilder()
7678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                            .Append(extensions::DictionaryBuilder()
7688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                    .Set("id", "open")
7698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                    .Set("default_title", "open")
7708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                    .Set("file_filters",
7718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                         extensions::ListBuilder()
7728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                         .Append("filesystem:*.gdoc")))));
7738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  files_app.SetID(kFileManagerAppId);
7748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extension_service_->AddExtension(files_app.Build().get());
7758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Find apps for a ".gdoc file". Only the built-in handler of Files.apps
7778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // should be found.
7788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  PathAndMimeTypeSet path_mime_set;
7798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::vector<GURL> file_urls;
7808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  path_mime_set.insert(
7818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::make_pair(
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          drive::util::GetDriveMountPointPath(&test_profile_).AppendASCII(
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              "foo.gdoc"),
7848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          "application/vnd.google-apps.document"));
7858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  file_urls.push_back(GURL("filesystem:chrome-extension://id/dir/foo.gdoc"));
7868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::vector<FullTaskDescriptor> tasks;
7888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FindAllTypesOfTasks(&test_profile_,
7898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      &drive_app_registry,
7908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      path_mime_set,
7918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      file_urls,
7928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                      &tasks);
7938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(1U, tasks.size());
7948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kFileManagerAppId, tasks[0].task_descriptor().app_id);
7958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
7968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
79758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace file_tasks
79858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace file_manager.
799