developer_private_api.cc revision 58537e28ecd584eab876aee8be7156509866d23a
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/developer_private/developer_private_api.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "apps/app_load_service.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "apps/app_restore_service.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "apps/saved_files_service.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/shell_window.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "apps/shell_window_registry.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/base64.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/command_line.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/i18n/file_util_icu.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/developer_private/developer_private_api_factory.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/developer_private/entry_picker.h"
24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/devtools_util.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_disabled_ui.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_error_reporter.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/management_policy.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/unpacked_installer.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/updater/extension_updater.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/platform_util.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend_v1/drive_file_sync_service.h"
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/developer_private.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/incognito_handler.h"
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/offline_enabled_info.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h"
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/url_constants.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/site_instance.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/storage_partition.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "extensions/common/install_warning.h"
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h"
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_util.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/webui/web_ui_util.h"
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h"
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation.h"
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h"
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/blob/shareable_file_reference.h"
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing apps::ShellWindow;
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing apps::ShellWindowRegistry;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::RenderViewHost;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace developer_private = api::developer_private;
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kUnpackedAppsFolder[]
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    = FILE_PATH_LITERAL("apps_target");
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ExtensionUpdater* GetExtensionUpdater(Profile* profile) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return profile->GetExtensionService()->updater();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<base::FilePath> ListFolder(const base::FilePath path) {
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::FileEnumerator files(path, false,
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FileEnumerator::DIRECTORIES | base::FileEnumerator::FILES);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::FilePath> paths;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (base::FilePath current_path = files.Next(); !current_path.empty();
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       current_path = files.Next()) {
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    paths.push_back(current_path);
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return paths;
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ValidateFolderName(const base::FilePath::StringType& name) {
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath::StringType name_sanitized(name);
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  file_util::ReplaceIllegalCharactersInPath(&name_sanitized, '_');
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return name == name_sanitized;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const Extension* GetExtensionByPath(const ExtensionSet* extensions,
105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                    const base::FilePath& path) {
106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath extension_path = base::MakeAbsoluteFilePath(path);
107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  for (ExtensionSet::const_iterator iter = extensions->begin();
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)       iter != extensions->end(); ++iter) {
109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if ((*iter)->path() == extension_path)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return iter->get();
111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return NULL;
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string GetExtensionID(const RenderViewHost* render_view_host) {
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!render_view_host->GetSiteInstance())
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return std::string();
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return render_view_host->GetSiteInstance()->GetSiteURL().host();
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace AllowFileAccess = api::developer_private::AllowFileAccess;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace AllowIncognito = api::developer_private::AllowIncognito;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ChoosePath = api::developer_private::ChoosePath;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Enable = api::developer_private::Enable;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace GetItemsInfo = api::developer_private::GetItemsInfo;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Inspect = api::developer_private::Inspect;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace PackDirectory = api::developer_private::PackDirectory;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Reload = api::developer_private::Reload;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAPI* DeveloperPrivateAPI::Get(Profile* profile) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return DeveloperPrivateAPIFactory::GetForProfile(profile);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDeveloperPrivateAPI::DeveloperPrivateAPI(Profile* profile) : profile_(profile) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RegisterNotifications();
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDeveloperPrivateEventRouter::DeveloperPrivateEventRouter(Profile* profile)
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch: profile_(profile) {
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int types[] = {
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_INSTALLED,
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_LOADED,
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_UNLOADED,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED,
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(registrar_.IsEmpty());
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < arraysize(types); ++i) {
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    registrar_.Add(this,
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   types[i],
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   content::Source<Profile>(profile_));
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDeveloperPrivateEventRouter::~DeveloperPrivateEventRouter() {}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeveloperPrivateEventRouter::Observe(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationDetails& details) {
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const char* event_name = NULL;
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Profile* profile = content::Source<Profile>(source).ptr();
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(profile);
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(profile_->IsSameProfile(profile));
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  developer::EventData event_data;
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const Extension* extension = NULL;
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_INSTALLED:
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_INSTALLED;
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension =
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const InstalledExtensionInfo>(details)->extension;
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_UNINSTALLED:
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_UNINSTALLED;
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension = content::Details<const Extension>(details).ptr();
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_LOADED:
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_LOADED;
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension = content::Details<const Extension>(details).ptr();
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_UNLOADED:
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_UNLOADED;
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension =
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const UnloadedExtensionInfo>(details)->extension;
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED:
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_VIEW_UNREGISTERED;
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.item_id = GetExtensionID(
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const RenderViewHost>(details).ptr());
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED:
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_VIEW_REGISTERED;
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.item_id = GetExtensionID(
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const RenderViewHost>(details).ptr());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (extension)
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    event_data.item_id = extension->id();
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ListValue> args(new ListValue());
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  args->Append(event_data.ToValue().release());
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  event_name = developer_private::OnItemStateChanged::kEventName;
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<Event> event(new Event(event_name, args.Pass()));
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass());
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateAPI::SetLastUnpackedDirectory(const base::FilePath& path) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_unpacked_directory_ = path;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateAPI::RegisterNotifications() {
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      this, developer_private::OnItemStateChanged::kEventName);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAPI::~DeveloperPrivateAPI() {}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateAPI::Shutdown() {}
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeveloperPrivateAPI::OnListenerAdded(
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const EventListenerInfo& details) {
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!developer_private_event_router_)
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    developer_private_event_router_.reset(
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new DeveloperPrivateEventRouter(profile_));
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeveloperPrivateAPI::OnListenerRemoved(
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const EventListenerInfo& details) {
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!ExtensionSystem::Get(profile_)->event_router()->HasEventListener(
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          developer_private::OnItemStateChanged::kEventName))
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    developer_private_event_router_.reset(NULL);
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace api {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateAutoUpdateFunction::RunImpl() {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionUpdater* updater = GetExtensionUpdater(profile());
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (updater)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    updater->CheckNow(ExtensionUpdater::CheckParams());
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SetResult(new base::FundamentalValue(true));
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAutoUpdateFunction::~DeveloperPrivateAutoUpdateFunction() {}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<developer::ItemInfo>
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeveloperPrivateGetItemsInfoFunction::CreateItemInfo(
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const Extension& item,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool item_is_enabled) {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::ItemInfo> info(new developer::ItemInfo());
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(profile());
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->id = item.id();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->name = item.name();
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->enabled = service->IsExtensionEnabled(info->id);
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->offline_enabled = OfflineEnabledInfo::IsOfflineEnabled(&item);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->version = item.VersionString();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->description = item.description();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url =
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExtensionIconSource::GetIconURL(&item,
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      extension_misc::EXTENSION_ICON_MEDIUM,
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      ExtensionIconSet::MATCH_BIGGER,
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      false,
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      NULL);
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  info->icon_url = url.spec();
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (item.is_app()) {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (item.is_legacy_packaged_app())
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = developer::ITEM_TYPE_LEGACY_PACKAGED_APP;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (item.is_hosted_app())
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = developer::ITEM_TYPE_HOSTED_APP;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (item.is_platform_app())
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = developer::ITEM_TYPE_PACKAGED_APP;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (item.is_theme()) {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->type = developer::ITEM_TYPE_THEME;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (item.is_extension()) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->type = developer::ITEM_TYPE_EXTENSION;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (Manifest::IsUnpackedLocation(item.location())) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->path.reset(
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new std::string(UTF16ToUTF8(item.path().LossyDisplayName())));
3023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    for (std::vector<extensions::InstallWarning>::const_iterator it =
3033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch             item.install_warnings().begin();
3043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch         it != item.install_warnings().end(); ++it) {
3053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      developer::InstallWarning* warning = new developer::InstallWarning();
3063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      warning->message = it->message;
3073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      info->install_warnings.push_back(make_linked_ptr(warning));
3083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->incognito_enabled = service->IsIncognitoEnabled(item.id());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->wants_file_access = item.wants_file_access();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->allow_file_access = service->AllowFileAccess(&item);
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->allow_reload = Manifest::IsUnpackedLocation(item.location());
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->is_unpacked = Manifest::IsUnpackedLocation(item.location());
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->terminated = service->terminated_extensions()->Contains(item.id());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->allow_incognito = item.can_be_incognito_enabled();
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->homepage_url.reset(new std::string(
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ManifestURL::GetHomepageURL(&item).spec()));
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ManifestURL::GetOptionsPage(&item).is_empty()) {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->options_url.reset(
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new std::string(ManifestURL::GetOptionsPage(&item).spec()));
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ManifestURL::GetUpdateURL(&item).is_empty()) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->update_url.reset(
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new std::string(ManifestURL::GetUpdateURL(&item).spec()));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (item.is_app()) {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->app_launch_url.reset(new std::string(
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        extensions::AppLaunchInfo::GetFullLaunchURL(&item).spec()));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->may_disable = system->management_policy()->
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UserMayModifySettings(&item, NULL);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->is_app = item.is_app();
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->views = GetInspectablePagesForExtension(&item, item_is_enabled);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return info.Pass();
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateGetItemsInfoFunction::
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetInspectablePagesForExtensionProcess(
346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        const Extension* extension,
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::set<content::RenderViewHost*>& views,
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ItemInspectViewList* result) {
349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool has_generated_background_page =
350424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      BackgroundInfo::HasGeneratedBackgroundPage(extension);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::set<content::RenderViewHost*>::const_iterator iter = views.begin();
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != views.end(); ++iter) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderViewHost* host = *iter;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents =
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::WebContents::FromRenderViewHost(host);
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ViewType host_type = GetViewType(web_contents);
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (VIEW_TYPE_EXTENSION_POPUP == host_type ||
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VIEW_TYPE_EXTENSION_DIALOG == host_type)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderProcessHost* process = host->GetProcess();
362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_background_page =
363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension));
364424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    result->push_back(constructInspectView(
365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        web_contents->GetURL(),
366424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetID(),
367424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        host->GetRoutingID(),
368424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetBrowserContext()->IsOffTheRecord(),
369424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        is_background_page && has_generated_background_page));
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateGetItemsInfoFunction::
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetShellWindowPagesForExtensionProfile(
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const Extension* extension,
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ItemInspectViewList* result) {
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShellWindowRegistry* registry = ShellWindowRegistry::Get(profile());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!registry) return;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const ShellWindowRegistry::ShellWindowList windows =
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry->GetShellWindowsForApp(extension->id());
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
383424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool has_generated_background_page =
384424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      BackgroundInfo::HasGeneratedBackgroundPage(extension);
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (ShellWindowRegistry::const_iterator it = windows.begin();
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != windows.end(); ++it) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents = (*it)->web_contents();
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewHost* host = web_contents->GetRenderViewHost();
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderProcessHost* process = host->GetProcess();
390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_background_page =
391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension));
392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    result->push_back(constructInspectView(
393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        web_contents->GetURL(),
394424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetID(),
395424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        host->GetRoutingID(),
396424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetBrowserContext()->IsOffTheRecord(),
397424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        is_background_page && has_generated_background_page));
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)linked_ptr<developer::ItemInspectView> DeveloperPrivateGetItemsInfoFunction::
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    constructInspectView(
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const GURL& url,
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int render_process_id,
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int render_view_id,
4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        bool incognito,
4073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        bool generated_background_page) {
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  linked_ptr<developer::ItemInspectView> view(new developer::ItemInspectView());
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (url.scheme() == kExtensionScheme) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No leading slash.
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->path = url.path().substr(1);
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For live pages, use the full URL.
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->path = url.spec();
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->render_process_id = render_process_id;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->render_view_id = render_view_id;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->incognito = incognito;
4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  view->generated_background_page = generated_background_page;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ItemInspectViewList DeveloperPrivateGetItemsInfoFunction::
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetInspectablePagesForExtension(
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const Extension* extension,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool extension_is_enabled) {
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ItemInspectViewList result;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the extension process's active views.
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionProcessManager* process_manager =
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionSystem::Get(profile())->process_manager();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetInspectablePagesForExtensionProcess(
435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      extension,
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      process_manager->GetRenderViewHostsForExtension(extension->id()),
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &result);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get shell window views
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShellWindowPagesForExtensionProfile(extension, &result);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Include a link to start the lazy background page, if applicable.
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (BackgroundInfo::HasLazyBackgroundPage(extension) &&
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_is_enabled &&
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !process_manager->GetBackgroundHostForExtension(extension->id())) {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result.push_back(constructInspectView(
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::GetBackgroundURL(extension),
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        false,
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::HasGeneratedBackgroundPage(extension)));
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Repeat for the incognito process, if applicable. Don't try to get
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // shell windows for incognito process.
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (service->profile()->HasOffTheRecordProfile() &&
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IncognitoInfo::IsSplitMode(extension)) {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    process_manager = ExtensionSystem::Get(
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        service->profile()->GetOffTheRecordProfile())->process_manager();
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetInspectablePagesForExtensionProcess(
462424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        extension,
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        process_manager->GetRenderViewHostsForExtension(extension->id()),
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &result);
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (BackgroundInfo::HasLazyBackgroundPage(extension) &&
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_is_enabled &&
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !process_manager->GetBackgroundHostForExtension(extension->id())) {
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result.push_back(constructInspectView(
4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::GetBackgroundURL(extension),
4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
4733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        false,
4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::HasGeneratedBackgroundPage(extension)));
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateGetItemsInfoFunction::RunImpl() {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::GetItemsInfo::Params> params(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      developer::GetItemsInfo::Params::Create(*args_));
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool include_disabled = params->include_disabled;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool include_terminated = params->include_terminated;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionSet items;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  items.InsertAll(*service->extensions());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (include_disabled) {
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items.InsertAll(*service->disabled_extensions());
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (include_terminated) {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items.InsertAll(*service->terminated_extensions());
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ItemInfoList item_list;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ExtensionSet::const_iterator iter = items.begin();
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != items.end(); ++iter) {
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const Extension& item = *iter->get();
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Don't show component extensions and invisible apps.
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (item.ShouldNotBeVisible())
51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      continue;
51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item_list.push_back(make_linked_ptr<developer::ItemInfo>(
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        CreateItemInfo(
51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            item, service->IsExtensionEnabled(item.id())).release()));
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  results_ = developer::GetItemsInfo::Results::Create(item_list);
519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(true);
520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateGetItemsInfoFunction::~DeveloperPrivateGetItemsInfoFunction() {}
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateAllowFileAccessFunction::RunImpl() {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AllowFileAccess::Params> params(
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AllowFileAccess::Params::Create(*args_));
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(user_gesture_);
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(profile());
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ManagementPolicy* management_policy = system->management_policy();
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(params->item_id);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = true;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!extension) {
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = false;
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (!management_policy->UserMayModifySettings(extension, NULL)) {
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Attempt to change allow file access of an extension that "
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << "non-usermanagable was made. Extension id : "
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << extension->id();
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = false;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->SetAllowFileAccess(extension, params->allow);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = true;
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAllowFileAccessFunction::
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~DeveloperPrivateAllowFileAccessFunction() {}
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateAllowIncognitoFunction::RunImpl() {
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AllowIncognito::Params> params(
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AllowIncognito::Params::Create(*args_));
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(params->item_id);
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = true;
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!extension)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = false;
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->SetIsIncognitoEnabled(extension->id(), params->allow);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAllowIncognitoFunction::
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~DeveloperPrivateAllowIncognitoFunction() {}
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateReloadFunction::RunImpl() {
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Reload::Params> params(Reload::Params::Create(*args_));
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(!params->item_id.empty());
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->ReloadExtension(params->item_id);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DeveloperPrivateShowPermissionsDialogFunction::RunImpl() {
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_));
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(!extension_id_.empty());
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShellWindowRegistry* registry = ShellWindowRegistry::Get(profile());
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(registry);
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShellWindow* shell_window = registry->GetShellWindowForRenderViewHost(
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_host());
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prompt_.reset(new ExtensionInstallPrompt(shell_window->web_contents()));
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(extension_id_);
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!extension)
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Released by InstallUIAbort or InstallUIProceed.
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddRef();
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<base::FilePath> retained_file_paths;
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (extension->HasAPIPermission(extensions::APIPermission::kFileSystem)) {
606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::vector<apps::SavedFileEntry> retained_file_entries =
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        apps::SavedFilesService::Get(profile())->GetAllFileEntries(
608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            extension_id_);
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < retained_file_entries.size(); i++) {
610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      retained_file_paths.push_back(retained_file_entries[i].path);
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prompt_->ReviewPermissions(this, extension, retained_file_paths);
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateReloadFunction::~DeveloperPrivateReloadFunction() {}
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This is called when the user clicks "Revoke File Access."
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateShowPermissionsDialogFunction::InstallUIProceed() {
621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  apps::SavedFilesService::Get(profile())->ClearQueue(
622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      profile()->GetExtensionService()->GetExtensionById(extension_id_, true));
623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (apps::AppRestoreService::Get(profile())->IsAppRestorable(extension_id_))
624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    apps::AppLoadService::Get(profile())->RestartApplication(extension_id_);
625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(true);
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Release();
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateShowPermissionsDialogFunction::InstallUIAbort(
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool user_initiated) {
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendResponse(true);
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Release();
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateShowPermissionsDialogFunction::
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeveloperPrivateShowPermissionsDialogFunction() {}
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateShowPermissionsDialogFunction::
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~DeveloperPrivateShowPermissionsDialogFunction() {}
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateEnableFunction::DeveloperPrivateEnableFunction() {}
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateEnableFunction::RunImpl() {
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Enable::Params> params(Enable::Params::Create(*args_));
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string extension_id = params->item_id;
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(profile());
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ManagementPolicy* management_policy = system->management_policy();
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(extension_id);
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!extension ||
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !management_policy->UserMayModifySettings(extension, NULL)) {
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Attempt to enable an extension that is non-usermanagable "
65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               "was made. Extension id: " << extension_id.c_str();
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->enable) {
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionPrefs* prefs = service->extension_prefs();
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (prefs->DidExtensionEscalatePermissions(extension_id)) {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShellWindowRegistry* registry = ShellWindowRegistry::Get(profile());
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CHECK(registry);
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShellWindow* shell_window = registry->GetShellWindowForRenderViewHost(
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          render_view_host());
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!shell_window) {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ShowExtensionDisabledDialog(
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          service, shell_window->web_contents(), extension);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if ((prefs->GetDisableReasons(extension_id) &
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Extension::DISABLE_UNSUPPORTED_REQUIREMENT) &&
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               !requirements_checker_.get()) {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Recheck the requirements.
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<const Extension> extension =
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          service->GetExtensionById(extension_id,
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     true );// include_disabled
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      requirements_checker_.reset(new RequirementsChecker);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Released by OnRequirementsChecked.
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddRef();
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      requirements_checker_->Check(
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          extension,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&DeveloperPrivateEnableFunction::OnRequirementsChecked,
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     this, extension_id));
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->EnableExtension(extension_id);
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Make sure any browser action contained within it is not hidden.
692b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ExtensionActionAPI::SetBrowserActionVisibility(
693b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          prefs, extension->id(), true);
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->DisableExtension(extension_id, Extension::DISABLE_USER_ACTION);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateEnableFunction::OnRequirementsChecked(
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string extension_id,
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<std::string> requirements_errors) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (requirements_errors.empty()) {
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionService* service = profile()->GetExtensionService();
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->EnableExtension(extension_id);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionErrorReporter::GetInstance()->ReportError(
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UTF8ToUTF16(JoinString(requirements_errors, ' ')),
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        true /* be noisy */);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateEnableFunction::~DeveloperPrivateEnableFunction() {}
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateInspectFunction::RunImpl() {
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::Inspect::Params> params(
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      developer::Inspect::Params::Create(*args_));
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const developer::InspectOptions& options = params->options;
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int render_process_id;
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(options.render_process_id, &render_process_id);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_process_id == -1) {
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is a lazy background page. Identify if it is a normal
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // or incognito background page.
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionService* service = profile()->GetExtensionService();
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (options.incognito)
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      service = ExtensionSystem::Get(
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          service->profile()->GetOffTheRecordProfile())->extension_service();
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Extension* extension = service->extensions()->GetByID(
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        options.extension_id);
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(extension);
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Wakes up the background page and  opens the inspect window.
73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    devtools_util::InspectBackgroundPage(extension, profile());
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int render_view_id;
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(options.render_view_id, &render_view_id);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderViewHost* host = content::RenderViewHost::FromID(
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_process_id, render_view_id);
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host) {
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This can happen if the host has gone away since the page was displayed.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DevToolsWindow::OpenDevToolsWindow(host);
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateInspectFunction::~DeveloperPrivateInspectFunction() {}
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateLoadUnpackedFunction::RunImpl() {
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 select_title =
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Balanced in FileSelected / FileSelectionCanceled.
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRef();
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = ShowPicker(
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SelectFileDialog::SELECT_FOLDER,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DeveloperPrivateAPI::Get(profile())->GetLastUnpackedDirectory(),
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      select_title,
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SelectFileDialog::FileTypeInfo(),
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateLoadUnpackedFunction::FileSelected(
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UnpackedInstaller::Create(service)->Load(path);
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeveloperPrivateAPI::Get(profile())->SetLastUnpackedDirectory(path);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateLoadUnpackedFunction::FileSelectionCanceled() {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateChooseEntryFunction::ShowPicker(
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::SelectFileDialog::Type picker_type,
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& last_directory,
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16& select_title,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::SelectFileDialog::FileTypeInfo& info,
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int file_type_index) {
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellWindowRegistry* registry = ShellWindowRegistry::Get(profile());
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(registry);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellWindow* shell_window = registry->GetShellWindowForRenderViewHost(
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host());
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!shell_window) {
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The entry picker will hold a reference to this function instance,
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and subsequent sending of the function response) until the user has
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // selected a file or cancelled the picker. At that point, the picker will
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delete itself.
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new EntryPicker(this, shell_window->web_contents(), picker_type,
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_directory, select_title, info, file_type_index);
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateChooseEntryFunction::RunImpl() { return false; }
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateChooseEntryFunction::~DeveloperPrivateChooseEntryFunction() {}
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivatePackDirectoryFunction::OnPackSuccess(
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& crx_file,
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& pem_file) {
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  developer::PackDirectoryResponse response;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response.message =
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      UTF16ToUTF8(PackExtensionJob::StandardSuccessMessage(crx_file, pem_file));
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response.status = developer::PACK_STATUS_SUCCESS;
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results_ = developer::PackDirectory::Results::Create(response);
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivatePackDirectoryFunction::OnPackFailure(
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& error,
827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionCreator::ErrorType error_type) {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  developer::PackDirectoryResponse response;
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response.message = error;
830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (error_type == ExtensionCreator::kCRXExists) {
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.item_path = item_path_str_;
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.pem_path = key_path_str_;
833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    response.override_flags = ExtensionCreator::kOverwriteCRX;
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_WARNING;
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_ERROR;
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results_ = developer::PackDirectory::Results::Create(response);
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivatePackDirectoryFunction::RunImpl() {
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PackDirectory::Params> params(
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PackDirectory::Params::Create(*args_));
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int flags = params->flags;
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item_path_str_ = params->path;
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_path_str_ = params->private_key_path;
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath root_directory =
85358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe(item_path_str_);
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath key_file = base::FilePath::FromUTF8Unsafe(key_path_str_);
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  developer::PackDirectoryResponse response;
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (root_directory.empty()) {
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (item_path_str_.empty())
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      response.message = l10n_util::GetStringUTF8(
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_REQUIRED);
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      response.message = l10n_util::GetStringUTF8(
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID);
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_ERROR;
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results_ = developer::PackDirectory::Results::Create(response);
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(true);
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!key_path_str_.empty() && key_file.empty()) {
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.message = l10n_util::GetStringUTF8(
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID);
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_ERROR;
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results_ = developer::PackDirectory::Results::Create(response);
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(true);
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Balanced in OnPackSuccess / OnPackFailure.
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRef();
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pack_job_ = new PackExtensionJob(this, root_directory, key_file, flags);
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pack_job_->Start();
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivatePackDirectoryFunction::DeveloperPrivatePackDirectoryFunction()
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){}
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivatePackDirectoryFunction::~DeveloperPrivatePackDirectoryFunction()
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){}
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateLoadUnpackedFunction::~DeveloperPrivateLoadUnpackedFunction() {}
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DeveloperPrivateExportSyncfsFolderToLocalfsFunction::RunImpl() {
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(grv) : add unittests.
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath::StringType project_name;
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &project_name));
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!ValidateFolderName(project_name)) {
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DLOG(INFO) << "Invalid project_name : [" << project_name << "]";
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  context_ = content::BrowserContext::GetStoragePartition(profile(),
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_host()->GetSiteInstance())->GetFileSystemContext();
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath project_path(profile()->GetPath());
910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  project_path = project_path.Append(kUnpackedAppsFolder);
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  project_path = project_path.Append(project_name);
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     ClearPrexistingDirectoryContent,
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 this,
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 project_path));
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ClearPrexistingDirectoryContent(const base::FilePath& project_path) {
924a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
925a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Clear the project directory before copying new files.
926a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::DeleteFile(project_path, true/*recursive*/);
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_ = 1;
929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 ReadSyncFileSystemDirectory,
933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 this, project_path, project_path.BaseName()));
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ReadSyncFileSystemDirectory(const base::FilePath& project_path,
938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const base::FilePath& destination_path) {
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string origin_url(
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Extension::GetBaseURLFromExtensionId(extension_id()).spec());
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fileapi::FileSystemURL url(sync_file_system::CreateSyncableFileSystemURL(
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(origin_url),
943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      destination_path));
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  context_->operation_runner()->ReadDirectory(
946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      url, base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ReadSyncFileSystemDirectoryCb,
948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      this, project_path, destination_path));
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReadSyncFileSystemDirectoryCb(
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& project_path,
954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const base::FilePath& destination_path,
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::PlatformFileError status,
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const fileapi::FileSystemOperation::FileEntryList& file_list,
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_more) {
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (status != base::PLATFORM_FILE_OK) {
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DLOG(ERROR) << "Error in copying files from sync filesystem.";
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We add 1 to the pending copy operations for both files and directories. We
965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // release the directory copy operation once all the files under the directory
966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // are added for copying. We do that to ensure that pendingCopyOperationsCount
967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // does not become zero before all copy operations are finished.
968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // In case the directory happens to be executing the last copy operation it
969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // will call SendResponse to send the response to the API. The pending copy
970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // operations of files are released by the CopyFile function.
971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_ += file_list.size();
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < file_list.size(); ++i) {
974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (file_list[i].is_directory) {
975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ReadSyncFileSystemDirectory(project_path.Append(file_list[i].name),
976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  destination_path.Append(file_list[i].name));
977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string origin_url(
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Extension::GetBaseURLFromExtensionId(extension_id()).spec());
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fileapi::FileSystemURL url(sync_file_system::CreateSyncableFileSystemURL(
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GURL(origin_url),
984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        destination_path.Append(file_list[i].name)));
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath target_path = project_path;
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    target_path = target_path.Append(file_list[i].name);
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    context_->operation_runner()->CreateSnapshotFile(
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        url,
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                SnapshotFileCallback,
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            this,
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            target_path));
995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Directory copy operation released here.
999eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_--;
1000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!pendingCopyOperationsCount_) {
1002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1003eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1004eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       SendResponse,
1005eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   this,
1006eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   success_));
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::SnapshotFileCallback(
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& target_path,
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::PlatformFileError result,
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::PlatformFileInfo& file_info,
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& src_path,
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) {
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (result != base::PLATFORM_FILE_OK) {
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetError("Error in copying files from sync filesystem.");
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    success_ = false;
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile,
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 this,
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 src_path,
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 target_path));
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile(
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& src_path,
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& target_path) {
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!file_util::CreateDirectory(target_path.DirName())) {
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetError("Error in copying files from sync filesystem.");
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    success_ = false;
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (success_)
10387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::CopyFile(src_path, target_path);
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1040eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(pendingCopyOperationsCount_ > 0);
1041eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_--;
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!pendingCopyOperationsCount_) {
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       SendResponse,
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   this,
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   success_));
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeveloperPrivateExportSyncfsFolderToLocalfsFunction()
1054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : pendingCopyOperationsCount_(0), success_(true) {}
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~DeveloperPrivateExportSyncfsFolderToLocalfsFunction() {}
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DeveloperPrivateLoadProjectFunction::RunImpl() {
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(grv) : add unit tests.
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath::StringType project_name;
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &project_name));
1063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!ValidateFolderName(project_name)) {
1064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DLOG(INFO) << "Invalid project_name : [" << project_name << "]";
1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath path(profile()->GetPath());
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  path = path.Append(kUnpackedAppsFolder);
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(grv) : Sanitize / check project_name.
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  path = path.Append(project_name);
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UnpackedInstaller::Create(service)->Load(path);
1074b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1075b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const ExtensionSet* extensions = service->extensions();
1076b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Released by GetUnpackedExtension.
1077b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  AddRef();
1078b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
1079b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::Bind(&DeveloperPrivateLoadProjectFunction::GetUnpackedExtension,
1080b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 this, path, extensions));
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1084b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeveloperPrivateLoadProjectFunction::GetUnpackedExtension(
1085b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const base::FilePath& path,
1086b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const ExtensionSet* extensions) {
1087b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const Extension* extension = GetExtensionByPath(extensions, path);
1088b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool success = true;
1089b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (extension) {
10903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SetResult(new base::StringValue(extension->id()));
1091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
1092b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    SetError("unable to load the project");
1093b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    success = false;
1094b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1095b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1096b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::Bind(&DeveloperPrivateLoadProjectFunction::SendResponse,
1097b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 this,
1098b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 success));
1099b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Release();
1100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateLoadProjectFunction::DeveloperPrivateLoadProjectFunction() {}
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateLoadProjectFunction::~DeveloperPrivateLoadProjectFunction() {}
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateChoosePathFunction::RunImpl() {
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::ChoosePath::Params> params(
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      developer::ChoosePath::Params::Create(*args_));
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::SelectFileDialog::Type type = ui::SelectFileDialog::SELECT_FOLDER;
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo info;
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->select_type == developer::SELECT_TYPE_FILE) {
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    type = ui::SelectFileDialog::SELECT_OPEN_FILE;
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 select_title;
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int file_type_index = 0;
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->file_type == developer::FILE_TYPE_LOAD)
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    select_title = l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY);
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (params->file_type== developer::FILE_TYPE_PEM) {
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    select_title = l10n_util::GetStringUTF16(
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_EXTENSION_PACK_DIALOG_SELECT_KEY);
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.extensions.push_back(std::vector<base::FilePath::StringType>());
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.extensions.front().push_back(FILE_PATH_LITERAL("pem"));
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.extension_description_overrides.push_back(
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION));
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.include_all_files = true;
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_type_index = 1;
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Balanced by FileSelected / FileSelectionCanceled.
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRef();
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = ShowPicker(
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type,
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DeveloperPrivateAPI::Get(profile())->GetLastUnpackedDirectory(),
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      select_title,
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info,
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file_type_index);
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateChoosePathFunction::FileSelected(
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
114958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetResult(new base::StringValue(UTF16ToUTF8(path.LossyDisplayName())));
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateChoosePathFunction::FileSelectionCanceled() {
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateChoosePathFunction::~DeveloperPrivateChoosePathFunction() {}
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateGetStringsFunction::RunImpl() {
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue();
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(dict);
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
116590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  webui::SetFontAndTextDirection(dict);
116690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #define   SET_STRING(id, idr) \
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dict->SetString(id, l10n_util::GetStringUTF16(idr))
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettings", IDS_MANAGE_EXTENSIONS_SETTING_WINDOWS_TITLE);
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SET_STRING("appsDevtoolSearch", IDS_APPS_DEVTOOL_SEARCH);
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SET_STRING("appsDevtoolApps", IDS_APPS_DEVTOOL_APPS_INSTALLED);
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SET_STRING("appsDevtoolExtensions", IDS_APPS_DEVTOOL_EXTENSIONS_INSTALLED);
117490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SET_STRING("appsDevtoolNoExtensions", IDS_EXTENSIONS_NONE_INSTALLED);
117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SET_STRING("appsDevtoolUnpacked", IDS_APPS_DEVTOOL_UNPACKED_INSTALLED);
1176fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  SET_STRING("appsDevtoolInstalled", IDS_APPS_DEVTOOL_INSTALLED);
1177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoPackedApps", IDS_APPS_DEVTOOL_NO_PACKED_APPS);
1178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoUnpackedApps", IDS_APPS_DEVTOOL_NO_UNPACKED_APPS);
1179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoPackedExtensions",
1180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_NO_PACKED_EXTENSIONS);
1181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoUnpackedExtensions",
1182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_NO_UNPACKED_EXTENSIONS);
1183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolUpdating", IDS_APPS_DEVTOOL_UPDATING);
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsGetMoreExtensions", IDS_GET_MORE_EXTENSIONS);
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsExtensionId", IDS_EXTENSIONS_ID);
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsExtensionPath", IDS_EXTENSIONS_PATH);
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsInspectViews", IDS_EXTENSIONS_INSPECT_VIEWS);
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsInstallWarnings",
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_INSTALL_WARNINGS);
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("viewIncognito", IDS_EXTENSIONS_VIEW_INCOGNITO);
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("viewInactive", IDS_EXTENSIONS_VIEW_INACTIVE);
11923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("backgroundPage", IDS_EXTENSIONS_BACKGROUND_PAGE);
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsEnable", IDS_EXTENSIONS_ENABLE);
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsEnabled", IDS_EXTENSIONS_ENABLED);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsRemove", IDS_EXTENSIONS_REMOVE);
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsEnableIncognito",
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_ENABLE_INCOGNITO);
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsAllowFileAccess",
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_ALLOW_FILE_ACCESS);
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsReloadTerminated",
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_RELOAD_TERMINATED);
12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("extensionSettingsReloadUnpacked",
12033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)             IDS_APPS_DEV_TOOLS_RELOAD_UNPACKED);
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsLaunch", IDS_EXTENSIONS_LAUNCH);
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsOptions", IDS_EXTENSIONS_OPTIONS_LINK);
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsPermissions", IDS_EXTENSIONS_PERMISSIONS_LINK);
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsVisitWebsite", IDS_EXTENSIONS_VISIT_WEBSITE);
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsVisitWebStore", IDS_EXTENSIONS_VISIT_WEBSTORE);
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsPolicyControlled",
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_POLICY_CONTROLLED);
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsManagedMode",
1212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             IDS_EXTENSIONS_LOCKED_MANAGED_USER);
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsShowButton", IDS_EXTENSIONS_SHOW_BUTTON);
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("appsDevtoolLoadUnpackedButton",
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_APPS_DEVTOOL_LOAD_UNPACKED_BUTTON);
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("appsDevtoolPackButton", IDS_APPS_DEVTOOL_PACK_BUTTON);
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsCommandsLink",
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_COMMANDS_CONFIGURE);
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("appsDevtoolUpdateButton", IDS_APPS_DEVTOOL_UPDATE_BUTTON);
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsWarningsTitle", IDS_EXTENSION_WARNINGS_TITLE);
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsShowDetails", IDS_EXTENSIONS_SHOW_DETAILS);
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsHideDetails", IDS_EXTENSIONS_HIDE_DETAILS);
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionUninstall", IDS_EXTENSIONS_UNINSTALL);
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionsPermissionsHeading",
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_PERMISSIONS_HEADING);
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionsPermissionsClose", IDS_EXTENSIONS_PERMISSIONS_CLOSE);
12277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionDisabled", IDS_EXTENSIONS_DISABLED);
12287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsShowLogsButton", IDS_EXTENSIONS_SHOW_LOGS);
12297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsMoreDetailsButton", IDS_EXTENSIONS_MORE_DETAILS);
12307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsVersion", IDS_EXTENSIONS_VERSION);
1231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("extensionSettingsDelete", IDS_EXTENSIONS_ADT_DELETE);
12327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsPack", IDS_EXTENSIONS_PACK);
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Pack Extension strings
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionOverlay", IDS_EXTENSION_PACK_DIALOG_TITLE);
12367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("packExtensionHeading", IDS_EXTENSION_ADT_PACK_DIALOG_HEADING);
12373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("packButton", IDS_EXTENSION_ADT_PACK_BUTTON);
1238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("ok", IDS_OK);
1239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("cancel", IDS_CANCEL);
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionRootDir",
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     IDS_EXTENSION_PACK_DIALOG_ROOT_DIRECTORY_LABEL);
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionPrivateKey",
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     IDS_EXTENSION_PACK_DIALOG_PRIVATE_KEY_LABEL);
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionBrowseButton", IDS_EXTENSION_PACK_DIALOG_BROWSE);
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionProceedAnyway", IDS_EXTENSION_PROCEED_ANYWAY);
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionWarningTitle", IDS_EXTENSION_PACK_WARNING_TITLE);
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionErrorTitle", IDS_EXTENSION_PACK_ERROR_TITLE);
12483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("packAppOverlay", IDS_EXTENSION_PACK_APP_DIALOG_TITLE);
12493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("packAppHeading", IDS_EXTENSION_ADT_PACK_APP_DIALOG_HEADING);
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Delete confirmation dialog.
1252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationDeleteButton",
1253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_BUTTON);
1254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationTitle",
1255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_TITLE);
1256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationMessageApp",
1257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_MESSAGE_APP);
1258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationMessageExtension",
1259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_MESSAGE_EXTENSION);
1260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Dialog when profile is managed.
1262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("managedProfileDialogCloseButton",
1263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IDS_APPS_DEVTOOL_MANAGED_PROFILE_DIALOG_CLOSE_BUTTON);
1264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("managedProfileDialogTitle",
1265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IDS_APPS_DEVTOOL_MANAGED_PROFILE_DIALOG_TITLE);
1266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("managedProfileDialogDescription",
1267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IDS_APPS_DEVTOOL_MANAGED_PROFILE_DIALOG_DESCRIPTION);
1268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #undef   SET_STRING
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateGetStringsFunction::~DeveloperPrivateGetStringsFunction() {}
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool DeveloperPrivateIsProfileManagedFunction::RunImpl() {
1276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SetResult(new base::FundamentalValue(profile_->IsManaged()));
1277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return true;
1278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1279424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)DeveloperPrivateIsProfileManagedFunction::
1281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ~DeveloperPrivateIsProfileManagedFunction() {
1282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace api
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions
1287