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(¶ms))); 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(¶ms))); 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(¶ms))); 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace util 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace file_manager 206