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