private_api_misc.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_misc.h" 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window_registry.h" 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_service.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_process.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/event_router.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/file_browser_private_api.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_installer.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_util.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h" 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h" 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_util.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h" 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents.h" 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/common/page_zoom.h" 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/auth_service.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/webui/web_ui_util.h" 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "url/gurl.h" 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace extensions { 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kCWSScope[] = "https://www.googleapis.com/auth/chromewebstore"; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Obtains the current app window. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)apps::AppWindow* GetCurrentAppWindow(ChromeSyncExtensionFunction* function) { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps::AppWindowRegistry* const app_window_registry = 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps::AppWindowRegistry::Get(function->GetProfile()); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* const contents = function->GetAssociatedWebContents(); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RenderViewHost* const render_view_host = 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) contents ? contents->GetRenderViewHost() : NULL; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_view_host ? app_window_registry->GetAppWindowForRenderViewHost( 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : NULL; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<linked_ptr<api::file_browser_private::ProfileInfo> > 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GetLoggedInProfileInfoList() { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(chromeos::UserManager::IsInitialized()); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<Profile*>& profiles = 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->profile_manager()->GetLoadedProfiles(); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<Profile*> original_profiles; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<linked_ptr<api::file_browser_private::ProfileInfo> > 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result_profiles; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Filter the profile. 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* const profile = profiles[i]->GetOriginalProfile(); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (original_profiles.count(profile)) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) original_profiles.insert(profile); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const chromeos::User* const user = 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::UserManager::Get()->GetUserByProfile(profile); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!user || !user->is_logged_in()) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make a ProfileInfo. 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) linked_ptr<api::file_browser_private::ProfileInfo> profile_info( 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new api::file_browser_private::ProfileInfo()); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_info->profile_id = multi_user_util::GetUserIDFromProfile(profile); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_info->display_name = UTF16ToUTF8(user->GetDisplayName()); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(hirono): Remove the property from the profile_info. 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_info->is_current_profile = true; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make an icon URL of the profile. 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int kImageSize = 30; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Image& image = profiles::GetAvatarIconForTitleBar( 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Image(user->image()), true, kImageSize, kImageSize); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkBitmap* const bitmap = image.ToSkBitmap(); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bitmap) { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_info->image_uri.reset(new std::string( 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) webui::GetBitmapDataUrl(*bitmap))); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result_profiles.push_back(profile_info); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result_profiles; 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool FileBrowserPrivateLogoutUserForReauthenticationFunction::RunImpl() { 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::User* user = 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::UserManager::Get()->GetUserByProfile(GetProfile()); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (user) { 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::UserManager::Get()->SaveUserOAuthStatus( 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) user->email(), 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::User::OAUTH2_TOKEN_STATUS_INVALID); 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) chrome::AttemptUserExit(); 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateGetPreferencesFunction::RunImpl() { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) api::file_browser_private::Preferences result; 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const PrefService* const service = GetProfile()->GetPrefs(); 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) result.drive_enabled = drive::util::IsDriveEnabledForProfile(GetProfile()); 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.cellular_disabled = 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->GetBoolean(prefs::kDisableDriveOverCellular); 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.hosted_files_disabled = 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->GetBoolean(prefs::kDisableDriveHostedFiles); 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.use24hour_clock = service->GetBoolean(prefs::kUse24HourClock); 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.allow_redeem_offers = true; 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!chromeos::CrosSettings::Get()->GetBoolean( 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chromeos::kAllowRedeemChromeOsRegistrationOffers, 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &result.allow_redeem_offers)) { 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) result.allow_redeem_offers = true; 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetResult(result.ToValue().release()); 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, "%s succeeded.", name().c_str()); 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateSetPreferencesFunction::RunImpl() { 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) using extensions::api::file_browser_private::SetPreferences::Params; 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrefService* const service = GetProfile()->GetPrefs(); 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (params->change_info.cellular_disabled) 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->SetBoolean(prefs::kDisableDriveOverCellular, 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *params->change_info.cellular_disabled); 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (params->change_info.hosted_files_disabled) 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->SetBoolean(prefs::kDisableDriveHostedFiles, 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *params->change_info.hosted_files_disabled); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, "%s succeeded.", name().c_str()); 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileBrowserPrivateZipSelectionFunction:: 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FileBrowserPrivateZipSelectionFunction() {} 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileBrowserPrivateZipSelectionFunction:: 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ~FileBrowserPrivateZipSelectionFunction() {} 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateZipSelectionFunction::RunImpl() { 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) using extensions::api::file_browser_private::ZipSelection::Params; 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // First param is the source directory URL. 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (params->dir_url.empty()) 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::FilePath src_dir = file_manager::util::GetLocalPathFromURL( 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) render_view_host(), GetProfile(), GURL(params->dir_url)); 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (src_dir.empty()) 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Second param is the list of selected file URLs. 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (params->selection_urls.empty()) 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<base::FilePath> files; 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < params->selection_urls.size(); ++i) { 187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::FilePath path = file_manager::util::GetLocalPathFromURL( 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) render_view_host(), GetProfile(), GURL(params->selection_urls[i])); 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (path.empty()) 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) files.push_back(path); 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Third param is the name of the output zip file. 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (params->dest_name.empty()) 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check if the dir path is under Drive mount point. 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(hshi): support create zip file on Drive (crbug.com/158690). 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (drive::util::IsUnderDriveMountPoint(src_dir)) 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath dest_file = src_dir.Append(params->dest_name); 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<base::FilePath> src_relative_paths; 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i != files.size(); ++i) { 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::FilePath& file_path = files[i]; 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Obtain the relative path of |file_path| under |src_dir|. 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FilePath relative_path; 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!src_dir.AppendRelativePath(file_path, &relative_path)) 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) src_relative_paths.push_back(relative_path); 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) zip_file_creator_ = new file_manager::ZipFileCreator(this, 216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) src_dir, 217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) src_relative_paths, 218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) dest_file); 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Keep the refcount until the zipping is complete on utility process. 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) AddRef(); 222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) zip_file_creator_->Start(); 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void FileBrowserPrivateZipSelectionFunction::OnZipDone(bool success) { 228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetResult(new base::FundamentalValue(success)); 229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SendResponse(true); 230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Release(); 231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FileBrowserPrivateZoomFunction::RunImpl() { 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) using extensions::api::file_browser_private::Zoom::Params; 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::PageZoom zoom_type; 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (params->operation) { 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case api::file_browser_private::ZOOM_OPERATION_TYPE_IN: 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) zoom_type = content::PAGE_ZOOM_IN; 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case api::file_browser_private::ZOOM_OPERATION_TYPE_OUT: 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) zoom_type = content::PAGE_ZOOM_OUT; 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case api::file_browser_private::ZOOM_OPERATION_TYPE_RESET: 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) zoom_type = content::PAGE_ZOOM_RESET; 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_view_host()->Zoom(zoom_type); 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FileBrowserPrivateInstallWebstoreItemFunction::RunImpl() { 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) using extensions::api::file_browser_private::InstallWebstoreItem::Params; 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (params->item_id.empty()) 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const extensions::WebstoreStandaloneInstaller::Callback callback = 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind( 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &FileBrowserPrivateInstallWebstoreItemFunction::OnInstallComplete, 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this); 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<file_manager::AppInstaller> installer( 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new file_manager::AppInstaller( 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetAssociatedWebContents(), 27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) params->item_id, 2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GetProfile(), 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback)); 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // installer will be AddRef()'d in BeginInstall(). 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) installer->BeginInstall(); 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileBrowserPrivateInstallWebstoreItemFunction::OnInstallComplete( 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool success, 28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& error) { 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (success) { 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "App install succeeded. (item id: %s)", 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) webstore_item_id_.c_str()); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_ERROR, 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "App install failed. (item id: %s, reason: %s)", 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) webstore_item_id_.c_str(), 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error.c_str()); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetError(error); 29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SendResponse(success); 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileBrowserPrivateRequestWebStoreAccessTokenFunction:: 30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FileBrowserPrivateRequestWebStoreAccessTokenFunction() { 30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileBrowserPrivateRequestWebStoreAccessTokenFunction:: 30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ~FileBrowserPrivateRequestWebStoreAccessTokenFunction() { 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FileBrowserPrivateRequestWebStoreAccessTokenFunction::RunImpl() { 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<std::string> scopes; 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scopes.push_back(kCWSScope); 31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileOAuth2TokenService* oauth_service = 3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); 31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::URLRequestContextGetter* url_request_context_getter = 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) g_browser_process->system_request_context(); 32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!oauth_service) { 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_ERROR, 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "CWS OAuth token fetch failed. OAuth2TokenService can't " 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "be retrieved."); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetResult(base::Value::CreateNullValue()); 329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerBase* signin_manager = 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SigninManagerFactory::GetForProfile(GetProfile()); 33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) auth_service_.reset(new google_apis::AuthService( 33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) oauth_service, 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) signin_manager->GetAuthenticatedAccountId(), 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url_request_context_getter, 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scopes)); 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) auth_service_->StartAuthentication(base::Bind( 34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &FileBrowserPrivateRequestWebStoreAccessTokenFunction:: 34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OnAccessTokenFetched, 34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this)); 34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileBrowserPrivateRequestWebStoreAccessTokenFunction::OnAccessTokenFetched( 34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) google_apis::GDataErrorCode code, 34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& access_token) { 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile()); 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (code == google_apis::HTTP_SUCCESS) { 35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(auth_service_->HasAccessToken()); 35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(access_token == auth_service_->access_token()); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_INFO, "CWS OAuth token fetch succeeded."); 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetResult(new base::StringValue(access_token)); 35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SendResponse(true); 35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (logger) { 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logger->Log(logging::LOG_ERROR, 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "CWS OAuth token fetch failed. (GDataErrorCode: %s)", 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::GDataErrorCodeToString(code).c_str()); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetResult(base::Value::CreateNullValue()); 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SendResponse(false); 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FileBrowserPrivateGetProfilesFunction::RunImpl() { 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<linked_ptr<api::file_browser_private::ProfileInfo> >& 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profiles = GetLoggedInProfileInfoList(); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Obtains the display profile ID. 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps::AppWindow* const app_window = GetCurrentAppWindow(this); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::MultiUserWindowManager* const window_manager = 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::MultiUserWindowManager::GetInstance(); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string current_profile_id = 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) multi_user_util::GetUserIDFromProfile(GetProfile()); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string display_profile_id = 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_manager && app_window ? window_manager->GetUserPresentingWindow( 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) app_window->GetNativeWindow()) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : ""; 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) results_ = api::file_browser_private::GetProfiles::Results::Create( 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profiles, 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_profile_id, 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_profile_id.empty() ? current_profile_id : display_profile_id); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FileBrowserPrivateVisitDesktopFunction::RunImpl() { 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using api::file_browser_private::VisitDesktop::Params; 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_ptr<Params> params(Params::Create(*args_)); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<linked_ptr<api::file_browser_private::ProfileInfo> >& 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profiles = GetLoggedInProfileInfoList(); 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check the multi-profile support. 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!profiles::IsMultipleProfilesEnabled()) { 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetError("Multi-profile support is not enabled."); 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::MultiUserWindowManager* const window_manager = 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::MultiUserWindowManager::GetInstance(); 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(window_manager); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check if the target user is logged-in or not. 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool logged_in = false; 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (profiles[i]->profile_id == params->profile_id) { 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logged_in = true; 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!logged_in) { 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetError("The user is not logged-in now."); 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Look for the current app window. 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps::AppWindow* const app_window = GetCurrentAppWindow(this); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!app_window) { 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetError("Target window is not found."); 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Observe owner changes of windows. 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_manager::EventRouter* const event_router = 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_manager::FileBrowserPrivateAPI::Get(GetProfile())->event_router(); 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_router->RegisterMultiUserWindowManagerObserver(); 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Move the window to the user's desktop. 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_manager->ShowWindowForUser(app_window->GetNativeWindow(), 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params->profile_id); 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check the result. 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!window_manager->IsWindowOnDesktopOfUser(app_window->GetNativeWindow(), 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params->profile_id)) { 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetError("The window cannot visit the desktop."); 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 447424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace extensions 448