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"
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.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"
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/icons_handler.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h"
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/url_constants.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/site_instance.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/storage_partition.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/management_policy.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h"
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "extensions/common/install_warning.h"
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/background_info.h"
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/incognito_info.h"
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/offline_enabled_info.h"
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h"
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "grit/theme_resources.h"
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_util.h"
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/browser/fileapi/file_system_context.h"
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation.h"
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h"
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/blob/shareable_file_reference.h"
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing apps::ShellWindow;
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing apps::ShellWindowRegistry;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::RenderViewHost;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace developer_private = api::developer_private;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kUnpackedAppsFolder[]
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    = FILE_PATH_LITERAL("apps_target");
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ExtensionUpdater* GetExtensionUpdater(Profile* profile) {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return profile->GetExtensionService()->updater();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)GURL GetImageURLFromData(std::string contents) {
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string contents_base64;
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(contents, &contents_base64);
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // TODO(dvh): make use of chrome::kDataScheme. Filed as crbug/297301.
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const char kDataURLPrefix[] = "data:image;base64,";
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return GURL(kDataURLPrefix + contents_base64);
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)GURL GetDefaultImageURL(developer_private::ItemType type) {
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int icon_resource_id;
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (type) {
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case developer::ITEM_TYPE_LEGACY_PACKAGED_APP:
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case developer::ITEM_TYPE_HOSTED_APP:
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case developer::ITEM_TYPE_PACKAGED_APP:
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      icon_resource_id = IDR_APP_DEFAULT_ICON;
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    default:
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      icon_resource_id = IDR_EXTENSION_DEFAULT_ICON;
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return GetImageURLFromData(
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          icon_resource_id, ui::SCALE_FACTOR_100P).as_string());
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// TODO(dvh): This code should be refactored and moved to
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// extensions::ImageLoader. Also a resize should be performed to avoid
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// potential huge URLs: crbug/297298.
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)GURL ToDataURL(const base::FilePath& path, developer_private::ItemType type) {
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string contents;
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (path.empty() || !base::ReadFileToString(path, &contents))
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return GetDefaultImageURL(type);
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return GetImageURLFromData(contents);
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ValidateFolderName(const base::FilePath::StringType& name) {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath::StringType name_sanitized(name);
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  file_util::ReplaceIllegalCharactersInPath(&name_sanitized, '_');
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return name == name_sanitized;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const Extension* GetExtensionByPath(const ExtensionSet* extensions,
134b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                    const base::FilePath& path) {
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::FilePath extension_path = base::MakeAbsoluteFilePath(path);
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  for (ExtensionSet::const_iterator iter = extensions->begin();
137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)       iter != extensions->end(); ++iter) {
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if ((*iter)->path() == extension_path)
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return iter->get();
140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return NULL;
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string GetExtensionID(const RenderViewHost* render_view_host) {
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!render_view_host->GetSiteInstance())
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return std::string();
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return render_view_host->GetSiteInstance()->GetSiteURL().host();
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace AllowFileAccess = api::developer_private::AllowFileAccess;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace AllowIncognito = api::developer_private::AllowIncognito;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ChoosePath = api::developer_private::ChoosePath;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Enable = api::developer_private::Enable;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace GetItemsInfo = api::developer_private::GetItemsInfo;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Inspect = api::developer_private::Inspect;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace PackDirectory = api::developer_private::PackDirectory;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Reload = api::developer_private::Reload;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAPI* DeveloperPrivateAPI::Get(Profile* profile) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return DeveloperPrivateAPIFactory::GetForProfile(profile);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDeveloperPrivateAPI::DeveloperPrivateAPI(Profile* profile) : profile_(profile) {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RegisterNotifications();
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDeveloperPrivateEventRouter::DeveloperPrivateEventRouter(Profile* profile)
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch: profile_(profile) {
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int types[] = {
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_INSTALLED,
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_LOADED,
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_UNLOADED,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED,
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(registrar_.IsEmpty());
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < arraysize(types); ++i) {
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    registrar_.Add(this,
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   types[i],
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   content::Source<Profile>(profile_));
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDeveloperPrivateEventRouter::~DeveloperPrivateEventRouter() {}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeveloperPrivateEventRouter::Observe(
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationDetails& details) {
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const char* event_name = NULL;
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Profile* profile = content::Source<Profile>(source).ptr();
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(profile);
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(profile_->IsSameProfile(profile));
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  developer::EventData event_data;
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const Extension* extension = NULL;
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_INSTALLED:
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_INSTALLED;
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension =
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const InstalledExtensionInfo>(details)->extension;
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_UNINSTALLED:
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_UNINSTALLED;
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension = content::Details<const Extension>(details).ptr();
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_LOADED:
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_LOADED;
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension = content::Details<const Extension>(details).ptr();
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_UNLOADED:
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_UNLOADED;
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      extension =
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const UnloadedExtensionInfo>(details)->extension;
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED:
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_VIEW_UNREGISTERED;
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.item_id = GetExtensionID(
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const RenderViewHost>(details).ptr());
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED:
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.event_type = developer::EVENT_TYPE_VIEW_REGISTERED;
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      event_data.item_id = GetExtensionID(
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          content::Details<const RenderViewHost>(details).ptr());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (extension)
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    event_data.item_id = extension->id();
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ListValue> args(new ListValue());
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  args->Append(event_data.ToValue().release());
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  event_name = developer_private::OnItemStateChanged::kEventName;
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<Event> event(new Event(event_name, args.Pass()));
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass());
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateAPI::SetLastUnpackedDirectory(const base::FilePath& path) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_unpacked_directory_ = path;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateAPI::RegisterNotifications() {
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      this, developer_private::OnItemStateChanged::kEventName);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAPI::~DeveloperPrivateAPI() {}
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateAPI::Shutdown() {}
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeveloperPrivateAPI::OnListenerAdded(
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const EventListenerInfo& details) {
263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!developer_private_event_router_)
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    developer_private_event_router_.reset(
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new DeveloperPrivateEventRouter(profile_));
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DeveloperPrivateAPI::OnListenerRemoved(
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const EventListenerInfo& details) {
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!ExtensionSystem::Get(profile_)->event_router()->HasEventListener(
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          developer_private::OnItemStateChanged::kEventName))
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    developer_private_event_router_.reset(NULL);
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace api {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateAutoUpdateFunction::RunImpl() {
2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionUpdater* updater = GetExtensionUpdater(GetProfile());
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (updater)
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    updater->CheckNow(ExtensionUpdater::CheckParams());
2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SetResult(new base::FundamentalValue(true));
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAutoUpdateFunction::~DeveloperPrivateAutoUpdateFunction() {}
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<developer::ItemInfo>
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeveloperPrivateGetItemsInfoFunction::CreateItemInfo(
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const Extension& item,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool item_is_enabled) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::ItemInfo> info(new developer::ItemInfo());
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(GetProfile());
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->id = item.id();
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->name = item.name();
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->enabled = service->IsExtensionEnabled(info->id);
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->offline_enabled = OfflineEnabledInfo::IsOfflineEnabled(&item);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->version = item.VersionString();
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->description = item.description();
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (item.is_app()) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (item.is_legacy_packaged_app())
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = developer::ITEM_TYPE_LEGACY_PACKAGED_APP;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (item.is_hosted_app())
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = developer::ITEM_TYPE_HOSTED_APP;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (item.is_platform_app())
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = developer::ITEM_TYPE_PACKAGED_APP;
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (item.is_theme()) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->type = developer::ITEM_TYPE_THEME;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (item.is_extension()) {
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->type = developer::ITEM_TYPE_EXTENSION;
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (Manifest::IsUnpackedLocation(item.location())) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->path.reset(
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new std::string(UTF16ToUTF8(item.path().LossyDisplayName())));
3233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    for (std::vector<extensions::InstallWarning>::const_iterator it =
3243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch             item.install_warnings().begin();
3253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch         it != item.install_warnings().end(); ++it) {
3263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      developer::InstallWarning* warning = new developer::InstallWarning();
3273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      warning->message = it->message;
3283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      info->install_warnings.push_back(make_linked_ptr(warning));
3293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  info->incognito_enabled =
3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      extension_util::IsIncognitoEnabled(item.id(),service);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->wants_file_access = item.wants_file_access();
3358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  info->allow_file_access = extension_util::AllowFileAccess(&item, service);
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->allow_reload = Manifest::IsUnpackedLocation(item.location());
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->is_unpacked = Manifest::IsUnpackedLocation(item.location());
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->terminated = service->terminated_extensions()->Contains(item.id());
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->allow_incognito = item.can_be_incognito_enabled();
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->homepage_url.reset(new std::string(
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ManifestURL::GetHomepageURL(&item).spec()));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ManifestURL::GetOptionsPage(&item).is_empty()) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->options_url.reset(
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new std::string(ManifestURL::GetOptionsPage(&item).spec()));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ManifestURL::GetUpdateURL(&item).is_empty()) {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->update_url.reset(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new std::string(ManifestURL::GetUpdateURL(&item).spec()));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (item.is_app()) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->app_launch_url.reset(new std::string(
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        extensions::AppLaunchInfo::GetFullLaunchURL(&item).spec()));
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->may_disable = system->management_policy()->
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UserMayModifySettings(&item, NULL);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->is_app = item.is_app();
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info->views = GetInspectablePagesForExtension(&item, item_is_enabled);
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return info.Pass();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread(
36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ItemInfoList item_list,
36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const std::map<std::string, ExtensionResource> idToIcon) {
36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (ItemInfoList::iterator iter = item_list.begin();
37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)       iter != item_list.end(); ++iter) {
37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    developer_private::ItemInfo* info = iter->get();
37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::map<std::string, ExtensionResource>::const_iterator resource_ptr
37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        = idToIcon.find(info->id);
37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (resource_ptr != idToIcon.end()) {
37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      info->icon_url =
37668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          ToDataURL(resource_ptr->second.GetFilePath(), info->type).spec();
37768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
37968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
38068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  results_ = developer::GetItemsInfo::Results::Create(item_list);
38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::Bind(&DeveloperPrivateGetItemsInfoFunction::SendResponse,
38368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 this,
38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 true));
38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateGetItemsInfoFunction::
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetInspectablePagesForExtensionProcess(
389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        const Extension* extension,
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::set<content::RenderViewHost*>& views,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ItemInspectViewList* result) {
392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool has_generated_background_page =
393424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      BackgroundInfo::HasGeneratedBackgroundPage(extension);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::set<content::RenderViewHost*>::const_iterator iter = views.begin();
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != views.end(); ++iter) {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderViewHost* host = *iter;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents =
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::WebContents::FromRenderViewHost(host);
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ViewType host_type = GetViewType(web_contents);
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (VIEW_TYPE_EXTENSION_POPUP == host_type ||
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        VIEW_TYPE_EXTENSION_DIALOG == host_type)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderProcessHost* process = host->GetProcess();
405424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_background_page =
406424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension));
407424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    result->push_back(constructInspectView(
408424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        web_contents->GetURL(),
409424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetID(),
410424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        host->GetRoutingID(),
411424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetBrowserContext()->IsOffTheRecord(),
412424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        is_background_page && has_generated_background_page));
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateGetItemsInfoFunction::
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetShellWindowPagesForExtensionProfile(
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const Extension* extension,
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ItemInspectViewList* result) {
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ShellWindowRegistry* registry = ShellWindowRegistry::Get(GetProfile());
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!registry) return;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const ShellWindowRegistry::ShellWindowList windows =
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry->GetShellWindowsForApp(extension->id());
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
426424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool has_generated_background_page =
427424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      BackgroundInfo::HasGeneratedBackgroundPage(extension);
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (ShellWindowRegistry::const_iterator it = windows.begin();
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != windows.end(); ++it) {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents = (*it)->web_contents();
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewHost* host = web_contents->GetRenderViewHost();
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderProcessHost* process = host->GetProcess();
433424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool is_background_page =
434424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension));
435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    result->push_back(constructInspectView(
436424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        web_contents->GetURL(),
437424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetID(),
438424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        host->GetRoutingID(),
439424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        process->GetBrowserContext()->IsOffTheRecord(),
440424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        is_background_page && has_generated_background_page));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)linked_ptr<developer::ItemInspectView> DeveloperPrivateGetItemsInfoFunction::
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    constructInspectView(
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const GURL& url,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int render_process_id,
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int render_view_id,
4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        bool incognito,
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        bool generated_background_page) {
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  linked_ptr<developer::ItemInspectView> view(new developer::ItemInspectView());
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (url.scheme() == kExtensionScheme) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No leading slash.
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->path = url.path().substr(1);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For live pages, use the full URL.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->path = url.spec();
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->render_process_id = render_process_id;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->render_view_id = render_view_id;
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->incognito = incognito;
4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  view->generated_background_page = generated_background_page;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ItemInspectViewList DeveloperPrivateGetItemsInfoFunction::
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetInspectablePagesForExtension(
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const Extension* extension,
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool extension_is_enabled) {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ItemInspectViewList result;
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the extension process's active views.
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ProcessManager* process_manager =
4761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ExtensionSystem::Get(GetProfile())->process_manager();
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetInspectablePagesForExtensionProcess(
478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      extension,
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      process_manager->GetRenderViewHostsForExtension(extension->id()),
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &result);
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get shell window views
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShellWindowPagesForExtensionProfile(extension, &result);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Include a link to start the lazy background page, if applicable.
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (BackgroundInfo::HasLazyBackgroundPage(extension) &&
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_is_enabled &&
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !process_manager->GetBackgroundHostForExtension(extension->id())) {
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result.push_back(constructInspectView(
4903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::GetBackgroundURL(extension),
4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
4933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        false,
4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::HasGeneratedBackgroundPage(extension)));
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Repeat for the incognito process, if applicable. Don't try to get
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // shell windows for incognito process.
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (service->profile()->HasOffTheRecordProfile() &&
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IncognitoInfo::IsSplitMode(extension)) {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    process_manager = ExtensionSystem::Get(
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        service->profile()->GetOffTheRecordProfile())->process_manager();
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetInspectablePagesForExtensionProcess(
505424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        extension,
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        process_manager->GetRenderViewHostsForExtension(extension->id()),
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &result);
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (BackgroundInfo::HasLazyBackgroundPage(extension) &&
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extension_is_enabled &&
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !process_manager->GetBackgroundHostForExtension(extension->id())) {
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result.push_back(constructInspectView(
5133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::GetBackgroundURL(extension),
5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        -1,
5163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        false,
5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        BackgroundInfo::HasGeneratedBackgroundPage(extension)));
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateGetItemsInfoFunction::RunImpl() {
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::GetItemsInfo::Params> params(
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      developer::GetItemsInfo::Params::Create(*args_));
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool include_disabled = params->include_disabled;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool include_terminated = params->include_terminated;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionSet items;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  items.InsertAll(*service->extensions());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (include_disabled) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items.InsertAll(*service->disabled_extensions());
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (include_terminated) {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items.InsertAll(*service->terminated_extensions());
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::map<std::string, ExtensionResource> id_to_icon;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ItemInfoList item_list;
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (ExtensionSet::const_iterator iter = items.begin();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != items.end(); ++iter) {
5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const Extension& item = *iter->get();
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ExtensionResource item_resource =
55468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        IconsInfo::GetIconResource(&item,
55568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                   extension_misc::EXTENSION_ICON_MEDIUM,
55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                   ExtensionIconSet::MATCH_BIGGER);
55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    id_to_icon[item.id()] = item_resource;
55868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Don't show component extensions and invisible apps.
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (item.ShouldNotBeVisible())
56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      continue;
56290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item_list.push_back(make_linked_ptr<developer::ItemInfo>(
56490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        CreateItemInfo(
56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            item, service->IsExtensionEnabled(item.id())).release()));
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
56868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
56968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::Bind(&DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread,
57068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 this,
57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 item_list,
57268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 id_to_icon));
573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateGetItemsInfoFunction::~DeveloperPrivateGetItemsInfoFunction() {}
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateAllowFileAccessFunction::RunImpl() {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AllowFileAccess::Params> params(
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AllowFileAccess::Params::Create(*args_));
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(user_gesture_);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(GetProfile());
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ManagementPolicy* management_policy = system->management_policy();
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(params->item_id);
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = true;
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!extension) {
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = false;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (!management_policy->UserMayModifySettings(extension, NULL)) {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(ERROR) << "Attempt to change allow file access of an extension that "
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << "non-usermanagable was made. Extension id : "
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << extension->id();
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = false;
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    extension_util::SetAllowFileAccess(extension, service, params->allow);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = true;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAllowFileAccessFunction::
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~DeveloperPrivateAllowFileAccessFunction() {}
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateAllowIncognitoFunction::RunImpl() {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AllowIncognito::Params> params(
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AllowIncognito::Params::Create(*args_));
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(params->item_id);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = true;
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!extension)
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = false;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
6228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    extension_util::SetIsIncognitoEnabled(
6238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        extension->id(),service, params->allow);
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateAllowIncognitoFunction::
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~DeveloperPrivateAllowIncognitoFunction() {}
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateReloadFunction::RunImpl() {
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Reload::Params> params(Reload::Params::Create(*args_));
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(!params->item_id.empty());
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  service->ReloadExtension(params->item_id);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DeveloperPrivateShowPermissionsDialogFunction::RunImpl() {
643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id_));
6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(!extension_id_.empty());
6461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ShellWindowRegistry* registry = ShellWindowRegistry::Get(GetProfile());
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(registry);
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShellWindow* shell_window = registry->GetShellWindowForRenderViewHost(
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_view_host());
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prompt_.reset(new ExtensionInstallPrompt(shell_window->web_contents()));
651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(extension_id_);
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!extension)
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Released by InstallUIAbort or InstallUIProceed.
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddRef();
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::vector<base::FilePath> retained_file_paths;
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (extension->HasAPIPermission(extensions::APIPermission::kFileSystem)) {
660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::vector<apps::SavedFileEntry> retained_file_entries =
6611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        apps::SavedFilesService::Get(GetProfile())
6621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            ->GetAllFileEntries(extension_id_);
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t i = 0; i < retained_file_entries.size(); i++) {
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      retained_file_paths.push_back(retained_file_entries[i].path);
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prompt_->ReviewPermissions(this, extension, retained_file_paths);
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateReloadFunction::~DeveloperPrivateReloadFunction() {}
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This is called when the user clicks "Revoke File Access."
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateShowPermissionsDialogFunction::InstallUIProceed() {
6751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  apps::SavedFilesService::Get(GetProfile())
6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ->ClearQueue(GetProfile()->GetExtensionService()->GetExtensionById(
6771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            extension_id_, true));
6781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (apps::AppRestoreService::Get(GetProfile())
6791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          ->IsAppRestorable(extension_id_))
6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    apps::AppLoadService::Get(GetProfile())->RestartApplication(extension_id_);
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendResponse(true);
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Release();
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateShowPermissionsDialogFunction::InstallUIAbort(
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool user_initiated) {
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendResponse(true);
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Release();
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateShowPermissionsDialogFunction::
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeveloperPrivateShowPermissionsDialogFunction() {}
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateShowPermissionsDialogFunction::
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~DeveloperPrivateShowPermissionsDialogFunction() {}
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateEnableFunction::DeveloperPrivateEnableFunction() {}
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateEnableFunction::RunImpl() {
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Enable::Params> params(Enable::Params::Create(*args_));
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string extension_id = params->item_id;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(GetProfile());
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManagementPolicy* policy = system->management_policy();
7071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Extension* extension = service->GetInstalledExtension(extension_id);
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!extension) {
711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LOG(ERROR) << "Did not find extension with id " << extension_id;
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool enable = params->enable;
715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!policy->UserMayModifySettings(extension, NULL) ||
716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      (!enable && policy->MustRemainEnabled(extension, NULL)) ||
717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      (enable && policy->MustRemainDisabled(extension, NULL, NULL))) {
718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LOG(ERROR) << "Attempt to change enable state denied by management policy. "
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               << "Extension id: " << extension_id.c_str();
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (enable) {
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionPrefs* prefs = service->extension_prefs();
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (prefs->DidExtensionEscalatePermissions(extension_id)) {
7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShellWindowRegistry* registry = ShellWindowRegistry::Get(GetProfile());
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CHECK(registry);
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShellWindow* shell_window = registry->GetShellWindowForRenderViewHost(
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          render_view_host());
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!shell_window) {
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ShowExtensionDisabledDialog(
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          service, shell_window->web_contents(), extension);
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if ((prefs->GetDisableReasons(extension_id) &
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Extension::DISABLE_UNSUPPORTED_REQUIREMENT) &&
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               !requirements_checker_.get()) {
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Recheck the requirements.
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_refptr<const Extension> extension =
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          service->GetExtensionById(extension_id,
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     true );// include_disabled
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      requirements_checker_.reset(new RequirementsChecker);
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Released by OnRequirementsChecked.
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AddRef();
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      requirements_checker_->Check(
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          extension,
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&DeveloperPrivateEnableFunction::OnRequirementsChecked,
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     this, extension_id));
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->EnableExtension(extension_id);
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Make sure any browser action contained within it is not hidden.
754b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ExtensionActionAPI::SetBrowserActionVisibility(
755b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          prefs, extension->id(), true);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->DisableExtension(extension_id, Extension::DISABLE_USER_ACTION);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateEnableFunction::OnRequirementsChecked(
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string extension_id,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<std::string> requirements_errors) {
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (requirements_errors.empty()) {
7671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ExtensionService* service = GetProfile()->GetExtensionService();
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service->EnableExtension(extension_id);
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionErrorReporter::GetInstance()->ReportError(
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UTF8ToUTF16(JoinString(requirements_errors, ' ')),
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        true /* be noisy */);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateEnableFunction::~DeveloperPrivateEnableFunction() {}
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateInspectFunction::RunImpl() {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::Inspect::Params> params(
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      developer::Inspect::Params::Create(*args_));
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const developer::InspectOptions& options = params->options;
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int render_process_id;
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(options.render_process_id, &render_process_id);
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_process_id == -1) {
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is a lazy background page. Identify if it is a normal
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // or incognito background page.
7911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ExtensionService* service = GetProfile()->GetExtensionService();
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (options.incognito)
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      service = ExtensionSystem::Get(
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          service->profile()->GetOffTheRecordProfile())->extension_service();
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Extension* extension = service->extensions()->GetByID(
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        options.extension_id);
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(extension);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Wakes up the background page and  opens the inspect window.
7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    devtools_util::InspectBackgroundPage(extension, GetProfile());
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int render_view_id;
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringToInt(options.render_view_id, &render_view_id);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderViewHost* host = content::RenderViewHost::FromID(
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_process_id, render_view_id);
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!host) {
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This can happen if the host has gone away since the page was displayed.
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DevToolsWindow::OpenDevToolsWindow(host);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateInspectFunction::~DeveloperPrivateInspectFunction() {}
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateLoadUnpackedFunction::RunImpl() {
820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 select_title =
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Balanced in FileSelected / FileSelectionCanceled.
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRef();
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = ShowPicker(
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SelectFileDialog::SELECT_FOLDER,
8271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DeveloperPrivateAPI::Get(GetProfile())->GetLastUnpackedDirectory(),
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      select_title,
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SelectFileDialog::FileTypeInfo(),
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0);
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateLoadUnpackedFunction::FileSelected(
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
8361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UnpackedInstaller::Create(service)->Load(path);
8381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DeveloperPrivateAPI::Get(GetProfile())->SetLastUnpackedDirectory(path);
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateLoadUnpackedFunction::FileSelectionCanceled() {
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateChooseEntryFunction::ShowPicker(
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::SelectFileDialog::Type picker_type,
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& last_directory,
851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& select_title,
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ui::SelectFileDialog::FileTypeInfo& info,
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int file_type_index) {
8541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ShellWindowRegistry* registry = ShellWindowRegistry::Get(GetProfile());
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(registry);
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellWindow* shell_window = registry->GetShellWindowForRenderViewHost(
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_view_host());
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!shell_window) {
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The entry picker will hold a reference to this function instance,
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and subsequent sending of the function response) until the user has
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // selected a file or cancelled the picker. At that point, the picker will
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delete itself.
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new EntryPicker(this, shell_window->web_contents(), picker_type,
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_directory, select_title, info, file_type_index);
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateChooseEntryFunction::RunImpl() { return false; }
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateChooseEntryFunction::~DeveloperPrivateChooseEntryFunction() {}
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivatePackDirectoryFunction::OnPackSuccess(
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& crx_file,
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& pem_file) {
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  developer::PackDirectoryResponse response;
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response.message =
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      UTF16ToUTF8(PackExtensionJob::StandardSuccessMessage(crx_file, pem_file));
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response.status = developer::PACK_STATUS_SUCCESS;
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results_ = developer::PackDirectory::Results::Create(response);
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivatePackDirectoryFunction::OnPackFailure(
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& error,
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionCreator::ErrorType error_type) {
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  developer::PackDirectoryResponse response;
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  response.message = error;
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (error_type == ExtensionCreator::kCRXExists) {
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.item_path = item_path_str_;
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.pem_path = key_path_str_;
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    response.override_flags = ExtensionCreator::kOverwriteCRX;
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_WARNING;
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_ERROR;
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results_ = developer::PackDirectory::Results::Create(response);
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivatePackDirectoryFunction::RunImpl() {
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PackDirectory::Params> params(
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PackDirectory::Params::Create(*args_));
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get());
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int flags = params->flags;
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  item_path_str_ = params->path;
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  key_path_str_ = params->private_key_path;
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath root_directory =
91558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe(item_path_str_);
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
91758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath key_file = base::FilePath::FromUTF8Unsafe(key_path_str_);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  developer::PackDirectoryResponse response;
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (root_directory.empty()) {
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (item_path_str_.empty())
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      response.message = l10n_util::GetStringUTF8(
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_REQUIRED);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      response.message = l10n_util::GetStringUTF8(
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_ERROR;
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results_ = developer::PackDirectory::Results::Create(response);
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(true);
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!key_path_str_.empty() && key_file.empty()) {
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.message = l10n_util::GetStringUTF8(
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    response.status = developer::PACK_STATUS_ERROR;
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results_ = developer::PackDirectory::Results::Create(response);
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendResponse(true);
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Balanced in OnPackSuccess / OnPackFailure.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRef();
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pack_job_ = new PackExtensionJob(this, root_directory, key_file, flags);
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pack_job_->Start();
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivatePackDirectoryFunction::DeveloperPrivatePackDirectoryFunction()
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){}
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivatePackDirectoryFunction::~DeveloperPrivatePackDirectoryFunction()
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){}
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateLoadUnpackedFunction::~DeveloperPrivateLoadUnpackedFunction() {}
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DeveloperPrivateExportSyncfsFolderToLocalfsFunction::RunImpl() {
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(grv) : add unittests.
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath::StringType project_name;
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &project_name));
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!ValidateFolderName(project_name)) {
964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DVLOG(0) << "Invalid project_name : [" << project_name << "]";
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  context_ = content::BrowserContext::GetStoragePartition(
9691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      GetProfile(), render_view_host()->GetSiteInstance())
9701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 ->GetFileSystemContext();
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::FilePath project_path(GetProfile()->GetPath());
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  project_path = project_path.Append(kUnpackedAppsFolder);
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  project_path = project_path.Append(project_name);
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     ClearPrexistingDirectoryContent,
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 this,
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 project_path));
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ClearPrexistingDirectoryContent(const base::FilePath& project_path) {
987a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
988a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Clear the project directory before copying new files.
989a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::DeleteFile(project_path, true/*recursive*/);
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_ = 1;
992eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 ReadSyncFileSystemDirectory,
996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 this, project_path, project_path.BaseName()));
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ReadSyncFileSystemDirectory(const base::FilePath& project_path,
1001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const base::FilePath& destination_path) {
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string origin_url(
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Extension::GetBaseURLFromExtensionId(extension_id()).spec());
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fileapi::FileSystemURL url(sync_file_system::CreateSyncableFileSystemURL(
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL(origin_url),
1006eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      destination_path));
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1008868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  context_->operation_runner()->ReadDirectory(
1009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      url, base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1010eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      ReadSyncFileSystemDirectoryCb,
1011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      this, project_path, destination_path));
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReadSyncFileSystemDirectoryCb(
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& project_path,
1017eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const base::FilePath& destination_path,
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::PlatformFileError status,
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const fileapi::FileSystemOperation::FileEntryList& file_list,
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_more) {
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (status != base::PLATFORM_FILE_OK) {
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DLOG(ERROR) << "Error in copying files from sync filesystem.";
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1027eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We add 1 to the pending copy operations for both files and directories. We
1028eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // release the directory copy operation once all the files under the directory
1029eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // are added for copying. We do that to ensure that pendingCopyOperationsCount
1030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // does not become zero before all copy operations are finished.
1031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // In case the directory happens to be executing the last copy operation it
1032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // will call SendResponse to send the response to the API. The pending copy
1033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // operations of files are released by the CopyFile function.
1034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_ += file_list.size();
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < file_list.size(); ++i) {
1037eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (file_list[i].is_directory) {
1038eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ReadSyncFileSystemDirectory(project_path.Append(file_list[i].name),
1039eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                  destination_path.Append(file_list[i].name));
1040eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
1041eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string origin_url(
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Extension::GetBaseURLFromExtensionId(extension_id()).spec());
1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fileapi::FileSystemURL url(sync_file_system::CreateSyncableFileSystemURL(
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GURL(origin_url),
1047eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        destination_path.Append(file_list[i].name)));
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath target_path = project_path;
1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    target_path = target_path.Append(file_list[i].name);
1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    context_->operation_runner()->CreateSnapshotFile(
1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        url,
1053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                SnapshotFileCallback,
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            this,
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            target_path));
1058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Directory copy operation released here.
1062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_--;
1063eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!pendingCopyOperationsCount_) {
1065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       SendResponse,
1068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   this,
1069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   success_));
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::SnapshotFileCallback(
1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& target_path,
1075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::PlatformFileError result,
1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::PlatformFileInfo& file_info,
1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& src_path,
1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) {
1079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (result != base::PLATFORM_FILE_OK) {
1080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetError("Error in copying files from sync filesystem.");
1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    success_ = false;
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile,
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 this,
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 src_path,
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 target_path));
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile(
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& src_path,
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& target_path) {
1095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!base::CreateDirectory(target_path.DirName())) {
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetError("Error in copying files from sync filesystem.");
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    success_ = false;
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (success_)
11017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::CopyFile(src_path, target_path);
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(pendingCopyOperationsCount_ > 0);
1104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  pendingCopyOperationsCount_--;
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!pendingCopyOperationsCount_) {
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       SendResponse,
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   this,
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   success_));
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeveloperPrivateExportSyncfsFolderToLocalfsFunction()
1117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : pendingCopyOperationsCount_(0), success_(true) {}
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateExportSyncfsFolderToLocalfsFunction::
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~DeveloperPrivateExportSyncfsFolderToLocalfsFunction() {}
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DeveloperPrivateLoadProjectFunction::RunImpl() {
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(grv) : add unit tests.
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath::StringType project_name;
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &project_name));
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!ValidateFolderName(project_name)) {
1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DVLOG(0) << "Invalid project_name : [" << project_name << "]";
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::FilePath path(GetProfile()->GetPath());
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  path = path.Append(kUnpackedAppsFolder);
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(grv) : Sanitize / check project_name.
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  path = path.Append(project_name);
11351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service = GetProfile()->GetExtensionService();
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UnpackedInstaller::Create(service)->Load(path);
1137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const ExtensionSet* extensions = service->extensions();
1139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Released by GetUnpackedExtension.
1140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  AddRef();
1141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
1142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::Bind(&DeveloperPrivateLoadProjectFunction::GetUnpackedExtension,
1143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 this, path, extensions));
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void DeveloperPrivateLoadProjectFunction::GetUnpackedExtension(
1148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const base::FilePath& path,
1149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const ExtensionSet* extensions) {
1150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const Extension* extension = GetExtensionByPath(extensions, path);
1151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool success = true;
1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (extension) {
11533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    SetResult(new base::StringValue(extension->id()));
1154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
1155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    SetError("unable to load the project");
1156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    success = false;
1157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::Bind(&DeveloperPrivateLoadProjectFunction::SendResponse,
1160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 this,
1161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 success));
1162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Release();
1163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateLoadProjectFunction::DeveloperPrivateLoadProjectFunction() {}
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DeveloperPrivateLoadProjectFunction::~DeveloperPrivateLoadProjectFunction() {}
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateChoosePathFunction::RunImpl() {
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<developer::ChoosePath::Params> params(
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      developer::ChoosePath::Params::Create(*args_));
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::SelectFileDialog::Type type = ui::SelectFileDialog::SELECT_FOLDER;
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo info;
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->select_type == developer::SELECT_TYPE_FILE) {
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    type = ui::SelectFileDialog::SELECT_OPEN_FILE;
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 select_title;
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int file_type_index = 0;
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (params->file_type == developer::FILE_TYPE_LOAD)
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    select_title = l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY);
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (params->file_type== developer::FILE_TYPE_PEM) {
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    select_title = l10n_util::GetStringUTF16(
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_EXTENSION_PACK_DIALOG_SELECT_KEY);
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.extensions.push_back(std::vector<base::FilePath::StringType>());
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.extensions.front().push_back(FILE_PATH_LITERAL("pem"));
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.extension_description_overrides.push_back(
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION));
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.include_all_files = true;
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file_type_index = 1;
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Balanced by FileSelected / FileSelectionCanceled.
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRef();
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool result = ShowPicker(
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type,
12031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DeveloperPrivateAPI::Get(GetProfile())->GetLastUnpackedDirectory(),
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      select_title,
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info,
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file_type_index);
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateChoosePathFunction::FileSelected(
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
121258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetResult(new base::StringValue(UTF16ToUTF8(path.LossyDisplayName())));
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(true);
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeveloperPrivateChoosePathFunction::FileSelectionCanceled() {
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendResponse(false);
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Release();
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateChoosePathFunction::~DeveloperPrivateChoosePathFunction() {}
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeveloperPrivateGetStringsFunction::RunImpl() {
1225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue();
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResult(dict);
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  webui::SetFontAndTextDirection(dict);
122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #define   SET_STRING(id, idr) \
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dict->SetString(id, l10n_util::GetStringUTF16(idr))
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettings", IDS_MANAGE_EXTENSIONS_SETTING_WINDOWS_TITLE);
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SET_STRING("appsDevtoolSearch", IDS_APPS_DEVTOOL_SEARCH);
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SET_STRING("appsDevtoolApps", IDS_APPS_DEVTOOL_APPS_INSTALLED);
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SET_STRING("appsDevtoolExtensions", IDS_APPS_DEVTOOL_EXTENSIONS_INSTALLED);
123790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SET_STRING("appsDevtoolNoExtensions", IDS_EXTENSIONS_NONE_INSTALLED);
123890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SET_STRING("appsDevtoolUnpacked", IDS_APPS_DEVTOOL_UNPACKED_INSTALLED);
1239fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  SET_STRING("appsDevtoolInstalled", IDS_APPS_DEVTOOL_INSTALLED);
1240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoPackedApps", IDS_APPS_DEVTOOL_NO_PACKED_APPS);
1241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoUnpackedApps", IDS_APPS_DEVTOOL_NO_UNPACKED_APPS);
1242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoPackedExtensions",
1243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_NO_PACKED_EXTENSIONS);
1244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolNoUnpackedExtensions",
1245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_NO_UNPACKED_EXTENSIONS);
1246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("appsDevtoolUpdating", IDS_APPS_DEVTOOL_UPDATING);
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsGetMoreExtensions", IDS_GET_MORE_EXTENSIONS);
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsExtensionId", IDS_EXTENSIONS_ID);
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsExtensionPath", IDS_EXTENSIONS_PATH);
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsInspectViews", IDS_EXTENSIONS_INSPECT_VIEWS);
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsInstallWarnings",
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_INSTALL_WARNINGS);
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("viewIncognito", IDS_EXTENSIONS_VIEW_INCOGNITO);
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("viewInactive", IDS_EXTENSIONS_VIEW_INACTIVE);
12553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("backgroundPage", IDS_EXTENSIONS_BACKGROUND_PAGE);
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsEnable", IDS_EXTENSIONS_ENABLE);
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsEnabled", IDS_EXTENSIONS_ENABLED);
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsRemove", IDS_EXTENSIONS_REMOVE);
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsEnableIncognito",
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_ENABLE_INCOGNITO);
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsAllowFileAccess",
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_ALLOW_FILE_ACCESS);
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsReloadTerminated",
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_RELOAD_TERMINATED);
12653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("extensionSettingsReloadUnpacked",
12663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)             IDS_APPS_DEV_TOOLS_RELOAD_UNPACKED);
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsLaunch", IDS_EXTENSIONS_LAUNCH);
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsOptions", IDS_EXTENSIONS_OPTIONS_LINK);
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsPermissions", IDS_EXTENSIONS_PERMISSIONS_LINK);
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsVisitWebsite", IDS_EXTENSIONS_VISIT_WEBSITE);
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsVisitWebStore", IDS_EXTENSIONS_VISIT_WEBSTORE);
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsPolicyControlled",
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_POLICY_CONTROLLED);
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsManagedMode",
1275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             IDS_EXTENSIONS_LOCKED_MANAGED_USER);
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsShowButton", IDS_EXTENSIONS_SHOW_BUTTON);
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("appsDevtoolLoadUnpackedButton",
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_APPS_DEVTOOL_LOAD_UNPACKED_BUTTON);
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("appsDevtoolPackButton", IDS_APPS_DEVTOOL_PACK_BUTTON);
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsCommandsLink",
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_COMMANDS_CONFIGURE);
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("appsDevtoolUpdateButton", IDS_APPS_DEVTOOL_UPDATE_BUTTON);
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsWarningsTitle", IDS_EXTENSION_WARNINGS_TITLE);
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsShowDetails", IDS_EXTENSIONS_SHOW_DETAILS);
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionSettingsHideDetails", IDS_EXTENSIONS_HIDE_DETAILS);
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionUninstall", IDS_EXTENSIONS_UNINSTALL);
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionsPermissionsHeading",
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             IDS_EXTENSIONS_PERMISSIONS_HEADING);
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("extensionsPermissionsClose", IDS_EXTENSIONS_PERMISSIONS_CLOSE);
12907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionDisabled", IDS_EXTENSIONS_DISABLED);
12917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsShowLogsButton", IDS_EXTENSIONS_SHOW_LOGS);
12927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsMoreDetailsButton", IDS_EXTENSIONS_MORE_DETAILS);
12937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsVersion", IDS_EXTENSIONS_VERSION);
1294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("extensionSettingsDelete", IDS_EXTENSIONS_ADT_DELETE);
12957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("extensionSettingsPack", IDS_EXTENSIONS_PACK);
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Pack Extension strings
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionOverlay", IDS_EXTENSION_PACK_DIALOG_TITLE);
12997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SET_STRING("packExtensionHeading", IDS_EXTENSION_ADT_PACK_DIALOG_HEADING);
13003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("packButton", IDS_EXTENSION_ADT_PACK_BUTTON);
1301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("ok", IDS_OK);
1302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("cancel", IDS_CANCEL);
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionRootDir",
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     IDS_EXTENSION_PACK_DIALOG_ROOT_DIRECTORY_LABEL);
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionPrivateKey",
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     IDS_EXTENSION_PACK_DIALOG_PRIVATE_KEY_LABEL);
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionBrowseButton", IDS_EXTENSION_PACK_DIALOG_BROWSE);
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionProceedAnyway", IDS_EXTENSION_PROCEED_ANYWAY);
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionWarningTitle", IDS_EXTENSION_PACK_WARNING_TITLE);
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SET_STRING("packExtensionErrorTitle", IDS_EXTENSION_PACK_ERROR_TITLE);
13113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("packAppOverlay", IDS_EXTENSION_PACK_APP_DIALOG_TITLE);
13123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SET_STRING("packAppHeading", IDS_EXTENSION_ADT_PACK_APP_DIALOG_HEADING);
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Delete confirmation dialog.
1315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationDeleteButton",
1316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_BUTTON);
1317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationTitle",
1318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_TITLE);
1319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationMessageApp",
1320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_MESSAGE_APP);
1321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SET_STRING("deleteConfirmationMessageExtension",
1322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IDS_APPS_DEVTOOL_DELETE_CONFIRMATION_MESSAGE_EXTENSION);
1323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Dialog when profile is managed.
1325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("managedProfileDialogCloseButton",
1326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IDS_APPS_DEVTOOL_MANAGED_PROFILE_DIALOG_CLOSE_BUTTON);
1327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("managedProfileDialogTitle",
1328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IDS_APPS_DEVTOOL_MANAGED_PROFILE_DIALOG_TITLE);
1329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SET_STRING("managedProfileDialogDescription",
1330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IDS_APPS_DEVTOOL_MANAGED_PROFILE_DIALOG_DESCRIPTION);
1331424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  #undef   SET_STRING
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DeveloperPrivateGetStringsFunction::~DeveloperPrivateGetStringsFunction() {}
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool DeveloperPrivateIsProfileManagedFunction::RunImpl() {
13391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetResult(new base::FundamentalValue(GetProfile()->IsManaged()));
1340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return true;
1341424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1343424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)DeveloperPrivateIsProfileManagedFunction::
1344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ~DeveloperPrivateIsProfileManagedFunction() {
1345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
1346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace api
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions
1350