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