private_api_misc.cc revision 010d83a9304c5a91596085d917d248abff47903a
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"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ash/frame/frame_util.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_service.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_process.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/event_router.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/file_browser_private_api.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_installer.h"
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/zip_file_creator.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h"
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h"
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h"
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/common/page_zoom.h"
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/auth_service.h"
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "url/gurl.h"
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace extensions {
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kCWSScope[] = "https://www.googleapis.com/auth/chromewebstore";
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Obtains the current app window.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)apps::AppWindow* GetCurrentAppWindow(ChromeSyncExtensionFunction* function) {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apps::AppWindowRegistry* const app_window_registry =
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      apps::AppWindowRegistry::Get(function->GetProfile());
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* const contents = function->GetAssociatedWebContents();
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderViewHost* const render_view_host =
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      contents ? contents->GetRenderViewHost() : NULL;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return render_view_host ? app_window_registry->GetAppWindowForRenderViewHost(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                render_view_host)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          : NULL;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<linked_ptr<api::file_browser_private::ProfileInfo> >
60effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochGetLoggedInProfileInfoList(content::WebContents* contents) {
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(chromeos::UserManager::IsInitialized());
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<Profile*>& profiles =
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->profile_manager()->GetLoadedProfiles();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::set<Profile*> original_profiles;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<linked_ptr<api::file_browser_private::ProfileInfo> >
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      result_profiles;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < profiles.size(); ++i) {
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Filter the profile.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* const profile = profiles[i]->GetOriginalProfile();
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (original_profiles.count(profile))
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    original_profiles.insert(profile);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const chromeos::User* const user =
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        chromeos::UserManager::Get()->GetUserByProfile(profile);
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!user || !user->is_logged_in())
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a ProfileInfo.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    linked_ptr<api::file_browser_private::ProfileInfo> profile_info(
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new api::file_browser_private::ProfileInfo());
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_info->profile_id = multi_user_util::GetUserIDFromProfile(profile);
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_info->display_name = UTF16ToUTF8(user->GetDisplayName());
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(hirono): Remove the property from the profile_info.
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_info->is_current_profile = true;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make an icon URL of the profile.
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (contents) {
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const gfx::Image& image =
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          ash::GetAvatarImageForContext(contents->GetBrowserContext());
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const gfx::ImageSkia& skia = image.AsImageSkia();
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      profile_info->profile_image.reset(
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new api::file_browser_private::ImageSet);
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      profile_info->profile_image->scale1x_url =
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          webui::GetBitmapDataUrl(skia.GetRepresentation(1.0f).sk_bitmap());
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      profile_info->profile_image->scale2x_url =
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          webui::GetBitmapDataUrl(skia.GetRepresentation(2.0f).sk_bitmap());
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result_profiles.push_back(profile_info);
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result_profiles;
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FileBrowserPrivateLogoutUserForReauthenticationFunction::RunSync() {
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chromeos::User* user =
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      chromeos::UserManager::Get()->GetUserByProfile(GetProfile());
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (user) {
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    chromeos::UserManager::Get()->SaveUserOAuthStatus(
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        user->email(),
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        chromeos::User::OAUTH2_TOKEN_STATUS_INVALID);
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chrome::AttemptUserExit();
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FileBrowserPrivateGetPreferencesFunction::RunSync() {
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  api::file_browser_private::Preferences result;
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const PrefService* const service = GetProfile()->GetPrefs();
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  result.drive_enabled = drive::util::IsDriveEnabledForProfile(GetProfile());
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.cellular_disabled =
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetBoolean(prefs::kDisableDriveOverCellular);
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.hosted_files_disabled =
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetBoolean(prefs::kDisableDriveHostedFiles);
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.use24hour_clock = service->GetBoolean(prefs::kUse24HourClock);
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.allow_redeem_offers = true;
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!chromeos::CrosSettings::Get()->GetBoolean(
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          chromeos::kAllowRedeemChromeOsRegistrationOffers,
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &result.allow_redeem_offers)) {
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result.allow_redeem_offers = true;
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetResult(result.ToValue().release());
137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (logger)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger->Log(logging::LOG_INFO, "%s succeeded.", name().c_str());
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FileBrowserPrivateSetPreferencesFunction::RunSync() {
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::SetPreferences::Params;
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PrefService* const service = GetProfile()->GetPrefs();
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->change_info.cellular_disabled)
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    service->SetBoolean(prefs::kDisableDriveOverCellular,
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        *params->change_info.cellular_disabled);
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->change_info.hosted_files_disabled)
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    service->SetBoolean(prefs::kDisableDriveHostedFiles,
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        *params->change_info.hosted_files_disabled);
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (logger)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger->Log(logging::LOG_INFO, "%s succeeded.", name().c_str());
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileBrowserPrivateZipSelectionFunction::
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FileBrowserPrivateZipSelectionFunction() {}
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileBrowserPrivateZipSelectionFunction::
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ~FileBrowserPrivateZipSelectionFunction() {}
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool FileBrowserPrivateZipSelectionFunction::RunAsync() {
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::ZipSelection::Params;
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // First param is the source directory URL.
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->dir_url.empty())
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::FilePath src_dir = file_manager::util::GetLocalPathFromURL(
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      render_view_host(), GetProfile(), GURL(params->dir_url));
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (src_dir.empty())
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Second param is the list of selected file URLs.
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->selection_urls.empty())
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> files;
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i < params->selection_urls.size(); ++i) {
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath path = file_manager::util::GetLocalPathFromURL(
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        render_view_host(), GetProfile(), GURL(params->selection_urls[i]));
193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (path.empty())
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    files.push_back(path);
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Third param is the name of the output zip file.
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->dest_name.empty())
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Check if the dir path is under Drive mount point.
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(hshi): support create zip file on Drive (crbug.com/158690).
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (drive::util::IsUnderDriveMountPoint(src_dir))
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath dest_file = src_dir.Append(params->dest_name);
208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> src_relative_paths;
209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i != files.size(); ++i) {
210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath& file_path = files[i];
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Obtain the relative path of |file_path| under |src_dir|.
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::FilePath relative_path;
214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!src_dir.AppendRelativePath(file_path, &relative_path))
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    src_relative_paths.push_back(relative_path);
217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  (new file_manager::ZipFileCreator(
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       base::Bind(&FileBrowserPrivateZipSelectionFunction::OnZipDone, this),
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       src_dir,
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       src_relative_paths,
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       dest_file))->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)}
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FileBrowserPrivateZoomFunction::RunSync() {
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::Zoom::Params;
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::PageZoom zoom_type;
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (params->operation) {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case api::file_browser_private::ZOOM_OPERATION_TYPE_IN:
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_IN;
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case api::file_browser_private::ZOOM_OPERATION_TYPE_OUT:
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_OUT;
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case api::file_browser_private::ZOOM_OPERATION_TYPE_RESET:
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_RESET;
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTREACHED();
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  render_view_host()->Zoom(zoom_type);
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool FileBrowserPrivateInstallWebstoreItemFunction::RunAsync() {
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::InstallWebstoreItem::Params;
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->item_id.empty())
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::WebstoreStandaloneInstaller::Callback callback =
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &FileBrowserPrivateInstallWebstoreItemFunction::OnInstallComplete,
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          this);
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<file_manager::AppInstaller> installer(
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new file_manager::AppInstaller(
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetAssociatedWebContents(),
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          params->item_id,
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          GetProfile(),
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          callback));
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // installer will be AddRef()'d in BeginInstall().
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  installer->BeginInstall();
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileBrowserPrivateInstallWebstoreItemFunction::OnInstallComplete(
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool success,
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& error) {
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (success) {
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_INFO,
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "App install succeeded. (item id: %s)",
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  webstore_item_id_.c_str());
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_ERROR,
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "App install failed. (item id: %s, reason: %s)",
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  webstore_item_id_.c_str(),
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  error.c_str());
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError(error);
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SendResponse(success);
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileBrowserPrivateRequestWebStoreAccessTokenFunction::
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FileBrowserPrivateRequestWebStoreAccessTokenFunction() {
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileBrowserPrivateRequestWebStoreAccessTokenFunction::
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ~FileBrowserPrivateRequestWebStoreAccessTokenFunction() {
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool FileBrowserPrivateRequestWebStoreAccessTokenFunction::RunAsync() {
31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::string> scopes;
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scopes.push_back(kCWSScope);
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProfileOAuth2TokenService* oauth_service =
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile());
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::URLRequestContextGetter* url_request_context_getter =
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      g_browser_process->system_request_context();
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!oauth_service) {
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_ERROR,
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "CWS OAuth token fetch failed. OAuth2TokenService can't "
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "be retrieved.");
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(base::Value::CreateNullValue());
328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SigninManagerBase* signin_manager =
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SigninManagerFactory::GetForProfile(GetProfile());
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_service_.reset(new google_apis::AuthService(
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      oauth_service,
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      signin_manager->GetAuthenticatedAccountId(),
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url_request_context_getter,
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scopes));
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_service_->StartAuthentication(base::Bind(
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &FileBrowserPrivateRequestWebStoreAccessTokenFunction::
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          OnAccessTokenFetched,
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this));
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileBrowserPrivateRequestWebStoreAccessTokenFunction::OnAccessTokenFetched(
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    google_apis::GDataErrorCode code,
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& access_token) {
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (code == google_apis::HTTP_SUCCESS) {
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(auth_service_->HasAccessToken());
35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(access_token == auth_service_->access_token());
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_INFO, "CWS OAuth token fetch succeeded.");
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(new base::StringValue(access_token));
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SendResponse(true);
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_ERROR,
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "CWS OAuth token fetch failed. (GDataErrorCode: %s)",
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  google_apis::GDataErrorCodeToString(code).c_str());
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(base::Value::CreateNullValue());
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SendResponse(false);
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FileBrowserPrivateGetProfilesFunction::RunSync() {
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<linked_ptr<api::file_browser_private::ProfileInfo> >&
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      profiles = GetLoggedInProfileInfoList(GetAssociatedWebContents());
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Obtains the display profile ID.
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apps::AppWindow* const app_window = GetCurrentAppWindow(this);
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::MultiUserWindowManager* const window_manager =
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome::MultiUserWindowManager::GetInstance();
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string current_profile_id =
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      multi_user_util::GetUserIDFromProfile(GetProfile());
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string display_profile_id =
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_manager && app_window ? window_manager->GetUserPresentingWindow(
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         app_window->GetNativeWindow())
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   : "";
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  results_ = api::file_browser_private::GetProfiles::Results::Create(
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profiles,
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      current_profile_id,
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_profile_id.empty() ? current_profile_id : display_profile_id);
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool FileBrowserPrivateVisitDesktopFunction::RunSync() {
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  using api::file_browser_private::VisitDesktop::Params;
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<linked_ptr<api::file_browser_private::ProfileInfo> >&
395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      profiles = GetLoggedInProfileInfoList(GetAssociatedWebContents());
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check the multi-profile support.
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!profiles::IsMultipleProfilesEnabled()) {
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("Multi-profile support is not enabled.");
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::MultiUserWindowManager* const window_manager =
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome::MultiUserWindowManager::GetInstance();
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(window_manager);
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check if the target user is logged-in or not.
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool logged_in = false;
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < profiles.size(); ++i) {
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (profiles[i]->profile_id == params->profile_id) {
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logged_in = true;
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!logged_in) {
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("The user is not logged-in now.");
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Look for the current app window.
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apps::AppWindow* const app_window = GetCurrentAppWindow(this);
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!app_window) {
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("Target window is not found.");
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Observe owner changes of windows.
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  file_manager::EventRouter* const event_router =
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_manager::FileBrowserPrivateAPI::Get(GetProfile())->event_router();
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  event_router->RegisterMultiUserWindowManagerObserver();
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Move the window to the user's desktop.
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_manager->ShowWindowForUser(app_window->GetNativeWindow(),
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    params->profile_id);
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check the result.
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!window_manager->IsWindowOnDesktopOfUser(app_window->GetNativeWindow(),
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               params->profile_id)) {
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("The window cannot visit the desktop.");
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
446424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace extensions
447