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 #include "chrome/browser/chromeos/extensions/file_manager_util.h" | 4 #include "chrome/browser/chromeos/extensions/file_manager_util.h" |
5 | 5 |
6 #include "ash/shell.h" | 6 #include "ash/shell.h" |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" |
8 #include "base/file_util.h" | 9 #include "base/file_util.h" |
9 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
10 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
11 #include "base/logging.h" | 12 #include "base/logging.h" |
12 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
13 #include "base/path_service.h" | 14 #include "base/path_service.h" |
14 #include "base/string_util.h" | 15 #include "base/string_util.h" |
15 #include "base/utf_string_conversions.h" | 16 #include "base/utf_string_conversions.h" |
16 #include "base/values.h" | 17 #include "base/values.h" |
17 #include "chrome/browser/chromeos/drive/drive.pb.h" | 18 #include "chrome/browser/chromeos/drive/drive.pb.h" |
(...skipping 13 matching lines...) Expand all Loading... |
31 #include "chrome/browser/ui/browser_finder.h" | 32 #include "chrome/browser/ui/browser_finder.h" |
32 #include "chrome/browser/ui/browser_list.h" | 33 #include "chrome/browser/ui/browser_list.h" |
33 #include "chrome/browser/ui/browser_tabstrip.h" | 34 #include "chrome/browser/ui/browser_tabstrip.h" |
34 #include "chrome/browser/ui/browser_window.h" | 35 #include "chrome/browser/ui/browser_window.h" |
35 #include "chrome/browser/ui/extensions/application_launch.h" | 36 #include "chrome/browser/ui/extensions/application_launch.h" |
36 #include "chrome/browser/ui/host_desktop.h" | 37 #include "chrome/browser/ui/host_desktop.h" |
37 #include "chrome/browser/ui/simple_message_box.h" | 38 #include "chrome/browser/ui/simple_message_box.h" |
38 #include "chrome/browser/ui/tab_contents/tab_contents.h" | 39 #include "chrome/browser/ui/tab_contents/tab_contents.h" |
39 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 40 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
40 #include "chrome/common/chrome_paths.h" | 41 #include "chrome/common/chrome_paths.h" |
| 42 #include "chrome/common/chrome_switches.h" |
41 #include "chrome/common/extensions/file_browser_handler.h" | 43 #include "chrome/common/extensions/file_browser_handler.h" |
42 #include "chrome/common/url_constants.h" | 44 #include "chrome/common/url_constants.h" |
43 #include "content/public/browser/browser_thread.h" | 45 #include "content/public/browser/browser_thread.h" |
44 #include "content/public/browser/plugin_service.h" | 46 #include "content/public/browser/plugin_service.h" |
45 #include "content/public/browser/storage_partition.h" | 47 #include "content/public/browser/storage_partition.h" |
46 #include "content/public/browser/user_metrics.h" | 48 #include "content/public/browser/user_metrics.h" |
47 #include "content/public/browser/web_contents.h" | 49 #include "content/public/browser/web_contents.h" |
48 #include "content/public/common/pepper_plugin_info.h" | 50 #include "content/public/common/pepper_plugin_info.h" |
49 #include "grit/generated_resources.h" | 51 #include "grit/generated_resources.h" |
50 #include "net/base/escape.h" | 52 #include "net/base/escape.h" |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 } | 442 } |
441 return true; | 443 return true; |
442 } | 444 } |
443 } | 445 } |
444 } | 446 } |
445 } | 447 } |
446 | 448 |
447 return false; | 449 return false; |
448 } | 450 } |
449 | 451 |
| 452 bool IsFileManagerPackaged() { |
| 453 const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 454 return command_line->HasSwitch(switches::kFileManagerPackaged); |
| 455 } |
| 456 |
| 457 void ExecuteHandler(Profile* profile, |
| 458 std::string extension_id, |
| 459 std::string action_id, |
| 460 const GURL& url) { |
| 461 // We are executing the task on behalf of File Browser extension. |
| 462 const GURL source_url(kBaseFileBrowserUrl); |
| 463 |
| 464 // If File Browser has not been open yet then it did not request access |
| 465 // to the file system. Do it now. |
| 466 fileapi::ExternalFileSystemMountPointProvider* external_provider = |
| 467 BrowserContext::GetDefaultStoragePartition( |
| 468 profile)->GetFileSystemContext()->external_provider(); |
| 469 if (!external_provider) |
| 470 return; |
| 471 external_provider->GrantFullAccessToExtension(source_url.host()); |
| 472 |
| 473 std::vector<GURL> urls; |
| 474 urls.push_back(url); |
| 475 scoped_refptr<FileTaskExecutor> executor = FileTaskExecutor::Create(profile, |
| 476 source_url, 0 /* no tab id */, extension_id, |
| 477 file_handler_util::kTaskFile, action_id); |
| 478 executor->Execute(urls); |
| 479 } |
| 480 |
450 void OpenFileBrowser(const FilePath& path, | 481 void OpenFileBrowser(const FilePath& path, |
451 TAB_REUSE_MODE mode, | 482 TAB_REUSE_MODE mode, |
452 const std::string& flag_name) { | 483 const std::string& action_id) { |
| 484 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); |
| 485 |
453 if (FileManageTabExists(path, mode)) | 486 if (FileManageTabExists(path, mode)) |
454 return; | 487 return; |
455 | 488 |
456 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); | 489 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); |
457 | 490 |
| 491 if (IsFileManagerPackaged() && !path.value().empty()) { |
| 492 GURL url; |
| 493 if (!ConvertFileToFileSystemUrl(profile, path, |
| 494 GetFileBrowserExtensionUrl().GetOrigin(), &url)) |
| 495 return; |
| 496 |
| 497 // Some values of |action_id| are not listed in the manifest and are used |
| 498 // to parametrize the behavior when opening the Files app window. |
| 499 ExecuteHandler(profile, kFileBrowserDomain, action_id, url); |
| 500 return; |
| 501 } |
| 502 |
458 std::string url = chrome::kChromeUIFileManagerURL; | 503 std::string url = chrome::kChromeUIFileManagerURL; |
459 if (flag_name.size()) { | 504 if (action_id.size()) { |
460 DictionaryValue arg_value; | 505 DictionaryValue arg_value; |
461 arg_value.SetBoolean(flag_name, "true"); | 506 arg_value.SetString("action", action_id); |
462 std::string query; | 507 std::string query; |
463 base::JSONWriter::Write(&arg_value, &query); | 508 base::JSONWriter::Write(&arg_value, &query); |
464 url += "?" + net::EscapeUrlEncodedData(query, false); | 509 url += "?" + net::EscapeUrlEncodedData(query, false); |
465 } | 510 } |
466 if (!path.empty()) { | 511 if (!path.empty()) { |
467 FilePath virtual_path; | 512 FilePath virtual_path; |
468 if (!ConvertFileToRelativeFileSystemPath(profile, path, &virtual_path)) | 513 if (!ConvertFileToRelativeFileSystemPath(profile, path, &virtual_path)) |
469 return; | 514 return; |
470 url += "#/" + net::EscapeUrlEncodedData(virtual_path.value(), false); | 515 url += "#/" + net::EscapeUrlEncodedData(virtual_path.value(), false); |
471 } | 516 } |
472 | 517 |
473 ExtensionService* service = profile->GetExtensionService(); | 518 ExtensionService* service = profile->GetExtensionService(); |
474 if (!service) | 519 if (!service) |
475 return; | 520 return; |
476 | 521 |
477 const extensions::Extension* extension = | 522 const extensions::Extension* extension = |
478 service->GetExtensionById(kFileBrowserDomain, false); | 523 service->GetExtensionById(kFileBrowserDomain, false); |
479 if (!extension) | 524 if (!extension) |
480 return; | 525 return; |
481 | 526 |
482 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); | |
483 application_launch::LaunchParams params(profile, extension, | 527 application_launch::LaunchParams params(profile, extension, |
484 extension_misc::LAUNCH_WINDOW, | 528 extension_misc::LAUNCH_WINDOW, |
485 NEW_FOREGROUND_TAB); | 529 NEW_FOREGROUND_TAB); |
486 params.override_url = GURL(url); | 530 params.override_url = GURL(url); |
487 application_launch::OpenApplication(params); | 531 application_launch::OpenApplication(params); |
488 } | 532 } |
489 | 533 |
490 Browser* GetBrowserForUrl(GURL target_url) { | 534 Browser* GetBrowserForUrl(GURL target_url) { |
491 for (BrowserList::const_iterator browser_iterator = BrowserList::begin(); | 535 for (BrowserList::const_iterator browser_iterator = BrowserList::begin(); |
492 browser_iterator != BrowserList::end(); ++browser_iterator) { | 536 browser_iterator != BrowserList::end(); ++browser_iterator) { |
493 Browser* browser = *browser_iterator; | 537 Browser* browser = *browser_iterator; |
494 TabStripModel* tab_strip = browser->tab_strip_model(); | 538 TabStripModel* tab_strip = browser->tab_strip_model(); |
495 for (int idx = 0; idx < tab_strip->count(); idx++) { | 539 for (int idx = 0; idx < tab_strip->count(); idx++) { |
496 content::WebContents* web_contents = | 540 content::WebContents* web_contents = |
497 tab_strip->GetTabContentsAt(idx)->web_contents(); | 541 tab_strip->GetTabContentsAt(idx)->web_contents(); |
498 const GURL& url = web_contents->GetURL(); | 542 const GURL& url = web_contents->GetURL(); |
499 if (url == target_url) | 543 if (url == target_url) |
500 return browser; | 544 return browser; |
501 } | 545 } |
502 } | 546 } |
503 return NULL; | 547 return NULL; |
504 } | 548 } |
505 | 549 |
506 void ViewRemovableDrive(const FilePath& path) { | 550 void ViewRemovableDrive(const FilePath& path) { |
507 OpenFileBrowser(path, REUSE_ANY_FILE_MANAGER, "mountTriggered"); | 551 OpenFileBrowser(path, REUSE_ANY_FILE_MANAGER, "auto-open"); |
508 } | 552 } |
509 | 553 |
510 void OpenActionChoiceDialog(const FilePath& path) { | 554 void OpenActionChoiceDialog(const FilePath& path) { |
511 const int kDialogWidth = 394; | 555 const int kDialogWidth = 394; |
512 // TODO(dgozman): remove 50, which is a title height once popup window | 556 // TODO(dgozman): remove 50, which is a title height once popup window |
513 // will have no title. | 557 // will have no title. |
514 const int kDialogHeight = 316 + 50; | 558 const int kDialogHeight = 316 + 50; |
515 | 559 |
516 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); | 560 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); |
517 | 561 |
(...skipping 20 matching lines...) Expand all Loading... |
538 profile)); | 582 profile)); |
539 | 583 |
540 chrome::AddSelectedTabWithURL(browser, dialog_url, | 584 chrome::AddSelectedTabWithURL(browser, dialog_url, |
541 content::PAGE_TRANSITION_LINK); | 585 content::PAGE_TRANSITION_LINK); |
542 } | 586 } |
543 browser->window()->Show(); | 587 browser->window()->Show(); |
544 } | 588 } |
545 | 589 |
546 void ShowFileInFolder(const FilePath& path) { | 590 void ShowFileInFolder(const FilePath& path) { |
547 // This action changes the selection so we do not reuse existing tabs. | 591 // This action changes the selection so we do not reuse existing tabs. |
548 OpenFileBrowser(path, REUSE_NEVER, "selectOnly"); | 592 OpenFileBrowser(path, REUSE_NEVER, "select"); |
549 } | 593 } |
550 | 594 |
551 void ViewFolder(const FilePath& path) { | 595 void ViewFolder(const FilePath& path) { |
552 OpenFileBrowser(path, REUSE_SAME_PATH, std::string()); | 596 OpenFileBrowser(path, REUSE_SAME_PATH, "open"); |
553 } | 597 } |
554 | 598 |
555 void OpenApplication() { | 599 void OpenApplication() { |
556 OpenFileBrowser(FilePath(), REUSE_NEVER, std::string()); | 600 OpenFileBrowser(FilePath(), REUSE_NEVER, ""); |
557 } | 601 } |
558 | 602 |
559 bool ExecuteDefaultHandler(Profile* profile, const FilePath& path) { | 603 bool ExecuteDefaultHandler(Profile* profile, const FilePath& path) { |
560 GURL url; | 604 GURL url; |
561 if (!ConvertFileToFileSystemUrl(profile, path, | 605 if (!ConvertFileToFileSystemUrl(profile, path, |
562 GetFileBrowserExtensionUrl().GetOrigin(), &url)) | 606 GetFileBrowserExtensionUrl().GetOrigin(), &url)) |
563 return false; | 607 return false; |
564 | 608 |
565 const FileBrowserHandler* handler; | 609 const FileBrowserHandler* handler; |
566 if (!file_handler_util::GetTaskForURL(profile, url, &handler)) | 610 if (!file_handler_util::GetTaskForURL(profile, url, &handler)) |
567 return false; | 611 return false; |
568 | 612 |
569 std::string extension_id = handler->extension_id(); | 613 std::string extension_id = handler->extension_id(); |
570 std::string action_id = handler->id(); | 614 std::string action_id = handler->id(); |
571 Browser* browser = browser::FindLastActiveWithProfile(profile); | 615 Browser* browser = browser::FindLastActiveWithProfile(profile); |
572 | 616 |
573 // If there is no browsers for the profile, bail out. Return true so warning | 617 // If there is no browsers for the profile, bail out. Return true so warning |
574 // about file type not being supported is not displayed. | 618 // about file type not being supported is not displayed. |
575 if (!browser) | 619 if (!browser) |
576 return true; | 620 return true; |
577 | 621 |
578 if (extension_id == kFileBrowserDomain) { | 622 if (extension_id == kFileBrowserDomain) { |
| 623 if (IsFileManagerPackaged()) { |
| 624 if (action_id == kFileBrowserGalleryTaskId || |
| 625 action_id == kFileBrowserMountArchiveTaskId || |
| 626 action_id == kFileBrowserPlayTaskId || |
| 627 action_id == kFileBrowserWatchTaskId) { |
| 628 ExecuteHandler(profile, extension_id, action_id, url); |
| 629 return true; |
| 630 } |
| 631 return ExecuteBuiltinHandler(browser, path, action_id); |
| 632 } |
| 633 |
579 // Only two of the built-in File Browser tasks require opening the File | 634 // Only two of the built-in File Browser tasks require opening the File |
580 // Browser tab. | 635 // Browser tab. |
581 if (action_id == kFileBrowserGalleryTaskId || | 636 if (action_id == kFileBrowserGalleryTaskId || |
582 action_id == kFileBrowserMountArchiveTaskId) { | 637 action_id == kFileBrowserMountArchiveTaskId) { |
583 // Tab reuse currently does not work for these two tasks. | 638 // Tab reuse currently does not work for these two tasks. |
584 // |gallery| tries to put the file url into the tab url but it does not | 639 // |gallery| tries to put the file url into the tab url but it does not |
585 // work on Chrome OS. | 640 // work on Chrome OS. |
586 // |mount-archive| does not even try. | 641 // |mount-archive| does not even try. |
587 OpenFileBrowser(path, REUSE_SAME_PATH, ""); | 642 OpenFileBrowser(path, REUSE_SAME_PATH, ""); |
588 return true; | 643 return true; |
589 } else { | |
590 return ExecuteBuiltinHandler(browser, path, action_id); | |
591 } | 644 } |
592 } else { | 645 return ExecuteBuiltinHandler(browser, path, action_id); |
593 // We are executing the task on behalf of File Browser extension. | 646 } |
594 const GURL source_url(kBaseFileBrowserUrl); | |
595 | 647 |
596 // If File Browser has not been open yet then it did not request access | 648 ExecuteHandler(profile, extension_id, action_id, url); |
597 // to the file system. Do it now. | 649 return true; |
598 fileapi::ExternalFileSystemMountPointProvider* external_provider = | |
599 BrowserContext::GetDefaultStoragePartition( | |
600 profile)->GetFileSystemContext()->external_provider(); | |
601 if (!external_provider) | |
602 return false; | |
603 external_provider->GrantFullAccessToExtension(source_url.host()); | |
604 | |
605 std::vector<GURL> urls; | |
606 urls.push_back(url); | |
607 scoped_refptr<FileTaskExecutor> executor = FileTaskExecutor::Create(profile, | |
608 source_url, 0 /* no tab id */, extension_id, | |
609 file_handler_util::kTaskFile, action_id); | |
610 executor->Execute(urls); | |
611 return true; | |
612 } | |
613 return ExecuteBuiltinHandler(browser, path, std::string()); | |
614 } | 650 } |
615 | 651 |
616 void ViewFile(const FilePath& path) { | 652 void ViewFile(const FilePath& path) { |
617 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); | 653 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); |
618 if (!ExecuteDefaultHandler(profile, path)) | 654 if (!ExecuteDefaultHandler(profile, path)) |
619 ShowWarningMessageBox(profile, path); | 655 ShowWarningMessageBox(profile, path); |
620 } | 656 } |
621 | 657 |
622 // Reads an entire file into a string. Fails is the file is 4K or longer. | 658 // Reads an entire file into a string. Fails is the file is 4K or longer. |
623 bool ReadSmallFileToString(const FilePath& path, std::string* contents) { | 659 bool ReadSmallFileToString(const FilePath& path, std::string* contents) { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 drive::HOSTED_DOCUMENT)); | 742 drive::HOSTED_DOCUMENT)); |
707 } else { | 743 } else { |
708 // The file is local (downloaded from an attachment or otherwise copied). | 744 // The file is local (downloaded from an attachment or otherwise copied). |
709 // Parse the file to extract the Docs url and open this url. | 745 // Parse the file to extract the Docs url and open this url. |
710 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 746 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
711 base::Bind(&ReadUrlFromGDocOnFileThread, path)); | 747 base::Bind(&ReadUrlFromGDocOnFileThread, path)); |
712 } | 748 } |
713 return true; | 749 return true; |
714 } | 750 } |
715 | 751 |
716 if (internal_task_id == kFileBrowserPlayTaskId) { | 752 if (!IsFileManagerPackaged()) { |
717 GURL url; | 753 if (internal_task_id == kFileBrowserPlayTaskId) { |
718 if (!ConvertFileToFileSystemUrl(profile, path, | 754 GURL url; |
719 GetFileBrowserExtensionUrl().GetOrigin(), &url)) | 755 if (!ConvertFileToFileSystemUrl(profile, path, |
720 return false; | 756 GetFileBrowserExtensionUrl().GetOrigin(), &url)) |
721 MediaPlayer* mediaplayer = MediaPlayer::GetInstance(); | 757 return false; |
722 mediaplayer->PopupMediaPlayer(); | 758 MediaPlayer* mediaplayer = MediaPlayer::GetInstance(); |
723 mediaplayer->ForcePlayMediaURL(url); | 759 mediaplayer->PopupMediaPlayer(); |
724 return true; | 760 mediaplayer->ForcePlayMediaURL(url); |
725 } | 761 return true; |
726 if (internal_task_id == kFileBrowserWatchTaskId) { | 762 } |
727 GURL url; | 763 if (internal_task_id == kFileBrowserWatchTaskId) { |
728 if (!ConvertFileToFileSystemUrl(profile, path, | 764 GURL url; |
729 GetFileBrowserExtensionUrl().GetOrigin(), &url)) | 765 if (!ConvertFileToFileSystemUrl(profile, path, |
730 return false; | 766 GetFileBrowserExtensionUrl().GetOrigin(), &url)) |
| 767 return false; |
731 | 768 |
732 ExtensionService* service = profile->GetExtensionService(); | 769 ExtensionService* service = profile->GetExtensionService(); |
733 if (!service) | 770 if (!service) |
734 return false; | 771 return false; |
735 | 772 |
736 const extensions::Extension* extension = | 773 const extensions::Extension* extension = |
737 service->GetExtensionById(kFileBrowserDomain, false); | 774 service->GetExtensionById(kFileBrowserDomain, false); |
738 if (!extension) | 775 if (!extension) |
739 return false; | 776 return false; |
740 | 777 |
741 application_launch::LaunchParams params(profile, extension, | 778 application_launch::LaunchParams params(profile, extension, |
742 extension_misc::LAUNCH_WINDOW, | 779 extension_misc::LAUNCH_WINDOW, |
743 NEW_FOREGROUND_TAB); | 780 NEW_FOREGROUND_TAB); |
744 params.override_url = GetVideoPlayerUrl(url); | 781 params.override_url = GetVideoPlayerUrl(url); |
745 application_launch::OpenApplication(params); | 782 application_launch::OpenApplication(params); |
746 return true; | 783 return true; |
| 784 } |
747 } | 785 } |
748 | 786 |
749 if (IsCRXFile(file_extension.data())) { | 787 if (IsCRXFile(file_extension.data())) { |
750 if (drive::util::IsUnderDriveMountPoint(path)) { | 788 if (drive::util::IsUnderDriveMountPoint(path)) { |
751 drive::DriveSystemService* system_service = | 789 drive::DriveSystemService* system_service = |
752 drive::DriveSystemServiceFactory::GetForProfile(profile); | 790 drive::DriveSystemServiceFactory::GetForProfile(profile); |
753 if (!system_service) | 791 if (!system_service) |
754 return false; | 792 return false; |
755 system_service->file_system()->GetFileByPath( | 793 system_service->file_system()->GetFileByPath( |
756 drive::util::ExtractDrivePath(path), | 794 drive::util::ExtractDrivePath(path), |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 for (google_apis::OperationProgressStatusList::const_iterator iter = | 853 for (google_apis::OperationProgressStatusList::const_iterator iter = |
816 list.begin(); | 854 list.begin(); |
817 iter != list.end(); ++iter) { | 855 iter != list.end(); ++iter) { |
818 result_list->Append( | 856 result_list->Append( |
819 ProgessStatusToDictionaryValue(profile, origin_url, *iter)); | 857 ProgessStatusToDictionaryValue(profile, origin_url, *iter)); |
820 } | 858 } |
821 return result_list.release(); | 859 return result_list.release(); |
822 } | 860 } |
823 | 861 |
824 } // namespace file_manager_util | 862 } // namespace file_manager_util |
OLD | NEW |