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)
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ash/frame/frame_util.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_service.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/stringprintf.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"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/app_installer.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/zip_file_creator.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/devtools_util.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.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_factory.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/api/file_manager_private.h"
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h"
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_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"
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window.h"
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window_registry.h"
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/auth_service.h"
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "url/gurl.h"
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace extensions {
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kCWSScope[] = "https://www.googleapis.com/auth/chromewebstore";
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kGoogleCastApiExtensionId[] = "mafeflapfdfljijmlienjedomfjfmhpd";
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Obtains the current app window.
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciAppWindow* GetCurrentAppWindow(ChromeSyncExtensionFunction* function) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindowRegistry* const app_window_registry =
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AppWindowRegistry::Get(function->GetProfile());
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* const contents = function->GetAssociatedWebContents();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderViewHost* const render_view_host =
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      contents ? contents->GetRenderViewHost() : NULL;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return render_view_host ? app_window_registry->GetAppWindowForRenderViewHost(
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                render_view_host)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          : NULL;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::vector<linked_ptr<api::file_manager_private::ProfileInfo> >
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGetLoggedInProfileInfoList() {
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(user_manager::UserManager::IsInitialized());
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<Profile*>& profiles =
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->profile_manager()->GetLoadedProfiles();
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::set<Profile*> original_profiles;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<linked_ptr<api::file_manager_private::ProfileInfo> >
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      result_profiles;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < profiles.size(); ++i) {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Filter the profile.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* const profile = profiles[i]->GetOriginalProfile();
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (original_profiles.count(profile))
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    original_profiles.insert(profile);
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const user_manager::User* const user =
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!user || !user->is_logged_in())
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a ProfileInfo.
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    linked_ptr<api::file_manager_private::ProfileInfo> profile_info(
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new api::file_manager_private::ProfileInfo());
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_info->profile_id = multi_user_util::GetUserIDFromProfile(profile);
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_info->display_name = UTF16ToUTF8(user->GetDisplayName());
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(hirono): Remove the property from the profile_info.
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    profile_info->is_current_profile = true;
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result_profiles.push_back(profile_info);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result_profiles;
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateLogoutUserForReauthenticationFunction::RunSync() {
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User* user =
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      chromeos::ProfileHelper::Get()->GetUserByProfile(GetProfile());
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (user) {
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_manager::UserManager::Get()->SaveUserOAuthStatus(
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        user->email(), user_manager::User::OAUTH2_TOKEN_STATUS_INVALID);
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chrome::AttemptUserExit();
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateGetPreferencesFunction::RunSync() {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  api::file_manager_private::Preferences result;
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const PrefService* const service = GetProfile()->GetPrefs();
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  result.drive_enabled = drive::util::IsDriveEnabledForProfile(GetProfile());
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.cellular_disabled =
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetBoolean(prefs::kDisableDriveOverCellular);
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.hosted_files_disabled =
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetBoolean(prefs::kDisableDriveHostedFiles);
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.use24hour_clock = service->GetBoolean(prefs::kUse24HourClock);
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.allow_redeem_offers = true;
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!chromeos::CrosSettings::Get()->GetBoolean(
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          chromeos::kAllowRedeemChromeOsRegistrationOffers,
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &result.allow_redeem_offers)) {
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result.allow_redeem_offers = true;
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetResult(result.ToValue().release());
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (logger)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger->Log(logging::LOG_INFO, "%s succeeded.", name().c_str());
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateSetPreferencesFunction::RunSync() {
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_manager_private::SetPreferences::Params;
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PrefService* const service = GetProfile()->GetPrefs();
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->change_info.cellular_disabled)
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    service->SetBoolean(prefs::kDisableDriveOverCellular,
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        *params->change_info.cellular_disabled);
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->change_info.hosted_files_disabled)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    service->SetBoolean(prefs::kDisableDriveHostedFiles,
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        *params->change_info.hosted_files_disabled);
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (logger)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger->Log(logging::LOG_INFO, "%s succeeded.", name().c_str());
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFileManagerPrivateZipSelectionFunction::
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FileManagerPrivateZipSelectionFunction() {}
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFileManagerPrivateZipSelectionFunction::
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~FileManagerPrivateZipSelectionFunction() {}
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateZipSelectionFunction::RunAsync() {
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_manager_private::ZipSelection::Params;
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // First param is the source directory URL.
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->dir_url.empty())
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::FilePath src_dir = file_manager::util::GetLocalPathFromURL(
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      render_view_host(), GetProfile(), GURL(params->dir_url));
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (src_dir.empty())
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Second param is the list of selected file URLs.
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->selection_urls.empty())
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> files;
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i < params->selection_urls.size(); ++i) {
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath path = file_manager::util::GetLocalPathFromURL(
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        render_view_host(), GetProfile(), GURL(params->selection_urls[i]));
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (path.empty())
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    files.push_back(path);
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Third param is the name of the output zip file.
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->dest_name.empty())
190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Check if the dir path is under Drive mount point.
193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(hshi): support create zip file on Drive (crbug.com/158690).
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (drive::util::IsUnderDriveMountPoint(src_dir))
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath dest_file = src_dir.Append(params->dest_name);
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> src_relative_paths;
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i != files.size(); ++i) {
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath& file_path = files[i];
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Obtain the relative path of |file_path| under |src_dir|.
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::FilePath relative_path;
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!src_dir.AppendRelativePath(file_path, &relative_path))
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    src_relative_paths.push_back(relative_path);
207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  (new file_manager::ZipFileCreator(
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       base::Bind(&FileManagerPrivateZipSelectionFunction::OnZipDone, this),
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       src_dir,
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       src_relative_paths,
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       dest_file))->Start();
214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FileManagerPrivateZipSelectionFunction::OnZipDone(bool success) {
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SetResult(new base::FundamentalValue(success));
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SendResponse(true);
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateZoomFunction::RunSync() {
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_manager_private::Zoom::Params;
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::PageZoom zoom_type;
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (params->operation) {
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case api::file_manager_private::ZOOM_OPERATION_TYPE_IN:
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_IN;
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case api::file_manager_private::ZOOM_OPERATION_TYPE_OUT:
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_OUT;
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case api::file_manager_private::ZOOM_OPERATION_TYPE_RESET:
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_RESET;
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTREACHED();
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  render_view_host()->Zoom(zoom_type);
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateInstallWebstoreItemFunction::RunAsync() {
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_manager_private::InstallWebstoreItem::Params;
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->item_id.empty())
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::WebstoreStandaloneInstaller::Callback callback =
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          &FileManagerPrivateInstallWebstoreItemFunction::OnInstallComplete,
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          this);
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Only GoogleCastAPI extension can use silent installation.
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (params->silent_installation &&
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      params->item_id != kGoogleCastApiExtensionId) {
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SetError("Only whitelisted items can do silent installation.");
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return false;
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<file_manager::AppInstaller> installer(
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new file_manager::AppInstaller(GetAssociatedWebContents(),
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     params->item_id,
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     GetProfile(),
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     params->silent_installation,
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     callback));
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // installer will be AddRef()'d in BeginInstall().
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  installer->BeginInstall();
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FileManagerPrivateInstallWebstoreItemFunction::OnInstallComplete(
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool success,
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& error,
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    extensions::webstore_install::Result result) {
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (success) {
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_INFO,
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "App install succeeded. (item id: %s)",
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  webstore_item_id_.c_str());
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_ERROR,
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "App install failed. (item id: %s, reason: %s)",
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  webstore_item_id_.c_str(),
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  error.c_str());
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError(error);
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SendResponse(success);
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFileManagerPrivateRequestWebStoreAccessTokenFunction::
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FileManagerPrivateRequestWebStoreAccessTokenFunction() {
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFileManagerPrivateRequestWebStoreAccessTokenFunction::
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~FileManagerPrivateRequestWebStoreAccessTokenFunction() {
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateRequestWebStoreAccessTokenFunction::RunAsync() {
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::string> scopes;
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scopes.push_back(kCWSScope);
31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProfileOAuth2TokenService* oauth_service =
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile());
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::URLRequestContextGetter* url_request_context_getter =
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      g_browser_process->system_request_context();
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!oauth_service) {
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_ERROR,
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "CWS OAuth token fetch failed. OAuth2TokenService can't "
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "be retrieved.");
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(base::Value::CreateNullValue());
326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SigninManagerBase* signin_manager =
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SigninManagerFactory::GetForProfile(GetProfile());
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_service_.reset(new google_apis::AuthService(
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      oauth_service,
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      signin_manager->GetAuthenticatedAccountId(),
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url_request_context_getter,
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scopes));
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_service_->StartAuthentication(base::Bind(
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &FileManagerPrivateRequestWebStoreAccessTokenFunction::
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          OnAccessTokenFetched,
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this));
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FileManagerPrivateRequestWebStoreAccessTokenFunction::OnAccessTokenFetched(
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    google_apis::GDataErrorCode code,
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& access_token) {
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (code == google_apis::HTTP_SUCCESS) {
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(auth_service_->HasAccessToken());
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(access_token == auth_service_->access_token());
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_INFO, "CWS OAuth token fetch succeeded.");
35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(new base::StringValue(access_token));
35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SendResponse(true);
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (logger) {
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger->Log(logging::LOG_ERROR,
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  "CWS OAuth token fetch failed. (GDataErrorCode: %s)",
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  google_apis::GDataErrorCodeToString(code).c_str());
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(base::Value::CreateNullValue());
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SendResponse(false);
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateGetProfilesFunction::RunSync() {
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA)
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(oshima): Figure out what to do.
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return false;
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::vector<linked_ptr<api::file_manager_private::ProfileInfo> >&
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profiles = GetLoggedInProfileInfoList();
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Obtains the display profile ID.
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* const app_window = GetCurrentAppWindow(this);
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::MultiUserWindowManager* const window_manager =
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome::MultiUserWindowManager::GetInstance();
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string current_profile_id =
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      multi_user_util::GetUserIDFromProfile(GetProfile());
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string display_profile_id =
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_manager && app_window ? window_manager->GetUserPresentingWindow(
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         app_window->GetNativeWindow())
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   : "";
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  results_ = api::file_manager_private::GetProfiles::Results::Create(
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profiles,
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      current_profile_id,
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      display_profile_id.empty() ? current_profile_id : display_profile_id);
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateVisitDesktopFunction::RunSync() {
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using api::file_manager_private::VisitDesktop::Params;
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::vector<linked_ptr<api::file_manager_private::ProfileInfo> >&
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profiles = GetLoggedInProfileInfoList();
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::MultiUserWindowManager* const window_manager =
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome::MultiUserWindowManager::GetInstance();
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(window_manager);
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check if the target user is logged-in or not.
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool logged_in = false;
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < profiles.size(); ++i) {
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (profiles[i]->profile_id == params->profile_id) {
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logged_in = true;
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!logged_in) {
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("The user is not logged-in now.");
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Look for the current app window.
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindow* const app_window = GetCurrentAppWindow(this);
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!app_window) {
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("Target window is not found.");
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Move the window to the user's desktop.
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_manager->ShowWindowForUser(app_window->GetNativeWindow(),
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    params->profile_id);
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check the result.
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!window_manager->IsWindowOnDesktopOfUser(app_window->GetNativeWindow(),
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               params->profile_id)) {
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetError("The window cannot visit the desktop.");
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool FileManagerPrivateOpenInspectorFunction::RunSync() {
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  using extensions::api::file_manager_private::OpenInspector::Params;
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (params->type) {
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case extensions::api::file_manager_private::INSPECTION_TYPE_NORMAL:
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Open inspector for foreground page.
4466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DevToolsWindow::OpenDevToolsWindow(
4476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          content::WebContents::FromRenderViewHost(render_view_host()));
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case extensions::api::file_manager_private::INSPECTION_TYPE_CONSOLE:
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Open inspector for foreground page and bring focus to the console.
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DevToolsWindow::OpenDevToolsWindow(
4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          content::WebContents::FromRenderViewHost(render_view_host()),
4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          DevToolsToggleAction::ShowConsole());
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case extensions::api::file_manager_private::INSPECTION_TYPE_ELEMENT:
456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Open inspector for foreground page in inspect element mode.
4576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DevToolsWindow::OpenDevToolsWindow(
4586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          content::WebContents::FromRenderViewHost(render_view_host()),
4596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          DevToolsToggleAction::Inspect());
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case extensions::api::file_manager_private::INSPECTION_TYPE_BACKGROUND:
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Open inspector for background page.
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::devtools_util::InspectBackgroundPage(extension(),
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                       GetProfile());
465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      SetError(
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          base::StringPrintf("Unexpected inspection type(%d) is specified.",
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             static_cast<int>(params->type)));
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
476424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace extensions
477