| 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 |