private_api_misc.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/file_path.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/prefs/pref_service.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/values.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/browser_process.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive_integration_service.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/drive/logging.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/file_manager_installer.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/google_apis/auth_service.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/api/file_browser_private.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/common/page_zoom.h"
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "url/gurl.h"
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace extensions {
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kCWSScope[] = "https://www.googleapis.com/auth/chromewebstore";
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateLogoutUserFunction::RunImpl() {
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chrome::AttemptUserExit();
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateGetPreferencesFunction::RunImpl() {
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api::file_browser_private::GetPreferences::Results::Result result;
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const PrefService* const service = profile_->GetPrefs();
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.drive_enabled = drive::util::IsDriveEnabledForProfile(profile_);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.cellular_disabled =
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetBoolean(prefs::kDisableDriveOverCellular);
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.hosted_files_disabled =
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetBoolean(prefs::kDisableDriveHostedFiles);
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.use24hour_clock = service->GetBoolean(prefs::kUse24HourClock);
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  result.allow_redeem_offers = true;
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!chromeos::CrosSettings::Get()->GetBoolean(
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          chromeos::kAllowRedeemChromeOsRegistrationOffers,
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &result.allow_redeem_offers)) {
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    result.allow_redeem_offers = true;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetResult(result.ToValue().release());
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  drive::util::Log(logging::LOG_INFO, "%s succeeded.", name().c_str());
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateSetPreferencesFunction::RunImpl() {
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::SetPreferences::Params;
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PrefService* const service = profile_->GetPrefs();
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->change_info.cellular_disabled)
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    service->SetBoolean(prefs::kDisableDriveOverCellular,
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        *params->change_info.cellular_disabled);
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->change_info.hosted_files_disabled)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    service->SetBoolean(prefs::kDisableDriveHostedFiles,
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        *params->change_info.hosted_files_disabled);
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  drive::util::Log(logging::LOG_INFO, "%s succeeded.", name().c_str());
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileBrowserPrivateZipSelectionFunction::
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FileBrowserPrivateZipSelectionFunction() {}
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)FileBrowserPrivateZipSelectionFunction::
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ~FileBrowserPrivateZipSelectionFunction() {}
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool FileBrowserPrivateZipSelectionFunction::RunImpl() {
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::ZipSelection::Params;
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // First param is the source directory URL.
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->dir_url.empty())
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::FilePath src_dir = file_manager::util::GetLocalPathFromURL(
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      render_view_host(), profile(), GURL(params->dir_url));
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (src_dir.empty())
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Second param is the list of selected file URLs.
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->selection_urls.empty())
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> files;
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i < params->selection_urls.size(); ++i) {
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath path = file_manager::util::GetLocalPathFromURL(
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        render_view_host(), profile(), GURL(params->selection_urls[i]));
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (path.empty())
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    files.push_back(path);
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Third param is the name of the output zip file.
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->dest_name.empty())
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Check if the dir path is under Drive mount point.
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(hshi): support create zip file on Drive (crbug.com/158690).
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (drive::util::IsUnderDriveMountPoint(src_dir))
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath dest_file = src_dir.Append(params->dest_name);
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<base::FilePath> src_relative_paths;
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i != files.size(); ++i) {
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::FilePath& file_path = files[i];
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Obtain the relative path of |file_path| under |src_dir|.
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::FilePath relative_path;
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!src_dir.AppendRelativePath(file_path, &relative_path))
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return false;
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    src_relative_paths.push_back(relative_path);
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  zip_file_creator_ = new file_manager::ZipFileCreator(this,
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                                       src_dir,
137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                                       src_relative_paths,
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                                       dest_file);
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Keep the refcount until the zipping is complete on utility process.
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  AddRef();
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  zip_file_creator_->Start();
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void FileBrowserPrivateZipSelectionFunction::OnZipDone(bool success) {
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SetResult(new base::FundamentalValue(success));
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SendResponse(true);
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Release();
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FileBrowserPrivateZoomFunction::RunImpl() {
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::Zoom::Params;
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::RenderViewHost* const view_host = render_view_host();
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::PageZoom zoom_type;
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (params->operation) {
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case Params::OPERATION_IN:
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_IN;
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case Params::OPERATION_OUT:
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_OUT;
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case Params::OPERATION_RESET:
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      zoom_type = content::PAGE_ZOOM_RESET;
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTREACHED();
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  view_host->Zoom(zoom_type);
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FileBrowserPrivateInstallWebstoreItemFunction::RunImpl() {
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  using extensions::api::file_browser_private::InstallWebstoreItem::Params;
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const scoped_ptr<Params> params(Params::Create(*args_));
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params);
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (params->item_id.empty())
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::WebstoreStandaloneInstaller::Callback callback =
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &FileBrowserPrivateInstallWebstoreItemFunction::OnInstallComplete,
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          this);
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<file_manager::FileManagerInstaller> installer(
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new file_manager::FileManagerInstaller(
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          GetAssociatedWebContents(),  // web_contents(),
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          params->item_id,
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          profile(),
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          callback));
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // installer will be AddRef()'d in BeginInstall().
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  installer->BeginInstall();
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileBrowserPrivateInstallWebstoreItemFunction::OnInstallComplete(
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool success,
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& error) {
20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (success) {
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    drive::util::Log(logging::LOG_INFO,
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "App install succeeded. (item id: %s)",
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     webstore_item_id_.c_str());
209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    drive::util::Log(logging::LOG_ERROR,
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "App install failed. (item id: %s, reason: %s)",
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     webstore_item_id_.c_str(),
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     error.c_str());
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    error_ = error;
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SendResponse(success);
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileBrowserPrivateRequestWebStoreAccessTokenFunction::
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FileBrowserPrivateRequestWebStoreAccessTokenFunction() {
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileBrowserPrivateRequestWebStoreAccessTokenFunction::
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ~FileBrowserPrivateRequestWebStoreAccessTokenFunction() {
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FileBrowserPrivateRequestWebStoreAccessTokenFunction::RunImpl() {
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<std::string> scopes;
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scopes.push_back(kCWSScope);
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ProfileOAuth2TokenService* oauth_service =
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ProfileOAuth2TokenServiceFactory::GetForProfile(profile());
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::URLRequestContextGetter* url_request_context_getter =
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      g_browser_process->system_request_context();
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!oauth_service) {
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    drive::util::Log(logging::LOG_ERROR,
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "CWS OAuth token fetch failed. OAuth2TokenService can't "
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "be retrived.");
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(base::Value::CreateNullValue());
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_service_.reset(new google_apis::AuthService(
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      oauth_service,
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      oauth_service->GetPrimaryAccountId(),
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url_request_context_getter,
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scopes));
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  auth_service_->StartAuthentication(base::Bind(
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &FileBrowserPrivateRequestWebStoreAccessTokenFunction::
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          OnAccessTokenFetched,
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this));
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileBrowserPrivateRequestWebStoreAccessTokenFunction::OnAccessTokenFetched(
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    google_apis::GDataErrorCode code,
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& access_token) {
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (code == google_apis::HTTP_SUCCESS) {
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(auth_service_->HasAccessToken());
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(access_token == auth_service_->access_token());
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    drive::util::Log(logging::LOG_INFO,
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "CWS OAuth token fetch succeeded. (token: %s)",
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     access_token.c_str());
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(new base::StringValue(access_token));
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SendResponse(true);
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    drive::util::Log(logging::LOG_ERROR,
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     "CWS OAuth token fetch failed. (GDataErrorCode: %s)",
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     google_apis::GDataErrorCodeToString(code).c_str());
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SetResult(base::Value::CreateNullValue());
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SendResponse(false);
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace extensions
279