| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/management/management_api.h" | 5 #include "extensions/browser/api/management/management_api.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/lazy_instance.h" | 13 #include "base/lazy_instance.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/memory/linked_ptr.h" | 15 #include "base/memory/linked_ptr.h" |
| 16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
| 20 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
| 21 #include "chrome/browser/extensions/api/management/management_api_constants.h" | 21 #include "content/public/browser/browser_context.h" |
| 22 #include "chrome/browser/extensions/extension_service.h" | 22 #include "extensions/browser/api/extensions_api_client.h" |
| 23 #include "chrome/browser/extensions/extension_ui_util.h" | 23 #include "extensions/browser/api/management/management_api_constants.h" |
| 24 #include "chrome/browser/extensions/extension_uninstall_dialog.h" | |
| 25 #include "chrome/browser/extensions/extension_util.h" | |
| 26 #include "chrome/browser/extensions/launch_util.h" | |
| 27 #include "chrome/browser/favicon/favicon_service_factory.h" | |
| 28 #include "chrome/browser/profiles/profile.h" | |
| 29 #include "chrome/browser/ui/browser_dialogs.h" | |
| 30 #include "chrome/browser/ui/browser_finder.h" | |
| 31 #include "chrome/browser/ui/browser_window.h" | |
| 32 #include "chrome/browser/ui/extensions/application_launch.h" | |
| 33 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" | |
| 34 #include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h" | |
| 35 #include "chrome/common/extensions/api/management.h" | |
| 36 #include "chrome/common/extensions/chrome_utility_extensions_messages.h" | |
| 37 #include "chrome/common/extensions/extension_constants.h" | |
| 38 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" | |
| 39 #include "content/public/browser/utility_process_host.h" | |
| 40 #include "content/public/browser/utility_process_host_client.h" | |
| 41 #include "extensions/browser/event_router.h" | 24 #include "extensions/browser/event_router.h" |
| 42 #include "extensions/browser/extension_prefs.h" | 25 #include "extensions/browser/extension_prefs.h" |
| 43 #include "extensions/browser/extension_registry.h" | 26 #include "extensions/browser/extension_registry.h" |
| 44 #include "extensions/browser/extension_system.h" | 27 #include "extensions/browser/extension_system.h" |
| 45 #include "extensions/browser/management_policy.h" | 28 #include "extensions/browser/management_policy.h" |
| 46 #include "extensions/browser/uninstall_reason.h" | 29 #include "extensions/browser/uninstall_reason.h" |
| 30 #include "extensions/common/api/management.h" |
| 47 #include "extensions/common/constants.h" | 31 #include "extensions/common/constants.h" |
| 48 #include "extensions/common/error_utils.h" | 32 #include "extensions/common/error_utils.h" |
| 49 #include "extensions/common/extension.h" | 33 #include "extensions/common/extension.h" |
| 50 #include "extensions/common/extension_icon_set.h" | 34 #include "extensions/common/extension_icon_set.h" |
| 51 #include "extensions/common/manifest_handlers/icons_handler.h" | 35 #include "extensions/common/manifest_handlers/icons_handler.h" |
| 52 #include "extensions/common/manifest_handlers/offline_enabled_info.h" | 36 #include "extensions/common/manifest_handlers/offline_enabled_info.h" |
| 53 #include "extensions/common/manifest_handlers/options_page_info.h" | 37 #include "extensions/common/manifest_handlers/options_page_info.h" |
| 54 #include "extensions/common/manifest_url_handlers.h" | 38 #include "extensions/common/manifest_url_handlers.h" |
| 55 #include "extensions/common/permissions/permission_set.h" | 39 #include "extensions/common/permissions/permission_set.h" |
| 56 #include "extensions/common/permissions/permissions_data.h" | 40 #include "extensions/common/permissions/permissions_data.h" |
| 57 #include "extensions/common/url_pattern.h" | 41 #include "extensions/common/url_pattern.h" |
| 58 | 42 |
| 59 using base::IntToString; | 43 using base::IntToString; |
| 60 using content::BrowserThread; | 44 using content::BrowserThread; |
| 61 using content::UtilityProcessHost; | |
| 62 using content::UtilityProcessHostClient; | |
| 63 | 45 |
| 64 namespace keys = extension_management_api_constants; | 46 namespace keys = extension_management_api_constants; |
| 65 | 47 |
| 66 namespace extensions { | 48 namespace extensions { |
| 67 | 49 |
| 68 namespace management = api::management; | 50 namespace management = core_api::management; |
| 69 | 51 |
| 70 namespace { | 52 namespace { |
| 71 | 53 |
| 72 typedef std::vector<linked_ptr<management::ExtensionInfo> > ExtensionInfoList; | 54 typedef std::vector<linked_ptr<management::ExtensionInfo>> ExtensionInfoList; |
| 73 typedef std::vector<linked_ptr<management::IconInfo> > IconInfoList; | 55 typedef std::vector<linked_ptr<management::IconInfo>> IconInfoList; |
| 74 | 56 |
| 75 enum AutoConfirmForTest { | 57 enum AutoConfirmForTest { DO_NOT_SKIP = 0, PROCEED, ABORT }; |
| 76 DO_NOT_SKIP = 0, | |
| 77 PROCEED, | |
| 78 ABORT | |
| 79 }; | |
| 80 | 58 |
| 81 AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP; | 59 AutoConfirmForTest auto_confirm_for_test = DO_NOT_SKIP; |
| 82 | 60 |
| 83 std::vector<std::string> CreateWarningsList(const Extension* extension) { | 61 std::vector<std::string> CreateWarningsList(const Extension* extension) { |
| 84 std::vector<std::string> warnings_list; | 62 std::vector<std::string> warnings_list; |
| 85 PermissionMessages warnings = | 63 PermissionMessages warnings = |
| 86 extension->permissions_data()->GetPermissionMessages(); | 64 extension->permissions_data()->GetPermissionMessages(); |
| 87 for (PermissionMessages::const_iterator iter = warnings.begin(); | 65 for (PermissionMessages::const_iterator iter = warnings.begin(); |
| 88 iter != warnings.end(); ++iter) { | 66 iter != warnings.end(); ++iter) { |
| 89 warnings_list.push_back(base::UTF16ToUTF8(iter->message())); | 67 warnings_list.push_back(base::UTF16ToUTF8(iter->message())); |
| 90 } | 68 } |
| 91 | 69 |
| 92 return warnings_list; | 70 return warnings_list; |
| 93 } | 71 } |
| 94 | 72 |
| 95 std::vector<management::LaunchType> GetAvailableLaunchTypes( | 73 std::vector<management::LaunchType> GetAvailableLaunchTypes( |
| 96 const Extension& extension) { | 74 const Extension& extension, |
| 75 const ManagementAPIDelegate* delegate) { |
| 97 std::vector<management::LaunchType> launch_type_list; | 76 std::vector<management::LaunchType> launch_type_list; |
| 98 if (extension.is_platform_app()) { | 77 if (extension.is_platform_app()) { |
| 99 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_WINDOW); | 78 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_WINDOW); |
| 100 return launch_type_list; | 79 return launch_type_list; |
| 101 } | 80 } |
| 102 | 81 |
| 103 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB); | 82 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB); |
| 104 | 83 |
| 105 #if !defined(OS_MACOSX) | 84 #if !defined(OS_MACOSX) |
| 106 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_WINDOW); | 85 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_WINDOW); |
| 107 #endif | 86 #endif |
| 108 | 87 |
| 109 if (!util::IsStreamlinedHostedAppsEnabled()) { | 88 if (!delegate->IsStreamlinedHostedAppsEnabled()) { |
| 110 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_PINNED_TAB); | 89 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_AS_PINNED_TAB); |
| 111 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_FULL_SCREEN); | 90 launch_type_list.push_back(management::LAUNCH_TYPE_OPEN_FULL_SCREEN); |
| 112 } | 91 } |
| 113 return launch_type_list; | 92 return launch_type_list; |
| 114 } | 93 } |
| 115 | 94 |
| 116 scoped_ptr<management::ExtensionInfo> CreateExtensionInfo( | 95 scoped_ptr<management::ExtensionInfo> CreateExtensionInfo( |
| 117 const Extension& extension, | 96 const Extension& extension, |
| 118 ExtensionSystem* system) { | 97 content::BrowserContext* context) { |
| 98 ExtensionSystem* system = ExtensionSystem::Get(context); |
| 99 ExtensionRegistry* registry = ExtensionRegistry::Get(context); |
| 100 const ManagementAPIDelegate* delegate = |
| 101 ManagementAPI::GetFactoryInstance()->Get(context)->GetDelegate(); |
| 119 scoped_ptr<management::ExtensionInfo> info(new management::ExtensionInfo()); | 102 scoped_ptr<management::ExtensionInfo> info(new management::ExtensionInfo()); |
| 120 ExtensionService* service = system->extension_service(); | |
| 121 | 103 |
| 122 info->id = extension.id(); | 104 info->id = extension.id(); |
| 123 info->name = extension.name(); | 105 info->name = extension.name(); |
| 124 info->short_name = extension.short_name(); | 106 info->short_name = extension.short_name(); |
| 125 info->enabled = service->IsExtensionEnabled(info->id); | 107 info->enabled = registry->enabled_extensions().Contains(info->id); |
| 126 info->offline_enabled = OfflineEnabledInfo::IsOfflineEnabled(&extension); | 108 info->offline_enabled = OfflineEnabledInfo::IsOfflineEnabled(&extension); |
| 127 info->version = extension.VersionString(); | 109 info->version = extension.VersionString(); |
| 128 info->description = extension.description(); | 110 info->description = extension.description(); |
| 129 info->options_url = OptionsPageInfo::GetOptionsPage(&extension).spec(); | 111 info->options_url = OptionsPageInfo::GetOptionsPage(&extension).spec(); |
| 130 info->homepage_url.reset(new std::string( | 112 info->homepage_url.reset( |
| 131 ManifestURL::GetHomepageURL(&extension).spec())); | 113 new std::string(ManifestURL::GetHomepageURL(&extension).spec())); |
| 132 info->may_disable = system->management_policy()-> | 114 info->may_disable = |
| 133 UserMayModifySettings(&extension, NULL); | 115 system->management_policy()->UserMayModifySettings(&extension, NULL); |
| 134 info->is_app = extension.is_app(); | 116 info->is_app = extension.is_app(); |
| 135 if (info->is_app) { | 117 if (info->is_app) { |
| 136 if (extension.is_legacy_packaged_app()) | 118 if (extension.is_legacy_packaged_app()) |
| 137 info->type = management::ExtensionInfo::TYPE_LEGACY_PACKAGED_APP; | 119 info->type = management::ExtensionInfo::TYPE_LEGACY_PACKAGED_APP; |
| 138 else if (extension.is_hosted_app()) | 120 else if (extension.is_hosted_app()) |
| 139 info->type = management::ExtensionInfo::TYPE_HOSTED_APP; | 121 info->type = management::ExtensionInfo::TYPE_HOSTED_APP; |
| 140 else | 122 else |
| 141 info->type = management::ExtensionInfo::TYPE_PACKAGED_APP; | 123 info->type = management::ExtensionInfo::TYPE_PACKAGED_APP; |
| 142 } else if (extension.is_theme()) { | 124 } else if (extension.is_theme()) { |
| 143 info->type = management::ExtensionInfo::TYPE_THEME; | 125 info->type = management::ExtensionInfo::TYPE_THEME; |
| 144 } else { | 126 } else { |
| 145 info->type = management::ExtensionInfo::TYPE_EXTENSION; | 127 info->type = management::ExtensionInfo::TYPE_EXTENSION; |
| 146 } | 128 } |
| 147 | 129 |
| 148 if (info->enabled) { | 130 if (info->enabled) { |
| 149 info->disabled_reason = management::ExtensionInfo::DISABLED_REASON_NONE; | 131 info->disabled_reason = management::ExtensionInfo::DISABLED_REASON_NONE; |
| 150 } else { | 132 } else { |
| 151 ExtensionPrefs* prefs = ExtensionPrefs::Get(service->profile()); | 133 ExtensionPrefs* prefs = ExtensionPrefs::Get(context); |
| 152 if (prefs->DidExtensionEscalatePermissions(extension.id())) { | 134 if (prefs->DidExtensionEscalatePermissions(extension.id())) { |
| 153 info->disabled_reason = | 135 info->disabled_reason = |
| 154 management::ExtensionInfo::DISABLED_REASON_PERMISSIONS_INCREASE; | 136 management::ExtensionInfo::DISABLED_REASON_PERMISSIONS_INCREASE; |
| 155 } else { | 137 } else { |
| 156 info->disabled_reason = | 138 info->disabled_reason = |
| 157 management::ExtensionInfo::DISABLED_REASON_UNKNOWN; | 139 management::ExtensionInfo::DISABLED_REASON_UNKNOWN; |
| 158 } | 140 } |
| 159 } | 141 } |
| 160 | 142 |
| 161 if (!ManifestURL::GetUpdateURL(&extension).is_empty()) { | 143 if (!ManifestURL::GetUpdateURL(&extension).is_empty()) { |
| 162 info->update_url.reset(new std::string( | 144 info->update_url.reset( |
| 163 ManifestURL::GetUpdateURL(&extension).spec())); | 145 new std::string(ManifestURL::GetUpdateURL(&extension).spec())); |
| 164 } | 146 } |
| 165 | 147 |
| 166 if (extension.is_app()) { | 148 if (extension.is_app()) { |
| 167 info->app_launch_url.reset(new std::string( | 149 info->app_launch_url.reset( |
| 168 AppLaunchInfo::GetFullLaunchURL(&extension).spec())); | 150 new std::string(delegate->GetFullLaunchURL(&extension).spec())); |
| 169 } | 151 } |
| 170 | 152 |
| 171 const ExtensionIconSet::IconMap& icons = | 153 const ExtensionIconSet::IconMap& icons = |
| 172 IconsInfo::GetIcons(&extension).map(); | 154 IconsInfo::GetIcons(&extension).map(); |
| 173 if (!icons.empty()) { | 155 if (!icons.empty()) { |
| 174 info->icons.reset(new IconInfoList()); | 156 info->icons.reset(new IconInfoList()); |
| 175 ExtensionIconSet::IconMap::const_iterator icon_iter; | 157 ExtensionIconSet::IconMap::const_iterator icon_iter; |
| 176 for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) { | 158 for (icon_iter = icons.begin(); icon_iter != icons.end(); ++icon_iter) { |
| 177 management::IconInfo* icon_info = new management::IconInfo(); | 159 management::IconInfo* icon_info = new management::IconInfo(); |
| 178 icon_info->size = icon_iter->first; | 160 icon_info->size = icon_iter->first; |
| 179 GURL url = ExtensionIconSource::GetIconURL( | 161 GURL url = |
| 180 &extension, icon_info->size, ExtensionIconSet::MATCH_EXACTLY, false, | 162 delegate->GetIconURL(&extension, icon_info->size, |
| 181 NULL); | 163 ExtensionIconSet::MATCH_EXACTLY, false, nullptr); |
| 182 icon_info->url = url.spec(); | 164 icon_info->url = url.spec(); |
| 183 info->icons->push_back(make_linked_ptr<management::IconInfo>(icon_info)); | 165 info->icons->push_back(make_linked_ptr<management::IconInfo>(icon_info)); |
| 184 } | 166 } |
| 185 } | 167 } |
| 186 | 168 |
| 187 const std::set<std::string> perms = | 169 const std::set<std::string> perms = |
| 188 extension.permissions_data()->active_permissions()->GetAPIsAsStrings(); | 170 extension.permissions_data()->active_permissions()->GetAPIsAsStrings(); |
| 189 if (!perms.empty()) { | 171 if (!perms.empty()) { |
| 190 std::set<std::string>::const_iterator perms_iter; | 172 std::set<std::string>::const_iterator perms_iter; |
| 191 for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter) | 173 for (perms_iter = perms.begin(); perms_iter != perms.end(); ++perms_iter) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 break; | 212 break; |
| 231 } | 213 } |
| 232 | 214 |
| 233 info->launch_type = management::LAUNCH_TYPE_NONE; | 215 info->launch_type = management::LAUNCH_TYPE_NONE; |
| 234 if (extension.is_app()) { | 216 if (extension.is_app()) { |
| 235 LaunchType launch_type; | 217 LaunchType launch_type; |
| 236 if (extension.is_platform_app()) { | 218 if (extension.is_platform_app()) { |
| 237 launch_type = LAUNCH_TYPE_WINDOW; | 219 launch_type = LAUNCH_TYPE_WINDOW; |
| 238 } else { | 220 } else { |
| 239 launch_type = | 221 launch_type = |
| 240 GetLaunchType(ExtensionPrefs::Get(service->profile()), &extension); | 222 delegate->GetLaunchType(ExtensionPrefs::Get(context), &extension); |
| 241 } | 223 } |
| 242 | 224 |
| 243 switch (launch_type) { | 225 switch (launch_type) { |
| 244 case LAUNCH_TYPE_PINNED: | 226 case LAUNCH_TYPE_PINNED: |
| 245 info->launch_type = management::LAUNCH_TYPE_OPEN_AS_PINNED_TAB; | 227 info->launch_type = management::LAUNCH_TYPE_OPEN_AS_PINNED_TAB; |
| 246 break; | 228 break; |
| 247 case LAUNCH_TYPE_REGULAR: | 229 case LAUNCH_TYPE_REGULAR: |
| 248 info->launch_type = management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB; | 230 info->launch_type = management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB; |
| 249 break; | 231 break; |
| 250 case LAUNCH_TYPE_FULLSCREEN: | 232 case LAUNCH_TYPE_FULLSCREEN: |
| 251 info->launch_type = management::LAUNCH_TYPE_OPEN_FULL_SCREEN; | 233 info->launch_type = management::LAUNCH_TYPE_OPEN_FULL_SCREEN; |
| 252 break; | 234 break; |
| 253 case LAUNCH_TYPE_WINDOW: | 235 case LAUNCH_TYPE_WINDOW: |
| 254 info->launch_type = management::LAUNCH_TYPE_OPEN_AS_WINDOW; | 236 info->launch_type = management::LAUNCH_TYPE_OPEN_AS_WINDOW; |
| 255 break; | 237 break; |
| 256 case LAUNCH_TYPE_INVALID: | 238 case LAUNCH_TYPE_INVALID: |
| 257 case NUM_LAUNCH_TYPES: | 239 case NUM_LAUNCH_TYPES: |
| 258 NOTREACHED(); | 240 NOTREACHED(); |
| 259 } | 241 } |
| 260 | 242 |
| 261 info->available_launch_types.reset(new std::vector<management::LaunchType>( | 243 info->available_launch_types.reset(new std::vector<management::LaunchType>( |
| 262 GetAvailableLaunchTypes(extension))); | 244 GetAvailableLaunchTypes(extension, delegate))); |
| 263 } | 245 } |
| 264 | 246 |
| 265 return info.Pass(); | 247 return info.Pass(); |
| 266 } | 248 } |
| 267 | 249 |
| 250 bool ShouldNotBeVisible(const Extension* extension, |
| 251 content::BrowserContext* context) { |
| 252 return (extension->ShouldNotBeVisible() || |
| 253 ExtensionPrefs::Get(context)->IsEphemeralApp(extension->id())); |
| 254 } |
| 255 |
| 268 void AddExtensionInfo(const ExtensionSet& extensions, | 256 void AddExtensionInfo(const ExtensionSet& extensions, |
| 269 ExtensionSystem* system, | 257 ExtensionInfoList* extension_list, |
| 270 ExtensionInfoList* extension_list, | 258 content::BrowserContext* context) { |
| 271 content::BrowserContext* context) { | |
| 272 for (ExtensionSet::const_iterator iter = extensions.begin(); | 259 for (ExtensionSet::const_iterator iter = extensions.begin(); |
| 273 iter != extensions.end(); ++iter) { | 260 iter != extensions.end(); ++iter) { |
| 274 const Extension& extension = *iter->get(); | 261 const Extension& extension = *iter->get(); |
| 275 | 262 |
| 276 if (ui_util::ShouldNotBeVisible(&extension, context)) | 263 if (ShouldNotBeVisible(&extension, context)) |
| 277 continue; // Skip built-in extensions/apps. | 264 continue; // Skip built-in extensions/apps. |
| 278 | 265 |
| 279 extension_list->push_back(make_linked_ptr<management::ExtensionInfo>( | 266 extension_list->push_back(make_linked_ptr<management::ExtensionInfo>( |
| 280 CreateExtensionInfo(extension, system).release())); | 267 CreateExtensionInfo(extension, context).release())); |
| 281 } | 268 } |
| 282 } | 269 } |
| 283 | 270 |
| 284 } // namespace | 271 } // namespace |
| 285 | 272 |
| 286 ExtensionService* ManagementFunction::service() { | |
| 287 return ExtensionSystem::Get(GetProfile())->extension_service(); | |
| 288 } | |
| 289 | |
| 290 ExtensionService* AsyncManagementFunction::service() { | |
| 291 return ExtensionSystem::Get(GetProfile())->extension_service(); | |
| 292 } | |
| 293 | |
| 294 bool ManagementGetAllFunction::RunSync() { | 273 bool ManagementGetAllFunction::RunSync() { |
| 295 ExtensionInfoList extensions; | 274 ExtensionInfoList extensions; |
| 296 ExtensionRegistry* registry = ExtensionRegistry::Get(GetProfile()); | 275 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); |
| 297 ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); | |
| 298 | 276 |
| 299 AddExtensionInfo(registry->enabled_extensions(), | 277 AddExtensionInfo(registry->enabled_extensions(), &extensions, |
| 300 system, &extensions, browser_context()); | 278 browser_context()); |
| 301 AddExtensionInfo(registry->disabled_extensions(), | 279 AddExtensionInfo(registry->disabled_extensions(), &extensions, |
| 302 system, &extensions, browser_context()); | 280 browser_context()); |
| 303 AddExtensionInfo(registry->terminated_extensions(), | 281 AddExtensionInfo(registry->terminated_extensions(), &extensions, |
| 304 system, &extensions, browser_context()); | 282 browser_context()); |
| 305 | 283 |
| 306 results_ = management::GetAll::Results::Create(extensions); | 284 results_ = management::GetAll::Results::Create(extensions); |
| 307 return true; | 285 return true; |
| 308 } | 286 } |
| 309 | 287 |
| 310 bool ManagementGetFunction::RunSync() { | 288 bool ManagementGetFunction::RunSync() { |
| 311 scoped_ptr<management::Get::Params> params( | 289 scoped_ptr<management::Get::Params> params( |
| 312 management::Get::Params::Create(*args_)); | 290 management::Get::Params::Create(*args_)); |
| 313 EXTENSION_FUNCTION_VALIDATE(params.get()); | 291 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 292 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); |
| 314 | 293 |
| 315 const Extension* extension = service()->GetExtensionById(params->id, true); | 294 const Extension* extension = |
| 295 registry->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING); |
| 316 if (!extension) { | 296 if (!extension) { |
| 317 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 297 error_ = |
| 318 params->id); | 298 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, params->id); |
| 319 return false; | 299 return false; |
| 320 } | 300 } |
| 321 | 301 |
| 322 scoped_ptr<management::ExtensionInfo> info = | 302 scoped_ptr<management::ExtensionInfo> info = |
| 323 CreateExtensionInfo(*extension, ExtensionSystem::Get(GetProfile())); | 303 CreateExtensionInfo(*extension, browser_context()); |
| 324 results_ = management::Get::Results::Create(*info); | 304 results_ = management::Get::Results::Create(*info); |
| 325 | 305 |
| 326 return true; | 306 return true; |
| 327 } | 307 } |
| 328 | 308 |
| 329 bool ManagementGetSelfFunction::RunSync() { | 309 bool ManagementGetSelfFunction::RunSync() { |
| 330 scoped_ptr<management::ExtensionInfo> info = | 310 scoped_ptr<management::ExtensionInfo> info = |
| 331 CreateExtensionInfo(*extension_, ExtensionSystem::Get(GetProfile())); | 311 CreateExtensionInfo(*extension_, browser_context()); |
| 332 results_ = management::Get::Results::Create(*info); | 312 results_ = management::Get::Results::Create(*info); |
| 333 | 313 |
| 334 return true; | 314 return true; |
| 335 } | 315 } |
| 336 | 316 |
| 337 bool ManagementGetPermissionWarningsByIdFunction::RunSync() { | 317 bool ManagementGetPermissionWarningsByIdFunction::RunSync() { |
| 338 scoped_ptr<management::GetPermissionWarningsById::Params> params( | 318 scoped_ptr<management::GetPermissionWarningsById::Params> params( |
| 339 management::GetPermissionWarningsById::Params::Create(*args_)); | 319 management::GetPermissionWarningsById::Params::Create(*args_)); |
| 340 EXTENSION_FUNCTION_VALIDATE(params.get()); | 320 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 341 | 321 |
| 342 const Extension* extension = service()->GetExtensionById(params->id, true); | 322 const Extension* extension = |
| 323 ExtensionRegistry::Get(browser_context()) |
| 324 ->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING); |
| 343 if (!extension) { | 325 if (!extension) { |
| 344 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 326 error_ = |
| 345 params->id); | 327 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, params->id); |
| 346 return false; | 328 return false; |
| 347 } | 329 } |
| 348 | 330 |
| 349 std::vector<std::string> warnings = CreateWarningsList(extension); | 331 std::vector<std::string> warnings = CreateWarningsList(extension); |
| 350 results_ = management::GetPermissionWarningsById::Results::Create(warnings); | 332 results_ = management::GetPermissionWarningsById::Results::Create(warnings); |
| 351 return true; | 333 return true; |
| 352 } | 334 } |
| 353 | 335 |
| 354 namespace { | |
| 355 | |
| 356 // This class helps ManagementGetPermissionWarningsByManifestFunction manage | |
| 357 // sending manifest JSON strings to the utility process for parsing. | |
| 358 class SafeManifestJSONParser : public UtilityProcessHostClient { | |
| 359 public: | |
| 360 SafeManifestJSONParser( | |
| 361 ManagementGetPermissionWarningsByManifestFunction* client, | |
| 362 const std::string& manifest) | |
| 363 : client_(client), | |
| 364 manifest_(manifest) {} | |
| 365 | |
| 366 void Start() { | |
| 367 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 368 BrowserThread::PostTask( | |
| 369 BrowserThread::IO, | |
| 370 FROM_HERE, | |
| 371 base::Bind(&SafeManifestJSONParser::StartWorkOnIOThread, this)); | |
| 372 } | |
| 373 | |
| 374 void StartWorkOnIOThread() { | |
| 375 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 376 UtilityProcessHost* host = UtilityProcessHost::Create( | |
| 377 this, base::MessageLoopProxy::current().get()); | |
| 378 host->Send(new ChromeUtilityMsg_ParseJSON(manifest_)); | |
| 379 } | |
| 380 | |
| 381 bool OnMessageReceived(const IPC::Message& message) override { | |
| 382 bool handled = true; | |
| 383 IPC_BEGIN_MESSAGE_MAP(SafeManifestJSONParser, message) | |
| 384 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ParseJSON_Succeeded, | |
| 385 OnJSONParseSucceeded) | |
| 386 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ParseJSON_Failed, | |
| 387 OnJSONParseFailed) | |
| 388 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 389 IPC_END_MESSAGE_MAP() | |
| 390 return handled; | |
| 391 } | |
| 392 | |
| 393 void OnJSONParseSucceeded(const base::ListValue& wrapper) { | |
| 394 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 395 const base::Value* value = NULL; | |
| 396 CHECK(wrapper.Get(0, &value)); | |
| 397 if (value->IsType(base::Value::TYPE_DICTIONARY)) | |
| 398 parsed_manifest_.reset( | |
| 399 static_cast<const base::DictionaryValue*>(value)->DeepCopy()); | |
| 400 else | |
| 401 error_ = keys::kManifestParseError; | |
| 402 | |
| 403 BrowserThread::PostTask( | |
| 404 BrowserThread::UI, | |
| 405 FROM_HERE, | |
| 406 base::Bind(&SafeManifestJSONParser::ReportResultFromUIThread, this)); | |
| 407 } | |
| 408 | |
| 409 void OnJSONParseFailed(const std::string& error) { | |
| 410 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 411 error_ = error; | |
| 412 BrowserThread::PostTask( | |
| 413 BrowserThread::UI, | |
| 414 FROM_HERE, | |
| 415 base::Bind(&SafeManifestJSONParser::ReportResultFromUIThread, this)); | |
| 416 } | |
| 417 | |
| 418 void ReportResultFromUIThread() { | |
| 419 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 420 if (error_.empty() && parsed_manifest_.get()) | |
| 421 client_->OnParseSuccess(parsed_manifest_.Pass()); | |
| 422 else | |
| 423 client_->OnParseFailure(error_); | |
| 424 } | |
| 425 | |
| 426 private: | |
| 427 ~SafeManifestJSONParser() override {} | |
| 428 | |
| 429 // The client who we'll report results back to. | |
| 430 ManagementGetPermissionWarningsByManifestFunction* client_; | |
| 431 | |
| 432 // Data to parse. | |
| 433 std::string manifest_; | |
| 434 | |
| 435 // Results of parsing. | |
| 436 scoped_ptr<base::DictionaryValue> parsed_manifest_; | |
| 437 | |
| 438 std::string error_; | |
| 439 }; | |
| 440 | |
| 441 } // namespace | |
| 442 | |
| 443 bool ManagementGetPermissionWarningsByManifestFunction::RunAsync() { | 336 bool ManagementGetPermissionWarningsByManifestFunction::RunAsync() { |
| 444 scoped_ptr<management::GetPermissionWarningsByManifest::Params> params( | 337 scoped_ptr<management::GetPermissionWarningsByManifest::Params> params( |
| 445 management::GetPermissionWarningsByManifest::Params::Create(*args_)); | 338 management::GetPermissionWarningsByManifest::Params::Create(*args_)); |
| 446 EXTENSION_FUNCTION_VALIDATE(params.get()); | 339 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 447 | 340 |
| 448 scoped_refptr<SafeManifestJSONParser> parser = | 341 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance() |
| 449 new SafeManifestJSONParser(this, params->manifest_str); | 342 ->Get(browser_context()) |
| 450 parser->Start(); | 343 ->GetDelegate(); |
| 451 | 344 |
| 452 // Matched with a Release() in OnParseSuccess/Failure(). | 345 if (delegate) { |
| 453 AddRef(); | 346 delegate->GetPermissionWarningsByManifestFunctionDelegate( |
| 347 this, params->manifest_str); |
| 454 | 348 |
| 455 // Response is sent async in OnParseSuccess/Failure(). | 349 // Matched with a Release() in OnParseSuccess/Failure(). |
| 456 return true; | 350 AddRef(); |
| 351 |
| 352 // Response is sent async in OnParseSuccess/Failure(). |
| 353 return true; |
| 354 } else { |
| 355 // TODO(lfg) add error string |
| 356 OnParseFailure(""); |
| 357 return false; |
| 358 } |
| 457 } | 359 } |
| 458 | 360 |
| 459 void ManagementGetPermissionWarningsByManifestFunction::OnParseSuccess( | 361 void ManagementGetPermissionWarningsByManifestFunction::OnParseSuccess( |
| 460 scoped_ptr<base::DictionaryValue> parsed_manifest) { | 362 scoped_ptr<base::DictionaryValue> parsed_manifest) { |
| 461 CHECK(parsed_manifest.get()); | 363 CHECK(parsed_manifest.get()); |
| 462 | 364 |
| 463 scoped_refptr<Extension> extension = Extension::Create( | 365 scoped_refptr<Extension> extension = |
| 464 base::FilePath(), Manifest::INVALID_LOCATION, *parsed_manifest, | 366 Extension::Create(base::FilePath(), Manifest::INVALID_LOCATION, |
| 465 Extension::NO_FLAGS, &error_); | 367 *parsed_manifest, Extension::NO_FLAGS, &error_); |
| 466 if (!extension.get()) { | 368 if (!extension.get()) { |
| 467 OnParseFailure(keys::kExtensionCreateError); | 369 OnParseFailure(keys::kExtensionCreateError); |
| 468 return; | 370 return; |
| 469 } | 371 } |
| 470 | 372 |
| 471 std::vector<std::string> warnings = CreateWarningsList(extension.get()); | 373 std::vector<std::string> warnings = CreateWarningsList(extension.get()); |
| 472 results_ = | 374 results_ = |
| 473 management::GetPermissionWarningsByManifest::Results::Create(warnings); | 375 management::GetPermissionWarningsByManifest::Results::Create(warnings); |
| 474 SendResponse(true); | 376 SendResponse(true); |
| 475 | 377 |
| 476 // Matched with AddRef() in RunAsync(). | 378 // Matched with AddRef() in RunAsync(). |
| 477 Release(); | 379 Release(); |
| 478 } | 380 } |
| 479 | 381 |
| 480 void ManagementGetPermissionWarningsByManifestFunction::OnParseFailure( | 382 void ManagementGetPermissionWarningsByManifestFunction::OnParseFailure( |
| 481 const std::string& error) { | 383 const std::string& error) { |
| 482 error_ = error; | 384 error_ = error; |
| 483 SendResponse(false); | 385 SendResponse(false); |
| 484 | 386 |
| 485 // Matched with AddRef() in RunAsync(). | 387 // Matched with AddRef() in RunAsync(). |
| 486 Release(); | 388 Release(); |
| 487 } | 389 } |
| 488 | 390 |
| 489 bool ManagementLaunchAppFunction::RunSync() { | 391 bool ManagementLaunchAppFunction::RunSync() { |
| 490 scoped_ptr<management::LaunchApp::Params> params( | 392 scoped_ptr<management::LaunchApp::Params> params( |
| 491 management::LaunchApp::Params::Create(*args_)); | 393 management::LaunchApp::Params::Create(*args_)); |
| 492 EXTENSION_FUNCTION_VALIDATE(params.get()); | 394 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 493 const Extension* extension = service()->GetExtensionById(params->id, true); | 395 const Extension* extension = |
| 396 ExtensionRegistry::Get(browser_context()) |
| 397 ->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING); |
| 494 if (!extension) { | 398 if (!extension) { |
| 495 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 399 error_ = |
| 496 params->id); | 400 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, params->id); |
| 497 return false; | 401 return false; |
| 498 } | 402 } |
| 499 if (!extension->is_app()) { | 403 if (!extension->is_app()) { |
| 500 error_ = ErrorUtils::FormatErrorMessage(keys::kNotAnAppError, | 404 error_ = ErrorUtils::FormatErrorMessage(keys::kNotAnAppError, params->id); |
| 501 params->id); | |
| 502 return false; | 405 return false; |
| 503 } | 406 } |
| 504 | 407 |
| 505 // Look at prefs to find the right launch container. | 408 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance() |
| 506 // If the user has not set a preference, the default launch value will be | 409 ->Get(browser_context()) |
| 507 // returned. | 410 ->GetDelegate(); |
| 508 LaunchContainer launch_container = | 411 return delegate->LaunchAppFunctionDelegate(extension, browser_context()); |
| 509 GetLaunchContainer(ExtensionPrefs::Get(GetProfile()), extension); | |
| 510 OpenApplication(AppLaunchParams( | |
| 511 GetProfile(), extension, launch_container, NEW_FOREGROUND_TAB)); | |
| 512 CoreAppLauncherHandler::RecordAppLaunchType( | |
| 513 extension_misc::APP_LAUNCH_EXTENSION_API, | |
| 514 extension->GetType()); | |
| 515 | |
| 516 return true; | |
| 517 } | 412 } |
| 518 | 413 |
| 519 ManagementSetEnabledFunction::ManagementSetEnabledFunction() { | 414 ManagementSetEnabledFunction::ManagementSetEnabledFunction() { |
| 520 } | 415 } |
| 521 | 416 |
| 522 ManagementSetEnabledFunction::~ManagementSetEnabledFunction() { | 417 ManagementSetEnabledFunction::~ManagementSetEnabledFunction() { |
| 523 } | 418 } |
| 524 | 419 |
| 525 bool ManagementSetEnabledFunction::RunAsync() { | 420 bool ManagementSetEnabledFunction::RunAsync() { |
| 526 scoped_ptr<management::SetEnabled::Params> params( | 421 scoped_ptr<management::SetEnabled::Params> params( |
| 527 management::SetEnabled::Params::Create(*args_)); | 422 management::SetEnabled::Params::Create(*args_)); |
| 528 EXTENSION_FUNCTION_VALIDATE(params.get()); | 423 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 424 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); |
| 425 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance() |
| 426 ->Get(browser_context()) |
| 427 ->GetDelegate(); |
| 529 | 428 |
| 530 extension_id_ = params->id; | 429 extension_id_ = params->id; |
| 531 | 430 |
| 532 const Extension* extension = | 431 const Extension* extension = |
| 533 ExtensionRegistry::Get(GetProfile()) | 432 registry->GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING); |
| 534 ->GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING); | 433 if (!extension || ShouldNotBeVisible(extension, browser_context())) { |
| 535 if (!extension || ui_util::ShouldNotBeVisible(extension, browser_context())) { | 434 error_ = |
| 536 error_ = ErrorUtils::FormatErrorMessage( | 435 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, extension_id_); |
| 537 keys::kNoExtensionError, extension_id_); | |
| 538 return false; | 436 return false; |
| 539 } | 437 } |
| 540 | 438 |
| 541 const ManagementPolicy* policy = | 439 const ManagementPolicy* policy = |
| 542 ExtensionSystem::Get(GetProfile())->management_policy(); | 440 ExtensionSystem::Get(browser_context())->management_policy(); |
| 543 if (!policy->UserMayModifySettings(extension, NULL) || | 441 if (!policy->UserMayModifySettings(extension, NULL) || |
| 544 (!params->enabled && policy->MustRemainEnabled(extension, NULL)) || | 442 (!params->enabled && policy->MustRemainEnabled(extension, NULL)) || |
| 545 (params->enabled && policy->MustRemainDisabled(extension, NULL, NULL))) { | 443 (params->enabled && policy->MustRemainDisabled(extension, NULL, NULL))) { |
| 546 error_ = ErrorUtils::FormatErrorMessage( | 444 error_ = ErrorUtils::FormatErrorMessage(keys::kUserCantModifyError, |
| 547 keys::kUserCantModifyError, extension_id_); | 445 extension_id_); |
| 548 return false; | 446 return false; |
| 549 } | 447 } |
| 550 | 448 |
| 551 bool currently_enabled = service()->IsExtensionEnabled(extension_id_); | 449 bool currently_enabled = |
| 450 registry->enabled_extensions().Contains(extension_id_) || |
| 451 registry->terminated_extensions().Contains(extension_id_); |
| 552 | 452 |
| 553 if (!currently_enabled && params->enabled) { | 453 if (!currently_enabled && params->enabled) { |
| 554 ExtensionPrefs* prefs = ExtensionPrefs::Get(GetProfile()); | 454 ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context()); |
| 555 if (prefs->DidExtensionEscalatePermissions(extension_id_)) { | 455 if (prefs->DidExtensionEscalatePermissions(extension_id_)) { |
| 556 if (!user_gesture()) { | 456 if (!user_gesture()) { |
| 557 error_ = keys::kGestureNeededForEscalationError; | 457 SetError(keys::kGestureNeededForEscalationError); |
| 558 return false; | 458 return false; |
| 559 } | 459 } |
| 560 AddRef(); // Matched in InstallUIProceed/InstallUIAbort | 460 AddRef(); // Matched in InstallUIProceed/InstallUIAbort |
| 561 install_prompt_.reset( | 461 install_prompt_ = delegate->SetEnabledFunctionDelegate(this, extension); |
| 562 new ExtensionInstallPrompt(GetAssociatedWebContents())); | |
| 563 install_prompt_->ConfirmReEnable(this, extension); | |
| 564 return true; | 462 return true; |
| 565 } | 463 } |
| 566 service()->EnableExtension(extension_id_); | 464 delegate->EnableExtension(browser_context(), extension_id_); |
| 567 } else if (currently_enabled && !params->enabled) { | 465 } else if (currently_enabled && !params->enabled) { |
| 568 service()->DisableExtension(extension_id_, Extension::DISABLE_USER_ACTION); | 466 delegate->DisableExtension(browser_context(), extension_id_, |
| 467 Extension::DISABLE_USER_ACTION); |
| 569 } | 468 } |
| 570 | 469 |
| 571 BrowserThread::PostTask( | 470 BrowserThread::PostTask( |
| 572 BrowserThread::UI, | 471 BrowserThread::UI, FROM_HERE, |
| 573 FROM_HERE, | |
| 574 base::Bind(&ManagementSetEnabledFunction::SendResponse, this, true)); | 472 base::Bind(&ManagementSetEnabledFunction::SendResponse, this, true)); |
| 575 | 473 |
| 576 return true; | 474 return true; |
| 577 } | 475 } |
| 578 | 476 |
| 579 void ManagementSetEnabledFunction::InstallUIProceed() { | 477 void ManagementSetEnabledFunction::InstallUIProceed() { |
| 580 service()->EnableExtension(extension_id_); | 478 ManagementAPI::GetFactoryInstance() |
| 479 ->Get(browser_context()) |
| 480 ->GetDelegate() |
| 481 ->EnableExtension(browser_context(), extension_id_); |
| 581 SendResponse(true); | 482 SendResponse(true); |
| 582 Release(); | 483 Release(); |
| 583 } | 484 } |
| 584 | 485 |
| 585 void ManagementSetEnabledFunction::InstallUIAbort(bool user_initiated) { | 486 void ManagementSetEnabledFunction::InstallUIAbort(bool user_initiated) { |
| 586 error_ = keys::kUserDidNotReEnableError; | 487 error_ = keys::kUserDidNotReEnableError; |
| 587 SendResponse(false); | 488 SendResponse(false); |
| 588 Release(); | 489 Release(); |
| 589 } | 490 } |
| 590 | 491 |
| 591 ManagementUninstallFunctionBase::ManagementUninstallFunctionBase() { | 492 ManagementUninstallFunctionBase::ManagementUninstallFunctionBase() { |
| 592 } | 493 } |
| 593 | 494 |
| 594 ManagementUninstallFunctionBase::~ManagementUninstallFunctionBase() { | 495 ManagementUninstallFunctionBase::~ManagementUninstallFunctionBase() { |
| 595 } | 496 } |
| 596 | 497 |
| 597 bool ManagementUninstallFunctionBase::Uninstall( | 498 bool ManagementUninstallFunctionBase::Uninstall( |
| 598 const std::string& target_extension_id, | 499 const std::string& target_extension_id, |
| 599 bool show_confirm_dialog) { | 500 bool show_confirm_dialog) { |
| 501 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance() |
| 502 ->Get(browser_context()) |
| 503 ->GetDelegate(); |
| 600 extension_id_ = target_extension_id; | 504 extension_id_ = target_extension_id; |
| 601 const Extension* target_extension = | 505 const Extension* target_extension = |
| 602 extensions::ExtensionRegistry::Get(browser_context())-> | 506 extensions::ExtensionRegistry::Get(browser_context()) |
| 603 GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING); | 507 ->GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING); |
| 604 if (!target_extension || | 508 if (!target_extension || |
| 605 ui_util::ShouldNotBeVisible(target_extension, browser_context())) { | 509 ShouldNotBeVisible(target_extension, browser_context())) { |
| 606 error_ = ErrorUtils::FormatErrorMessage( | 510 error_ = |
| 607 keys::kNoExtensionError, extension_id_); | 511 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, extension_id_); |
| 608 return false; | 512 return false; |
| 609 } | 513 } |
| 610 | 514 |
| 611 if (!ExtensionSystem::Get(GetProfile()) | 515 if (!ExtensionSystem::Get(browser_context()) |
| 612 ->management_policy() | 516 ->management_policy() |
| 613 ->UserMayModifySettings(target_extension, NULL)) { | 517 ->UserMayModifySettings(target_extension, NULL)) { |
| 614 error_ = ErrorUtils::FormatErrorMessage( | 518 error_ = ErrorUtils::FormatErrorMessage(keys::kUserCantModifyError, |
| 615 keys::kUserCantModifyError, extension_id_); | 519 extension_id_); |
| 616 return false; | 520 return false; |
| 617 } | 521 } |
| 618 | 522 |
| 619 if (auto_confirm_for_test == DO_NOT_SKIP) { | 523 if (auto_confirm_for_test == DO_NOT_SKIP) { |
| 620 if (show_confirm_dialog) { | 524 if (show_confirm_dialog) { |
| 621 AddRef(); // Balanced in ExtensionUninstallAccepted/Canceled | 525 AddRef(); // Balanced in ExtensionUninstallAccepted/Canceled |
| 622 content::WebContents* web_contents = GetAssociatedWebContents(); | 526 delegate->UninstallFunctionDelegate(this, target_extension_id); |
| 623 extension_uninstall_dialog_.reset(ExtensionUninstallDialog::Create( | |
| 624 GetProfile(), | |
| 625 web_contents ? web_contents->GetTopLevelNativeWindow() : NULL, | |
| 626 this)); | |
| 627 if (extension_id() != target_extension_id) { | |
| 628 extension_uninstall_dialog_->ConfirmProgrammaticUninstall( | |
| 629 target_extension, extension()); | |
| 630 } else { | |
| 631 // If this is a self uninstall, show the generic uninstall dialog. | |
| 632 extension_uninstall_dialog_->ConfirmUninstall(target_extension); | |
| 633 } | |
| 634 } else { | 527 } else { |
| 635 Finish(true); | 528 Finish(true); |
| 636 } | 529 } |
| 637 } else { | 530 } else { |
| 638 Finish(auto_confirm_for_test == PROCEED); | 531 Finish(auto_confirm_for_test == PROCEED); |
| 639 } | 532 } |
| 640 | 533 |
| 641 return true; | 534 return true; |
| 642 } | 535 } |
| 643 | 536 |
| 644 // static | 537 // static |
| 645 void ManagementUninstallFunctionBase::SetAutoConfirmForTest( | 538 void ManagementUninstallFunctionBase::SetAutoConfirmForTest( |
| 646 bool should_proceed) { | 539 bool should_proceed) { |
| 647 auto_confirm_for_test = should_proceed ? PROCEED : ABORT; | 540 auto_confirm_for_test = should_proceed ? PROCEED : ABORT; |
| 648 } | 541 } |
| 649 | 542 |
| 650 void ManagementUninstallFunctionBase::Finish(bool should_uninstall) { | 543 void ManagementUninstallFunctionBase::Finish(bool should_uninstall) { |
| 651 if (should_uninstall) { | 544 if (should_uninstall) { |
| 652 // The extension can be uninstalled in another window while the UI was | 545 // The extension can be uninstalled in another window while the UI was |
| 653 // showing. Do nothing in that case. | 546 // showing. Do nothing in that case. |
| 654 ExtensionRegistry* registry = ExtensionRegistry::Get(GetProfile()); | 547 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); |
| 655 const Extension* extension = registry->GetExtensionById( | 548 const Extension* extension = registry->GetExtensionById( |
| 656 extension_id_, ExtensionRegistry::EVERYTHING); | 549 extension_id_, ExtensionRegistry::EVERYTHING); |
| 657 if (!extension) { | 550 if (!extension) { |
| 658 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 551 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, |
| 659 extension_id_); | 552 extension_id_); |
| 660 SendResponse(false); | 553 SendResponse(false); |
| 661 } else { | 554 } else { |
| 662 bool success = service()->UninstallExtension( | 555 const ManagementAPIDelegate* delegate = |
| 663 extension_id_, | 556 ManagementAPI::GetFactoryInstance() |
| 557 ->Get(browser_context()) |
| 558 ->GetDelegate(); |
| 559 bool success = delegate->UninstallExtension( |
| 560 browser_context(), extension_id_, |
| 664 extensions::UNINSTALL_REASON_MANAGEMENT_API, | 561 extensions::UNINSTALL_REASON_MANAGEMENT_API, |
| 665 base::Bind(&base::DoNothing), | 562 base::Bind(&base::DoNothing), NULL); |
| 666 NULL); | |
| 667 | 563 |
| 668 // TODO set error_ if !success | 564 // TODO set error_ if !success |
| 669 SendResponse(success); | 565 SendResponse(success); |
| 670 } | 566 } |
| 671 } else { | 567 } else { |
| 672 error_ = ErrorUtils::FormatErrorMessage( | 568 error_ = ErrorUtils::FormatErrorMessage(keys::kUninstallCanceledError, |
| 673 keys::kUninstallCanceledError, extension_id_); | 569 extension_id_); |
| 674 SendResponse(false); | 570 SendResponse(false); |
| 675 } | 571 } |
| 676 } | 572 } |
| 677 | 573 |
| 678 void ManagementUninstallFunctionBase::ExtensionUninstallAccepted() { | 574 void ManagementUninstallFunctionBase::ExtensionUninstallAccepted() { |
| 679 Finish(true); | 575 Finish(true); |
| 680 Release(); | 576 Release(); |
| 681 } | 577 } |
| 682 | 578 |
| 683 void ManagementUninstallFunctionBase::ExtensionUninstallCanceled() { | 579 void ManagementUninstallFunctionBase::ExtensionUninstallCanceled() { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 | 646 |
| 751 bool ManagementCreateAppShortcutFunction::RunAsync() { | 647 bool ManagementCreateAppShortcutFunction::RunAsync() { |
| 752 if (!user_gesture()) { | 648 if (!user_gesture()) { |
| 753 error_ = keys::kGestureNeededForCreateAppShortcutError; | 649 error_ = keys::kGestureNeededForCreateAppShortcutError; |
| 754 return false; | 650 return false; |
| 755 } | 651 } |
| 756 | 652 |
| 757 scoped_ptr<management::CreateAppShortcut::Params> params( | 653 scoped_ptr<management::CreateAppShortcut::Params> params( |
| 758 management::CreateAppShortcut::Params::Create(*args_)); | 654 management::CreateAppShortcut::Params::Create(*args_)); |
| 759 EXTENSION_FUNCTION_VALIDATE(params.get()); | 655 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 760 const Extension* extension = service()->GetExtensionById(params->id, true); | 656 const Extension* extension = |
| 657 ExtensionRegistry::Get(browser_context()) |
| 658 ->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING); |
| 761 if (!extension) { | 659 if (!extension) { |
| 762 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, | 660 error_ = |
| 763 params->id); | 661 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, params->id); |
| 764 return false; | 662 return false; |
| 765 } | 663 } |
| 766 | 664 |
| 767 if (!extension->is_app()) { | 665 if (!extension->is_app()) { |
| 768 error_ = ErrorUtils::FormatErrorMessage(keys::kNotAnAppError, params->id); | 666 error_ = ErrorUtils::FormatErrorMessage(keys::kNotAnAppError, params->id); |
| 769 return false; | 667 return false; |
| 770 } | 668 } |
| 771 | 669 |
| 772 #if defined(OS_MACOSX) | 670 #if defined(OS_MACOSX) |
| 773 if (!extension->is_platform_app()) { | 671 if (!extension->is_platform_app()) { |
| 774 error_ = keys::kCreateOnlyPackagedAppShortcutMac; | 672 error_ = keys::kCreateOnlyPackagedAppShortcutMac; |
| 775 return false; | 673 return false; |
| 776 } | 674 } |
| 777 #endif | 675 #endif |
| 778 | 676 |
| 779 Browser* browser = chrome::FindBrowserWithProfile( | 677 if (auto_confirm_for_test != DO_NOT_SKIP) { |
| 780 GetProfile(), chrome::HOST_DESKTOP_TYPE_NATIVE); | 678 // Matched with a Release() in OnCloseShortcutPrompt(). |
| 781 if (!browser) { | 679 AddRef(); |
| 782 // Shouldn't happen if we have user gesture. | 680 |
| 783 error_ = keys::kNoBrowserToCreateShortcut; | 681 OnCloseShortcutPrompt(auto_confirm_for_test == PROCEED); |
| 784 return false; | 682 |
| 683 return true; |
| 785 } | 684 } |
| 786 | 685 |
| 787 // Matched with a Release() in OnCloseShortcutPrompt(). | 686 if (ManagementAPI::GetFactoryInstance() |
| 788 AddRef(); | 687 ->Get(browser_context()) |
| 789 | 688 ->GetDelegate() |
| 790 if (auto_confirm_for_test == DO_NOT_SKIP) { | 689 ->CreateAppShortcutFunctionDelegate(this, extension)) { |
| 791 chrome::ShowCreateChromeAppShortcutsDialog( | 690 // Matched with a Release() in OnCloseShortcutPrompt(). |
| 792 browser->window()->GetNativeWindow(), browser->profile(), extension, | 691 AddRef(); |
| 793 base::Bind(&ManagementCreateAppShortcutFunction::OnCloseShortcutPrompt, | |
| 794 this)); | |
| 795 } else { | |
| 796 OnCloseShortcutPrompt(auto_confirm_for_test == PROCEED); | |
| 797 } | 692 } |
| 798 | 693 |
| 799 // Response is sent async in OnCloseShortcutPrompt(). | 694 // Response is sent async in OnCloseShortcutPrompt(). |
| 800 return true; | 695 return true; |
| 801 } | 696 } |
| 802 | 697 |
| 803 bool ManagementSetLaunchTypeFunction::RunSync() { | 698 bool ManagementSetLaunchTypeFunction::RunSync() { |
| 804 if (!user_gesture()) { | 699 if (!user_gesture()) { |
| 805 error_ = keys::kGestureNeededForSetLaunchTypeError; | 700 error_ = keys::kGestureNeededForSetLaunchTypeError; |
| 806 return false; | 701 return false; |
| 807 } | 702 } |
| 808 | 703 |
| 809 scoped_ptr<management::SetLaunchType::Params> params( | 704 scoped_ptr<management::SetLaunchType::Params> params( |
| 810 management::SetLaunchType::Params::Create(*args_)); | 705 management::SetLaunchType::Params::Create(*args_)); |
| 811 EXTENSION_FUNCTION_VALIDATE(params.get()); | 706 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 812 const Extension* extension = service()->GetExtensionById(params->id, true); | 707 const Extension* extension = |
| 708 ExtensionRegistry::Get(browser_context()) |
| 709 ->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING); |
| 710 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance() |
| 711 ->Get(browser_context()) |
| 712 ->GetDelegate(); |
| 813 if (!extension) { | 713 if (!extension) { |
| 814 error_ = | 714 error_ = |
| 815 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, params->id); | 715 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, params->id); |
| 816 return false; | 716 return false; |
| 817 } | 717 } |
| 818 | 718 |
| 819 if (!extension->is_app()) { | 719 if (!extension->is_app()) { |
| 820 error_ = ErrorUtils::FormatErrorMessage(keys::kNotAnAppError, params->id); | 720 error_ = ErrorUtils::FormatErrorMessage(keys::kNotAnAppError, params->id); |
| 821 return false; | 721 return false; |
| 822 } | 722 } |
| 823 | 723 |
| 824 std::vector<management::LaunchType> available_launch_types = | 724 std::vector<management::LaunchType> available_launch_types = |
| 825 GetAvailableLaunchTypes(*extension); | 725 GetAvailableLaunchTypes(*extension, delegate); |
| 826 | 726 |
| 827 management::LaunchType app_launch_type = params->launch_type; | 727 management::LaunchType app_launch_type = params->launch_type; |
| 828 if (std::find(available_launch_types.begin(), | 728 if (std::find(available_launch_types.begin(), available_launch_types.end(), |
| 829 available_launch_types.end(), | |
| 830 app_launch_type) == available_launch_types.end()) { | 729 app_launch_type) == available_launch_types.end()) { |
| 831 error_ = keys::kLaunchTypeNotAvailableError; | 730 error_ = keys::kLaunchTypeNotAvailableError; |
| 832 return false; | 731 return false; |
| 833 } | 732 } |
| 834 | 733 |
| 835 LaunchType launch_type = LAUNCH_TYPE_DEFAULT; | 734 LaunchType launch_type = LAUNCH_TYPE_DEFAULT; |
| 836 switch (app_launch_type) { | 735 switch (app_launch_type) { |
| 837 case management::LAUNCH_TYPE_OPEN_AS_PINNED_TAB: | 736 case management::LAUNCH_TYPE_OPEN_AS_PINNED_TAB: |
| 838 launch_type = LAUNCH_TYPE_PINNED; | 737 launch_type = LAUNCH_TYPE_PINNED; |
| 839 break; | 738 break; |
| 840 case management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB: | 739 case management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB: |
| 841 launch_type = LAUNCH_TYPE_REGULAR; | 740 launch_type = LAUNCH_TYPE_REGULAR; |
| 842 break; | 741 break; |
| 843 case management::LAUNCH_TYPE_OPEN_FULL_SCREEN: | 742 case management::LAUNCH_TYPE_OPEN_FULL_SCREEN: |
| 844 launch_type = LAUNCH_TYPE_FULLSCREEN; | 743 launch_type = LAUNCH_TYPE_FULLSCREEN; |
| 845 break; | 744 break; |
| 846 case management::LAUNCH_TYPE_OPEN_AS_WINDOW: | 745 case management::LAUNCH_TYPE_OPEN_AS_WINDOW: |
| 847 launch_type = LAUNCH_TYPE_WINDOW; | 746 launch_type = LAUNCH_TYPE_WINDOW; |
| 848 break; | 747 break; |
| 849 case management::LAUNCH_TYPE_NONE: | 748 case management::LAUNCH_TYPE_NONE: |
| 850 NOTREACHED(); | 749 NOTREACHED(); |
| 851 } | 750 } |
| 852 | 751 |
| 853 SetLaunchType(service(), params->id, launch_type); | 752 delegate->SetLaunchType(browser_context(), params->id, launch_type); |
| 854 | 753 |
| 855 return true; | 754 return true; |
| 856 } | 755 } |
| 857 | 756 |
| 858 ManagementGenerateAppForLinkFunction::ManagementGenerateAppForLinkFunction() { | 757 ManagementGenerateAppForLinkFunction::ManagementGenerateAppForLinkFunction() { |
| 859 } | 758 } |
| 860 | 759 |
| 861 ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() { | 760 ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() { |
| 862 } | 761 } |
| 863 | 762 |
| 864 void ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp( | 763 void ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp( |
| 865 const Extension* extension, | 764 const Extension* extension, |
| 866 const WebApplicationInfo& web_app_info) { | 765 const WebApplicationInfo& web_app_info) { |
| 867 if (extension) { | 766 if (extension) { |
| 868 scoped_ptr<management::ExtensionInfo> info = | 767 scoped_ptr<management::ExtensionInfo> info = |
| 869 CreateExtensionInfo(*extension, ExtensionSystem::Get(GetProfile())); | 768 CreateExtensionInfo(*extension, browser_context()); |
| 870 results_ = management::GenerateAppForLink::Results::Create(*info); | 769 results_ = management::GenerateAppForLink::Results::Create(*info); |
| 871 | 770 |
| 872 SendResponse(true); | 771 SendResponse(true); |
| 873 Release(); | 772 Release(); |
| 874 } else { | 773 } else { |
| 875 error_ = keys::kGenerateAppForLinkInstallError; | 774 error_ = keys::kGenerateAppForLinkInstallError; |
| 876 SendResponse(false); | 775 SendResponse(false); |
| 877 Release(); | 776 Release(); |
| 878 } | 777 } |
| 879 } | 778 } |
| 880 | 779 |
| 881 void ManagementGenerateAppForLinkFunction::OnFaviconForApp( | |
| 882 const favicon_base::FaviconImageResult& image_result) { | |
| 883 WebApplicationInfo web_app; | |
| 884 web_app.title = base::UTF8ToUTF16(title_); | |
| 885 web_app.app_url = launch_url_; | |
| 886 | |
| 887 if (!image_result.image.IsEmpty()) { | |
| 888 WebApplicationInfo::IconInfo icon; | |
| 889 icon.data = image_result.image.AsBitmap(); | |
| 890 icon.width = icon.data.width(); | |
| 891 icon.height = icon.data.height(); | |
| 892 web_app.icons.push_back(icon); | |
| 893 } | |
| 894 | |
| 895 bookmark_app_helper_.reset(new BookmarkAppHelper(service(), web_app, NULL)); | |
| 896 bookmark_app_helper_->Create(base::Bind( | |
| 897 &ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp, this)); | |
| 898 } | |
| 899 | |
| 900 bool ManagementGenerateAppForLinkFunction::RunAsync() { | 780 bool ManagementGenerateAppForLinkFunction::RunAsync() { |
| 901 if (!user_gesture()) { | 781 if (!user_gesture()) { |
| 902 error_ = keys::kGestureNeededForGenerateAppForLinkError; | 782 error_ = keys::kGestureNeededForGenerateAppForLinkError; |
| 903 return false; | 783 return false; |
| 904 } | 784 } |
| 905 | 785 |
| 906 scoped_ptr<management::GenerateAppForLink::Params> params( | 786 scoped_ptr<management::GenerateAppForLink::Params> params( |
| 907 management::GenerateAppForLink::Params::Create(*args_)); | 787 management::GenerateAppForLink::Params::Create(*args_)); |
| 908 EXTENSION_FUNCTION_VALIDATE(params.get()); | 788 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 909 | 789 |
| 910 GURL launch_url(params->url); | 790 GURL launch_url(params->url); |
| 911 if (!launch_url.is_valid() || !launch_url.SchemeIsHTTPOrHTTPS()) { | 791 if (!launch_url.is_valid() || !launch_url.SchemeIsHTTPOrHTTPS()) { |
| 912 error_ = ErrorUtils::FormatErrorMessage(keys::kInvalidURLError, | 792 error_ = |
| 913 params->url); | 793 ErrorUtils::FormatErrorMessage(keys::kInvalidURLError, params->url); |
| 914 return false; | 794 return false; |
| 915 } | 795 } |
| 916 | 796 |
| 917 if (params->title.empty()) { | 797 if (params->title.empty()) { |
| 918 error_ = keys::kEmptyTitleError; | 798 error_ = keys::kEmptyTitleError; |
| 919 return false; | 799 return false; |
| 920 } | 800 } |
| 921 | 801 |
| 922 FaviconService* favicon_service = | 802 app_for_link_delegate_ = |
| 923 FaviconServiceFactory::GetForProfile(GetProfile(), | 803 ManagementAPI::GetFactoryInstance() |
| 924 Profile::EXPLICIT_ACCESS); | 804 ->Get(browser_context()) |
| 925 DCHECK(favicon_service); | 805 ->GetDelegate() |
| 806 ->GenerateAppForLinkFunctionDelegate(this, browser_context(), |
| 807 params->title, launch_url); |
| 926 | 808 |
| 927 title_ = params->title; | 809 // Matched with a Release() in FinishCreateBookmarkApp(). |
| 928 launch_url_ = launch_url; | |
| 929 | |
| 930 favicon_service->GetFaviconImageForPageURL( | |
| 931 launch_url, | |
| 932 base::Bind(&ManagementGenerateAppForLinkFunction::OnFaviconForApp, this), | |
| 933 &cancelable_task_tracker_); | |
| 934 | |
| 935 // Matched with a Release() in OnExtensionLoaded(). | |
| 936 AddRef(); | 810 AddRef(); |
| 937 | 811 |
| 938 // Response is sent async in OnExtensionLoaded(). | 812 // Response is sent async in FinishCreateBookmarkApp(). |
| 939 return true; | 813 return true; |
| 940 } | 814 } |
| 941 | 815 |
| 942 ManagementEventRouter::ManagementEventRouter(content::BrowserContext* context) | 816 ManagementEventRouter::ManagementEventRouter(content::BrowserContext* context) |
| 943 : browser_context_(context), extension_registry_observer_(this) { | 817 : browser_context_(context), extension_registry_observer_(this) { |
| 944 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); | 818 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
| 945 } | 819 } |
| 946 | 820 |
| 947 ManagementEventRouter::~ManagementEventRouter() {} | 821 ManagementEventRouter::~ManagementEventRouter() { |
| 822 } |
| 948 | 823 |
| 949 void ManagementEventRouter::OnExtensionLoaded( | 824 void ManagementEventRouter::OnExtensionLoaded( |
| 950 content::BrowserContext* browser_context, | 825 content::BrowserContext* browser_context, |
| 951 const Extension* extension) { | 826 const Extension* extension) { |
| 952 BroadcastEvent(extension, management::OnEnabled::kEventName); | 827 BroadcastEvent(extension, management::OnEnabled::kEventName); |
| 953 } | 828 } |
| 954 | 829 |
| 955 void ManagementEventRouter::OnExtensionUnloaded( | 830 void ManagementEventRouter::OnExtensionUnloaded( |
| 956 content::BrowserContext* browser_context, | 831 content::BrowserContext* browser_context, |
| 957 const Extension* extension, | 832 const Extension* extension, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 968 | 843 |
| 969 void ManagementEventRouter::OnExtensionUninstalled( | 844 void ManagementEventRouter::OnExtensionUninstalled( |
| 970 content::BrowserContext* browser_context, | 845 content::BrowserContext* browser_context, |
| 971 const Extension* extension, | 846 const Extension* extension, |
| 972 extensions::UninstallReason reason) { | 847 extensions::UninstallReason reason) { |
| 973 BroadcastEvent(extension, management::OnUninstalled::kEventName); | 848 BroadcastEvent(extension, management::OnUninstalled::kEventName); |
| 974 } | 849 } |
| 975 | 850 |
| 976 void ManagementEventRouter::BroadcastEvent(const Extension* extension, | 851 void ManagementEventRouter::BroadcastEvent(const Extension* extension, |
| 977 const char* event_name) { | 852 const char* event_name) { |
| 978 if (ui_util::ShouldNotBeVisible(extension, browser_context_)) | 853 if (ShouldNotBeVisible(extension, browser_context_)) |
| 979 return; // Don't dispatch events for built-in extenions. | 854 return; // Don't dispatch events for built-in extenions. |
| 980 scoped_ptr<base::ListValue> args(new base::ListValue()); | 855 scoped_ptr<base::ListValue> args(new base::ListValue()); |
| 981 if (event_name == management::OnUninstalled::kEventName) { | 856 if (event_name == management::OnUninstalled::kEventName) { |
| 982 args->Append(new base::StringValue(extension->id())); | 857 args->Append(new base::StringValue(extension->id())); |
| 983 } else { | 858 } else { |
| 984 scoped_ptr<management::ExtensionInfo> info = | 859 scoped_ptr<management::ExtensionInfo> info = |
| 985 CreateExtensionInfo(*extension, ExtensionSystem::Get(browser_context_)); | 860 CreateExtensionInfo(*extension, browser_context_); |
| 986 args->Append(info->ToValue().release()); | 861 args->Append(info->ToValue().release()); |
| 987 } | 862 } |
| 988 | 863 |
| 989 EventRouter::Get(browser_context_) | 864 EventRouter::Get(browser_context_) |
| 990 ->BroadcastEvent(scoped_ptr<Event>(new Event(event_name, args.Pass()))); | 865 ->BroadcastEvent(scoped_ptr<Event>(new Event(event_name, args.Pass()))); |
| 991 } | 866 } |
| 992 | 867 |
| 993 ManagementAPI::ManagementAPI(content::BrowserContext* context) | 868 ManagementAPI::ManagementAPI(content::BrowserContext* context) |
| 994 : browser_context_(context) { | 869 : browser_context_(context), |
| 870 delegate_(ExtensionsAPIClient::Get()->CreateManagementAPIDelegate()) { |
| 995 EventRouter* event_router = EventRouter::Get(browser_context_); | 871 EventRouter* event_router = EventRouter::Get(browser_context_); |
| 996 event_router->RegisterObserver(this, management::OnInstalled::kEventName); | 872 event_router->RegisterObserver(this, management::OnInstalled::kEventName); |
| 997 event_router->RegisterObserver(this, management::OnUninstalled::kEventName); | 873 event_router->RegisterObserver(this, management::OnUninstalled::kEventName); |
| 998 event_router->RegisterObserver(this, management::OnEnabled::kEventName); | 874 event_router->RegisterObserver(this, management::OnEnabled::kEventName); |
| 999 event_router->RegisterObserver(this, management::OnDisabled::kEventName); | 875 event_router->RegisterObserver(this, management::OnDisabled::kEventName); |
| 1000 } | 876 } |
| 1001 | 877 |
| 1002 ManagementAPI::~ManagementAPI() { | 878 ManagementAPI::~ManagementAPI() { |
| 1003 } | 879 } |
| 1004 | 880 |
| 1005 void ManagementAPI::Shutdown() { | 881 void ManagementAPI::Shutdown() { |
| 1006 EventRouter::Get(browser_context_)->UnregisterObserver(this); | 882 EventRouter::Get(browser_context_)->UnregisterObserver(this); |
| 1007 } | 883 } |
| 1008 | 884 |
| 1009 static base::LazyInstance<BrowserContextKeyedAPIFactory<ManagementAPI> > | 885 static base::LazyInstance<BrowserContextKeyedAPIFactory<ManagementAPI>> |
| 1010 g_factory = LAZY_INSTANCE_INITIALIZER; | 886 g_factory = LAZY_INSTANCE_INITIALIZER; |
| 1011 | 887 |
| 1012 // static | 888 // static |
| 1013 BrowserContextKeyedAPIFactory<ManagementAPI>* | 889 BrowserContextKeyedAPIFactory<ManagementAPI>* |
| 1014 ManagementAPI::GetFactoryInstance() { | 890 ManagementAPI::GetFactoryInstance() { |
| 1015 return g_factory.Pointer(); | 891 return g_factory.Pointer(); |
| 1016 } | 892 } |
| 1017 | 893 |
| 1018 void ManagementAPI::OnListenerAdded(const EventListenerInfo& details) { | 894 void ManagementAPI::OnListenerAdded(const EventListenerInfo& details) { |
| 1019 management_event_router_.reset(new ManagementEventRouter(browser_context_)); | 895 management_event_router_.reset(new ManagementEventRouter(browser_context_)); |
| 1020 EventRouter::Get(browser_context_)->UnregisterObserver(this); | 896 EventRouter::Get(browser_context_)->UnregisterObserver(this); |
| 1021 } | 897 } |
| 1022 | 898 |
| 1023 } // namespace extensions | 899 } // namespace extensions |
| OLD | NEW |