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