private_api_util.cc revision 58537e28ecd584eab876aee8be7156509866d23a
1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_interface.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/fileapi_util.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/fileapi/file_system_backend.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_dispatcher.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_context.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/shell_dialogs/selected_file_info.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h"
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h"
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using content::BrowserThread;
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace file_manager {
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace util {
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace {
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// The struct is used for GetSelectedFileInfo().
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)struct GetSelectedFileInfoParams {
343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  GetSelectedFileInfoLocalPathOption local_path_option;
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetSelectedFileInfoCallback callback;
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> file_paths;
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<ui::SelectedFileInfo> selected_files;
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Forward declarations of helper functions for GetSelectedFileInfo().
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile,
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params,
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 drive::FileError error,
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 const base::FilePath& local_file_path,
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<drive::ResourceEntry> entry);
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo().
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfoInternal(Profile* profile,
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params) {
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  drive::FileSystemInterface* file_system =
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      drive::util::GetFileSystemByProfile(profile);
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = params->selected_files.size();
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       i < params->file_paths.size(); ++i) {
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath& file_path = params->file_paths[i];
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!drive::util::IsUnderDriveMountPoint(file_path)) {
593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      params->selected_files.push_back(
603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          ui::SelectedFileInfo(file_path, base::FilePath()));
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    } else {
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // |file_system| is NULL if Drive is disabled.
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (!file_system) {
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        ContinueGetSelectedFileInfo(profile,
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    params.Pass(),
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    drive::FILE_ERROR_FAILED,
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    base::FilePath(),
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    scoped_ptr<drive::ResourceEntry>());
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        return;
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      }
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // When the caller of the select file dialog wants local file paths,
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // we should retrieve Drive files onto the local cache.
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      switch (params->local_path_option) {
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NO_LOCAL_PATH_RESOLUTION:
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          params->selected_files.push_back(
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              ui::SelectedFileInfo(file_path, base::FilePath()));
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          break;
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NEED_LOCAL_PATH_FOR_OPENING:
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          file_system->GetFileByPath(
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              drive::util::ExtractDrivePath(file_path),
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              base::Bind(&ContinueGetSelectedFileInfo,
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         profile,
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         base::Passed(&params)));
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          return;  // Remaining work is done in ContinueGetSelectedFileInfo.
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        case NEED_LOCAL_PATH_FOR_SAVING:
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          file_system->GetFileByPathForSaving(
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              drive::util::ExtractDrivePath(file_path),
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              base::Bind(&ContinueGetSelectedFileInfo,
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         profile,
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         base::Passed(&params)));
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          return;  // Remaining work is done in ContinueGetSelectedFileInfo.
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   }
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->callback.Run(params->selected_files);
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Part of GetSelectedFileInfo().
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContinueGetSelectedFileInfo(Profile* profile,
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<GetSelectedFileInfoParams> params,
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 drive::FileError error,
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 const base::FilePath& local_file_path,
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 scoped_ptr<drive::ResourceEntry> entry) {
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int index = params->selected_files.size();
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const base::FilePath& file_path = params->file_paths[index];
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath local_path;
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (error == drive::FILE_ERROR_OK) {
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    local_path = local_file_path;
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DLOG(ERROR) << "Failed to get " << file_path.value()
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                << " with error code: " << error;
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->selected_files.push_back(ui::SelectedFileInfo(file_path, local_path));
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetSelectedFileInfoInternal(profile, params.Pass());
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns string representaion of VolumeType.
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string VolumeTypeToStringEnum(VolumeType type) {
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (type) {
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_GOOGLE_DRIVE:
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return "drive";
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_DOWNLOADS_DIRECTORY:
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return "downloads";
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_REMOVABLE_DISK_PARTITION:
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return "removable";
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case VOLUME_TYPE_MOUNTED_ARCHIVE_FILE:
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return "archive";
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NOTREACHED();
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return "";
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int32 GetTabId(ExtensionFunctionDispatcher* dispatcher) {
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!dispatcher) {
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "No dispatcher";
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return 0;
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!dispatcher->delegate()) {
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "No delegate";
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return 0;
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::WebContents* web_contents =
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      dispatcher->delegate()->GetAssociatedWebContents();
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!web_contents) {
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "No associated tab contents";
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return 0;
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return ExtensionTabUtil::GetTabId(web_contents);
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::FilePath GetLocalPathFromURL(
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    content::RenderViewHost* render_view_host,
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Profile* profile,
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& url) {
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(render_view_host);
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<fileapi::FileSystemContext> file_system_context =
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetFileSystemContextForRenderViewHost(
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          profile, render_view_host);
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const fileapi::FileSystemURL filesystem_url(
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      file_system_context->CrackURL(url));
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath path;
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!chromeos::FileSystemBackend::CanHandleURL(filesystem_url))
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return base::FilePath();
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return filesystem_url.path();
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetSelectedFileInfo(content::RenderViewHost* render_view_host,
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         Profile* profile,
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         const std::vector<GURL>& file_urls,
1783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                         GetSelectedFileInfoLocalPathOption local_path_option,
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                         GetSelectedFileInfoCallback callback) {
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(render_view_host);
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(profile);
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<GetSelectedFileInfoParams> params(new GetSelectedFileInfoParams);
1843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  params->local_path_option = local_path_option;
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  params->callback = callback;
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i < file_urls.size(); ++i) {
188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& file_url = file_urls[i];
189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath path = GetLocalPathFromURL(
190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        render_view_host, profile, file_url);
191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!path.empty()) {
192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      DVLOG(1) << "Selected: file path: " << path.value();
193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      params->file_paths.push_back(path);
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  BrowserThread::PostTask(
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&GetSelectedFileInfoInternal,
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 profile,
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 base::Passed(&params)));
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace util
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace file_manager
206