OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/file_manager/file_tasks.h" | 5 #include "chrome/browser/chromeos/file_manager/file_tasks.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 | 10 |
11 #include "apps/launcher.h" | 11 #include "apps/launcher.h" |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
16 #include "chrome/browser/chromeos/drive/file_system_util.h" | 16 #include "chrome/browser/chromeos/drive/file_system_util.h" |
17 #include "chrome/browser/chromeos/drive/file_task_executor.h" | 17 #include "chrome/browser/chromeos/drive/file_task_executor.h" |
18 #include "chrome/browser/chromeos/file_manager/app_id.h" | 18 #include "chrome/browser/chromeos/file_manager/app_id.h" |
19 #include "chrome/browser/chromeos/file_manager/file_browser_handlers.h" | 19 #include "chrome/browser/chromeos/file_manager/file_browser_handlers.h" |
20 #include "chrome/browser/chromeos/file_manager/fileapi_util.h" | 20 #include "chrome/browser/chromeos/file_manager/fileapi_util.h" |
21 #include "chrome/browser/chromeos/file_manager/open_util.h" | 21 #include "chrome/browser/chromeos/file_manager/open_util.h" |
| 22 #include "chrome/browser/extensions/api/file_handlers/mime_util.h" |
22 #include "chrome/browser/extensions/extension_tab_util.h" | 23 #include "chrome/browser/extensions/extension_tab_util.h" |
23 #include "chrome/browser/extensions/extension_util.h" | 24 #include "chrome/browser/extensions/extension_util.h" |
24 #include "chrome/browser/profiles/profile.h" | 25 #include "chrome/browser/profiles/profile.h" |
25 #include "chrome/browser/ui/extensions/application_launch.h" | 26 #include "chrome/browser/ui/extensions/application_launch.h" |
26 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" | 27 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" |
27 #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handle
r.h" | 28 #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handle
r.h" |
28 #include "chrome/common/extensions/api/file_manager_private.h" | 29 #include "chrome/common/extensions/api/file_manager_private.h" |
29 #include "chrome/common/extensions/extension_constants.h" | 30 #include "chrome/common/extensions/extension_constants.h" |
30 #include "chrome/common/pref_names.h" | 31 #include "chrome/common/pref_names.h" |
31 #include "chromeos/chromeos_switches.h" | 32 #include "chromeos/chromeos_switches.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 extension_misc::kQuickOfficeExtensionId, | 134 extension_misc::kQuickOfficeExtensionId, |
134 }; | 135 }; |
135 | 136 |
136 for (size_t i = 0; i < arraysize(kBuiltInApps); ++i) { | 137 for (size_t i = 0; i < arraysize(kBuiltInApps); ++i) { |
137 if (task.app_id == kBuiltInApps[i]) | 138 if (task.app_id == kBuiltInApps[i]) |
138 return true; | 139 return true; |
139 } | 140 } |
140 return false; | 141 return false; |
141 } | 142 } |
142 | 143 |
| 144 void FindArcTasks(Profile* profile, |
| 145 const std::vector<extensions::EntryInfo>& entries, |
| 146 std::unique_ptr<std::vector<FullTaskDescriptor>> result_list, |
| 147 const FindTasksCallback& callback) { |
| 148 // TODO(kinaba): implement. |
| 149 callback.Run(std::move(result_list)); |
| 150 } |
| 151 |
| 152 void ExecuteByArcAfterMimeTypesCollected( |
| 153 Profile* profile, |
| 154 const TaskDescriptor& task, |
| 155 const std::vector<FileSystemURL>& file_urls, |
| 156 const FileTaskFinishedCallback& done, |
| 157 extensions::app_file_handler_util::MimeTypeCollector* mime_collector, |
| 158 std::unique_ptr<std::vector<std::string>> mime_types) { |
| 159 // TODO(kinaba): implement. |
| 160 NOTIMPLEMENTED(); |
| 161 done.Run(extensions::api::file_manager_private::TASK_RESULT_FAILED); |
| 162 } |
| 163 |
| 164 void PostProcessFoundTasks( |
| 165 Profile* profile, |
| 166 const std::vector<extensions::EntryInfo>& entries, |
| 167 const FindTasksCallback& callback, |
| 168 std::unique_ptr<std::vector<FullTaskDescriptor>> result_list) { |
| 169 // Google documents can only be handled by internal handlers. |
| 170 if (ContainsGoogleDocument(entries)) |
| 171 KeepOnlyFileManagerInternalTasks(result_list.get()); |
| 172 ChooseAndSetDefaultTask(*profile->GetPrefs(), entries, result_list.get()); |
| 173 callback.Run(std::move(result_list)); |
| 174 } |
| 175 |
143 } // namespace | 176 } // namespace |
144 | 177 |
145 FullTaskDescriptor::FullTaskDescriptor( | 178 FullTaskDescriptor::FullTaskDescriptor( |
146 const TaskDescriptor& task_descriptor, | 179 const TaskDescriptor& task_descriptor, |
147 const std::string& task_title, | 180 const std::string& task_title, |
148 const GURL& icon_url, | 181 const GURL& icon_url, |
149 bool is_default, | 182 bool is_default, |
150 bool is_generic_file_handler) | 183 bool is_generic_file_handler) |
151 : task_descriptor_(task_descriptor), | 184 : task_descriptor_(task_descriptor), |
152 task_title_(task_title), | 185 task_title_(task_title), |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 task->action_id = result[2]; | 301 task->action_id = result[2]; |
269 | 302 |
270 return true; | 303 return true; |
271 } | 304 } |
272 | 305 |
273 bool ExecuteFileTask(Profile* profile, | 306 bool ExecuteFileTask(Profile* profile, |
274 const GURL& source_url, | 307 const GURL& source_url, |
275 const TaskDescriptor& task, | 308 const TaskDescriptor& task, |
276 const std::vector<FileSystemURL>& file_urls, | 309 const std::vector<FileSystemURL>& file_urls, |
277 const FileTaskFinishedCallback& done) { | 310 const FileTaskFinishedCallback& done) { |
| 311 // ARC apps needs mime types for launching. Retrieve them first. |
278 if (task.task_type == TASK_TYPE_ARC_APP) { | 312 if (task.task_type == TASK_TYPE_ARC_APP) { |
279 NOTIMPLEMENTED(); | 313 extensions::app_file_handler_util::MimeTypeCollector* mime_collector = |
280 return false; | 314 new extensions::app_file_handler_util::MimeTypeCollector(profile); |
| 315 mime_collector->CollectForURLs( |
| 316 file_urls, |
| 317 base::Bind(&ExecuteByArcAfterMimeTypesCollected, profile, task, |
| 318 file_urls, done, base::Owned(mime_collector))); |
| 319 return true; |
281 } | 320 } |
282 | 321 |
283 // drive::FileTaskExecutor is responsible to handle drive tasks. | 322 // drive::FileTaskExecutor is responsible to handle drive tasks. |
284 if (task.task_type == TASK_TYPE_DRIVE_APP) { | 323 if (task.task_type == TASK_TYPE_DRIVE_APP) { |
285 DCHECK_EQ(kDriveAppActionID, task.action_id); | 324 DCHECK_EQ(kDriveAppActionID, task.action_id); |
286 drive::FileTaskExecutor* executor = | 325 drive::FileTaskExecutor* executor = |
287 new drive::FileTaskExecutor(profile, task.app_id); | 326 new drive::FileTaskExecutor(profile, task.app_id); |
288 executor->Execute(file_urls, done); | 327 executor->Execute(file_urls, done); |
289 return true; | 328 return true; |
290 } | 329 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 false /* is_generic_file_handler */)); | 557 false /* is_generic_file_handler */)); |
519 } | 558 } |
520 } | 559 } |
521 | 560 |
522 void FindAllTypesOfTasks(Profile* profile, | 561 void FindAllTypesOfTasks(Profile* profile, |
523 const drive::DriveAppRegistry* drive_app_registry, | 562 const drive::DriveAppRegistry* drive_app_registry, |
524 const std::vector<extensions::EntryInfo>& entries, | 563 const std::vector<extensions::EntryInfo>& entries, |
525 const std::vector<GURL>& file_urls, | 564 const std::vector<GURL>& file_urls, |
526 const FindTasksCallback& callback) { | 565 const FindTasksCallback& callback) { |
527 DCHECK(profile); | 566 DCHECK(profile); |
528 std::vector<FullTaskDescriptor> result_list; | 567 std::unique_ptr<std::vector<FullTaskDescriptor>> result_list( |
| 568 new std::vector<FullTaskDescriptor>); |
529 | 569 |
530 // Find Drive app tasks, if the drive app registry is present. | 570 // Find Drive app tasks, if the drive app registry is present. |
531 if (drive_app_registry) | 571 if (drive_app_registry) |
532 FindDriveAppTasks(*drive_app_registry, entries, &result_list); | 572 FindDriveAppTasks(*drive_app_registry, entries, result_list.get()); |
533 | 573 |
534 // Find and append file handler tasks. We know there aren't duplicates | 574 // Find and append file handler tasks. We know there aren't duplicates |
535 // because Drive apps and platform apps are entirely different kinds of | 575 // because Drive apps and platform apps are entirely different kinds of |
536 // tasks. | 576 // tasks. |
537 FindFileHandlerTasks(profile, entries, &result_list); | 577 FindFileHandlerTasks(profile, entries, result_list.get()); |
538 | 578 |
539 // Find and append file browser handler tasks. We know there aren't | 579 // Find and append file browser handler tasks. We know there aren't |
540 // duplicates because "file_browser_handlers" and "file_handlers" shouldn't | 580 // duplicates because "file_browser_handlers" and "file_handlers" shouldn't |
541 // be used in the same manifest.json. | 581 // be used in the same manifest.json. |
542 FindFileBrowserHandlerTasks(profile, file_urls, &result_list); | 582 FindFileBrowserHandlerTasks(profile, file_urls, result_list.get()); |
543 | 583 |
544 // Google documents can only be handled by internal handlers. | 584 // Find and append ARC handler tasks. |
545 if (ContainsGoogleDocument(entries)) | 585 FindArcTasks(profile, entries, std::move(result_list), |
546 KeepOnlyFileManagerInternalTasks(&result_list); | 586 base::Bind(&PostProcessFoundTasks, profile, entries, callback)); |
547 | |
548 ChooseAndSetDefaultTask(*profile->GetPrefs(), entries, &result_list); | |
549 | |
550 callback.Run(result_list); | |
551 } | 587 } |
552 | 588 |
553 void ChooseAndSetDefaultTask(const PrefService& pref_service, | 589 void ChooseAndSetDefaultTask(const PrefService& pref_service, |
554 const std::vector<extensions::EntryInfo>& entries, | 590 const std::vector<extensions::EntryInfo>& entries, |
555 std::vector<FullTaskDescriptor>* tasks) { | 591 std::vector<FullTaskDescriptor>* tasks) { |
556 // Collect the task IDs of default tasks from the preferences into a set. | 592 // Collect the task IDs of default tasks from the preferences into a set. |
557 std::set<std::string> default_task_ids; | 593 std::set<std::string> default_task_ids; |
558 for (std::vector<extensions::EntryInfo>::const_iterator it = entries.begin(); | 594 for (std::vector<extensions::EntryInfo>::const_iterator it = entries.begin(); |
559 it != entries.end(); ++it) { | 595 it != entries.end(); ++it) { |
560 const base::FilePath& file_path = it->path; | 596 const base::FilePath& file_path = it->path; |
(...skipping 22 matching lines...) Expand all Loading... |
583 DCHECK(!task->is_default()); | 619 DCHECK(!task->is_default()); |
584 if (IsFallbackFileHandler(task->task_descriptor())) { | 620 if (IsFallbackFileHandler(task->task_descriptor())) { |
585 task->set_is_default(true); | 621 task->set_is_default(true); |
586 return; | 622 return; |
587 } | 623 } |
588 } | 624 } |
589 } | 625 } |
590 | 626 |
591 } // namespace file_tasks | 627 } // namespace file_tasks |
592 } // namespace file_manager | 628 } // namespace file_manager |
OLD | NEW |