Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: chrome/browser/extensions/extension_service.cc

Issue 182253010: Register a Service Worker when an extension is enabled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Roughly wire things up and add a test Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/extension_service.h" 5 #include "chrome/browser/extensions/extension_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 #include <set> 9 #include <set>
10 10
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 #include "extensions/browser/extension_registry.h" 77 #include "extensions/browser/extension_registry.h"
78 #include "extensions/browser/extension_system.h" 78 #include "extensions/browser/extension_system.h"
79 #include "extensions/browser/extensions_browser_client.h" 79 #include "extensions/browser/extensions_browser_client.h"
80 #include "extensions/browser/external_provider_interface.h" 80 #include "extensions/browser/external_provider_interface.h"
81 #include "extensions/browser/management_policy.h" 81 #include "extensions/browser/management_policy.h"
82 #include "extensions/browser/pending_extension_manager.h" 82 #include "extensions/browser/pending_extension_manager.h"
83 #include "extensions/browser/pref_names.h" 83 #include "extensions/browser/pref_names.h"
84 #include "extensions/browser/process_manager.h" 84 #include "extensions/browser/process_manager.h"
85 #include "extensions/browser/process_map.h" 85 #include "extensions/browser/process_map.h"
86 #include "extensions/browser/runtime_data.h" 86 #include "extensions/browser/runtime_data.h"
87 #include "extensions/browser/service_worker_manager.h"
87 #include "extensions/browser/update_observer.h" 88 #include "extensions/browser/update_observer.h"
88 #include "extensions/common/constants.h" 89 #include "extensions/common/constants.h"
89 #include "extensions/common/error_utils.h" 90 #include "extensions/common/error_utils.h"
90 #include "extensions/common/extension.h" 91 #include "extensions/common/extension.h"
91 #include "extensions/common/extensions_client.h" 92 #include "extensions/common/extensions_client.h"
92 #include "extensions/common/feature_switch.h" 93 #include "extensions/common/feature_switch.h"
93 #include "extensions/common/manifest.h" 94 #include "extensions/common/manifest.h"
94 #include "extensions/common/manifest_constants.h" 95 #include "extensions/common/manifest_constants.h"
95 #include "extensions/common/manifest_handlers/background_info.h" 96 #include "extensions/common/manifest_handlers/background_info.h"
96 #include "extensions/common/manifest_handlers/incognito_info.h" 97 #include "extensions/common/manifest_handlers/incognito_info.h"
97 #include "extensions/common/manifest_handlers/shared_module_info.h" 98 #include "extensions/common/manifest_handlers/shared_module_info.h"
98 #include "extensions/common/permissions/permission_message_provider.h" 99 #include "extensions/common/permissions/permission_message_provider.h"
99 #include "extensions/common/permissions/permissions_data.h" 100 #include "extensions/common/permissions/permissions_data.h"
100 #include "grit/generated_resources.h" 101 #include "grit/generated_resources.h"
101 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 102 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
102 #include "ui/base/webui/web_ui_util.h" 103 #include "ui/base/webui/web_ui_util.h"
103 #include "url/gurl.h" 104 #include "url/gurl.h"
104 #include "webkit/browser/database/database_tracker.h" 105 #include "webkit/browser/database/database_tracker.h"
105 #include "webkit/browser/database/database_util.h" 106 #include "webkit/browser/database/database_util.h"
106 107
107 #if defined(OS_CHROMEOS) 108 #if defined(OS_CHROMEOS)
108 #include "chrome/browser/chromeos/extensions/install_limiter.h" 109 #include "chrome/browser/chromeos/extensions/install_limiter.h"
109 #include "webkit/browser/fileapi/file_system_backend.h" 110 #include "webkit/browser/fileapi/file_system_backend.h"
110 #include "webkit/browser/fileapi/file_system_context.h" 111 #include "webkit/browser/fileapi/file_system_context.h"
111 #endif 112 #endif
112 113
113 using content::BrowserContext; 114 using content::BrowserContext;
114 using content::BrowserThread; 115 using content::BrowserThread;
115 using content::DevToolsAgentHost; 116 using content::DevToolsAgentHost;
117 using extensions::BackgroundInfo;
116 using extensions::CrxInstaller; 118 using extensions::CrxInstaller;
117 using extensions::Extension; 119 using extensions::Extension;
118 using extensions::ExtensionIdSet; 120 using extensions::ExtensionIdSet;
119 using extensions::ExtensionInfo; 121 using extensions::ExtensionInfo;
120 using extensions::ExtensionRegistry; 122 using extensions::ExtensionRegistry;
121 using extensions::ExtensionSet; 123 using extensions::ExtensionSet;
122 using extensions::FeatureSwitch; 124 using extensions::FeatureSwitch;
123 using extensions::InstallVerifier; 125 using extensions::InstallVerifier;
124 using extensions::ManagementPolicy; 126 using extensions::ManagementPolicy;
125 using extensions::Manifest; 127 using extensions::Manifest;
126 using extensions::PermissionMessage; 128 using extensions::PermissionMessage;
127 using extensions::PermissionMessages; 129 using extensions::PermissionMessages;
128 using extensions::PermissionSet; 130 using extensions::PermissionSet;
131 using extensions::ServiceWorkerManager;
129 using extensions::SharedModuleInfo; 132 using extensions::SharedModuleInfo;
130 using extensions::UnloadedExtensionInfo; 133 using extensions::UnloadedExtensionInfo;
131 134
132 namespace errors = extensions::manifest_errors; 135 namespace errors = extensions::manifest_errors;
133 136
134 namespace { 137 namespace {
135 138
136 // Histogram values for logging events related to externally installed 139 // Histogram values for logging events related to externally installed
137 // extensions. 140 // extensions.
138 enum ExternalExtensionEvent { 141 enum ExternalExtensionEvent {
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 if (!extension) 1045 if (!extension)
1043 return; 1046 return;
1044 1047
1045 // The extension is either enabled or terminated. 1048 // The extension is either enabled or terminated.
1046 DCHECK(registry_->enabled_extensions().Contains(extension->id()) || 1049 DCHECK(registry_->enabled_extensions().Contains(extension->id()) ||
1047 registry_->terminated_extensions().Contains(extension->id())); 1050 registry_->terminated_extensions().Contains(extension->id()));
1048 1051
1049 // Move it over to the disabled list. Don't send a second unload notification 1052 // Move it over to the disabled list. Don't send a second unload notification
1050 // for terminated extensions being disabled. 1053 // for terminated extensions being disabled.
1051 registry_->AddDisabled(make_scoped_refptr(extension)); 1054 registry_->AddDisabled(make_scoped_refptr(extension));
1055
1056 if (BackgroundInfo::HasServiceWorker(extension))
1057 ServiceWorkerManager::Get(profile_)->UnregisterExtension(extension);
1058
1052 if (registry_->enabled_extensions().Contains(extension->id())) { 1059 if (registry_->enabled_extensions().Contains(extension->id())) {
1053 registry_->RemoveEnabled(extension->id()); 1060 registry_->RemoveEnabled(extension->id());
1054 NotifyExtensionUnloaded(extension, UnloadedExtensionInfo::REASON_DISABLE); 1061 NotifyExtensionUnloaded(extension, UnloadedExtensionInfo::REASON_DISABLE);
1055 } else { 1062 } else {
1056 registry_->RemoveTerminated(extension->id()); 1063 registry_->RemoveTerminated(extension->id());
1057 } 1064 }
1058 1065
1059 if (extension_sync_service_) 1066 if (extension_sync_service_)
1060 extension_sync_service_->SyncDisableExtension(*extension); 1067 extension_sync_service_->SyncDisableExtension(*extension);
1061 } 1068 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 if (host_profile->GetOriginalProfile() == 1157 if (host_profile->GetOriginalProfile() ==
1151 profile_->GetOriginalProfile()) { 1158 profile_->GetOriginalProfile()) {
1152 std::vector<ExtensionMsg_Loaded_Params> loaded_extensions( 1159 std::vector<ExtensionMsg_Loaded_Params> loaded_extensions(
1153 1, ExtensionMsg_Loaded_Params(extension)); 1160 1, ExtensionMsg_Loaded_Params(extension));
1154 host->Send( 1161 host->Send(
1155 new ExtensionMsg_Loaded(loaded_extensions)); 1162 new ExtensionMsg_Loaded(loaded_extensions));
1156 } 1163 }
1157 } 1164 }
1158 } 1165 }
1159 1166
1167 if (BackgroundInfo::HasServiceWorker(extension))
1168 ServiceWorkerManager::Get(profile_)->RegisterExtension(extension);
1169
1160 // Tell subsystems that use the EXTENSION_LOADED notification about the new 1170 // Tell subsystems that use the EXTENSION_LOADED notification about the new
1161 // extension. 1171 // extension.
1162 // 1172 //
1163 // NOTE: It is important that this happen after notifying the renderers about 1173 // NOTE: It is important that this happen after notifying the renderers about
1164 // the new extensions so that if we navigate to an extension URL in 1174 // the new extensions so that if we navigate to an extension URL in
1165 // NOTIFICATION_EXTENSION_LOADED, the renderer is guaranteed to know about it. 1175 // NOTIFICATION_EXTENSION_LOADED, the renderer is guaranteed to know about it.
1166 content::NotificationService::current()->Notify( 1176 content::NotificationService::current()->Notify(
1167 chrome::NOTIFICATION_EXTENSION_LOADED, 1177 chrome::NOTIFICATION_EXTENSION_LOADED,
1168 content::Source<Profile>(profile_), 1178 content::Source<Profile>(profile_),
1169 content::Details<const Extension>(extension)); 1179 content::Details<const Extension>(extension));
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 registry_->RemoveDisabled(extension->id()); 1657 registry_->RemoveDisabled(extension->id());
1648 // Make sure the profile cleans up its RequestContexts when an already 1658 // Make sure the profile cleans up its RequestContexts when an already
1649 // disabled extension is unloaded (since they are also tracking the disabled 1659 // disabled extension is unloaded (since they are also tracking the disabled
1650 // extensions). 1660 // extensions).
1651 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); 1661 system_->UnregisterExtensionWithRequestContexts(extension_id, reason);
1652 // Don't send the unloaded notification. It was sent when the extension 1662 // Don't send the unloaded notification. It was sent when the extension
1653 // was disabled. 1663 // was disabled.
1654 } else { 1664 } else {
1655 // Remove the extension from the enabled list. 1665 // Remove the extension from the enabled list.
1656 registry_->RemoveEnabled(extension->id()); 1666 registry_->RemoveEnabled(extension->id());
1667
1668 if (BackgroundInfo::HasServiceWorker(extension)) {
1669 switch (reason) {
1670 case UnloadedExtensionInfo::REASON_DISABLE:
1671 case UnloadedExtensionInfo::REASON_UNINSTALL:
1672 case UnloadedExtensionInfo::REASON_BLACKLIST:
1673 ServiceWorkerManager::Get(profile_)->UnregisterExtension(extension);
1674 break;
1675 case UnloadedExtensionInfo::REASON_UPDATE:
1676 case UnloadedExtensionInfo::REASON_TERMINATE:
1677 break;
1678 }
1679 }
1657 NotifyExtensionUnloaded(extension.get(), reason); 1680 NotifyExtensionUnloaded(extension.get(), reason);
1658 } 1681 }
1659 1682
1660 content::NotificationService::current()->Notify( 1683 content::NotificationService::current()->Notify(
1661 chrome::NOTIFICATION_EXTENSION_REMOVED, 1684 chrome::NOTIFICATION_EXTENSION_REMOVED,
1662 content::Source<Profile>(profile_), 1685 content::Source<Profile>(profile_),
1663 content::Details<const Extension>(extension.get())); 1686 content::Details<const Extension>(extension.get()));
1664 } 1687 }
1665 1688
1666 void ExtensionService::RemoveComponentExtension( 1689 void ExtensionService::RemoveComponentExtension(
(...skipping 1220 matching lines...) Expand 10 before | Expand all | Expand 10 after
2887 void ExtensionService::UnloadAllExtensionsInternal() { 2910 void ExtensionService::UnloadAllExtensionsInternal() {
2888 profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForAllExtensions(); 2911 profile_->GetExtensionSpecialStoragePolicy()->RevokeRightsForAllExtensions();
2889 2912
2890 registry_->ClearAll(); 2913 registry_->ClearAll();
2891 system_->runtime_data()->ClearAll(); 2914 system_->runtime_data()->ClearAll();
2892 2915
2893 // TODO(erikkay) should there be a notification for this? We can't use 2916 // TODO(erikkay) should there be a notification for this? We can't use
2894 // EXTENSION_UNLOADED since that implies that the extension has been disabled 2917 // EXTENSION_UNLOADED since that implies that the extension has been disabled
2895 // or uninstalled. 2918 // or uninstalled.
2896 } 2919 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698