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

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

Issue 14490002: Start refactoring extension reloading to avoid redundant reloads. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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 710 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 if (host && DevToolsAgentHost::HasFor(host->render_view_host())) { 721 if (host && DevToolsAgentHost::HasFor(host->render_view_host())) {
722 // Look for an open inspector for the background page. 722 // Look for an open inspector for the background page.
723 std::string devtools_cookie = DevToolsAgentHost::DisconnectRenderViewHost( 723 std::string devtools_cookie = DevToolsAgentHost::DisconnectRenderViewHost(
724 host->render_view_host()); 724 host->render_view_host());
725 if (devtools_cookie != std::string()) 725 if (devtools_cookie != std::string())
726 orphaned_dev_tools_[extension_id] = devtools_cookie; 726 orphaned_dev_tools_[extension_id] = devtools_cookie;
727 } 727 }
728 728
729 path = current_extension->path(); 729 path = current_extension->path();
730 DisableExtension(extension_id, Extension::DISABLE_RELOAD); 730 DisableExtension(extension_id, Extension::DISABLE_RELOAD);
731 disabled_extension_paths_[extension_id] = path; 731 reloading_extensions_.insert(extension_id);
732 } else { 732 } else {
733 path = unloaded_extension_paths_[extension_id]; 733 path = unloaded_extension_paths_[extension_id];
734 } 734 }
735 735
736 on_load_events_[extension_id] = events; 736 on_load_events_[extension_id] = events;
737 if (events & EVENT_RESTARTED) { 737 if (events & EVENT_RESTARTED) {
738 extension_prefs_->GetSavedFileEntries( 738 extension_prefs_->GetSavedFileEntries(
739 extension_id, &on_restart_file_entries_[extension_id]); 739 extension_id, &on_restart_file_entries_[extension_id]);
740 } 740 }
741 741
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
1515 // Honor user choice and skip installation/enabling. 1515 // Honor user choice and skip installation/enabling.
1516 if (IsExternalExtensionUninstalled(id)) { 1516 if (IsExternalExtensionUninstalled(id)) {
1517 LOG(WARNING) << "Extension with id " << id 1517 LOG(WARNING) << "Extension with id " << id
1518 << " from sync was uninstalled as external extension"; 1518 << " from sync was uninstalled as external extension";
1519 return true; 1519 return true;
1520 } 1520 }
1521 1521
1522 // Set user settings. 1522 // Set user settings.
1523 // If the extension has been disabled from sync, it may not have 1523 // If the extension has been disabled from sync, it may not have
1524 // been installed yet, so we don't know if the disable reason was a 1524 // been installed yet, so we don't know if the disable reason was a
1525 // permissions increase. That will be updated once InitializePermissions 1525 // permissions increase. That will be updated once CheckPermissionsIncrease
1526 // is called for it. 1526 // is called for it.
1527 if (extension_sync_data.enabled()) 1527 if (extension_sync_data.enabled())
1528 EnableExtension(id); 1528 EnableExtension(id);
1529 else 1529 else
1530 DisableExtension(id, Extension::DISABLE_UNKNOWN_FROM_SYNC); 1530 DisableExtension(id, Extension::DISABLE_UNKNOWN_FROM_SYNC);
1531 1531
1532 // We need to cache some version information here because setting the 1532 // We need to cache some version information here because setting the
1533 // incognito flag invalidates the |extension| pointer (it reloads the 1533 // incognito flag invalidates the |extension| pointer (it reloads the
1534 // extension). 1534 // extension).
1535 bool extension_installed = (extension != NULL); 1535 bool extension_installed = (extension != NULL);
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1899 // clean up its RequestContexts. 1899 // clean up its RequestContexts.
1900 system_->UnregisterExtensionWithRequestContexts(extension_id, reason); 1900 system_->UnregisterExtensionWithRequestContexts(extension_id, reason);
1901 return; 1901 return;
1902 } 1902 }
1903 1903
1904 // Keep information about the extension so that we can reload it later 1904 // Keep information about the extension so that we can reload it later
1905 // even if it's not permanently installed. 1905 // even if it's not permanently installed.
1906 unloaded_extension_paths_[extension->id()] = extension->path(); 1906 unloaded_extension_paths_[extension->id()] = extension->path();
1907 1907
1908 // Clean up if the extension is meant to be enabled after a reload. 1908 // Clean up if the extension is meant to be enabled after a reload.
1909 disabled_extension_paths_.erase(extension->id()); 1909 reloading_extensions_.erase(extension->id());
1910 1910
1911 // Clean up runtime data. 1911 // Clean up runtime data.
1912 extension_runtime_data_.erase(extension_id); 1912 extension_runtime_data_.erase(extension_id);
1913 1913
1914 if (disabled_extensions_.Contains(extension->id())) { 1914 if (disabled_extensions_.Contains(extension->id())) {
1915 UnloadedExtensionInfo details(extension, reason); 1915 UnloadedExtensionInfo details(extension, reason);
1916 details.already_disabled = true; 1916 details.already_disabled = true;
1917 disabled_extensions_.Remove(extension->id()); 1917 disabled_extensions_.Remove(extension->id());
1918 content::NotificationService::current()->Notify( 1918 content::NotificationService::current()->Notify(
1919 chrome::NOTIFICATION_EXTENSION_UNLOADED, 1919 chrome::NOTIFICATION_EXTENSION_UNLOADED,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2027 // TODO(jstritar): We may be able to get rid of this branch by overriding the 2027 // TODO(jstritar): We may be able to get rid of this branch by overriding the
2028 // default extension state to DISABLED when the --disable-extensions flag 2028 // default extension state to DISABLED when the --disable-extensions flag
2029 // is set (http://crbug.com/29067). 2029 // is set (http://crbug.com/29067).
2030 if (!extensions_enabled() && 2030 if (!extensions_enabled() &&
2031 !extension->is_theme() && 2031 !extension->is_theme() &&
2032 extension->location() != Manifest::COMPONENT && 2032 extension->location() != Manifest::COMPONENT &&
2033 !Manifest::IsExternalLocation(extension->location())) { 2033 !Manifest::IsExternalLocation(extension->location())) {
2034 return; 2034 return;
2035 } 2035 }
2036 2036
2037 SetBeingUpgraded(extension, false); 2037 bool is_extension_upgrade = false;
2038 if (const Extension* old = GetInstalledExtension(extension->id())) {
2039 is_extension_upgrade = true;
2040 DCHECK_NE(extension, old);
2041 // Other than for unpacked extensions, CrxInstaller should have guaranteed
2042 // that we aren't downgrading.
2043 if (!Manifest::IsUnpackedLocation(extension->location()))
2044 CHECK_GE(extension->version()->CompareTo(*(old->version())), 0);
2045 }
2046 SetBeingUpgraded(extension, is_extension_upgrade);
2038 2047
2039 // The extension is now loaded, remove its data from unloaded extension map. 2048 // The extension is now loaded, remove its data from unloaded extension map.
2040 unloaded_extension_paths_.erase(extension->id()); 2049 unloaded_extension_paths_.erase(extension->id());
2041 2050
2042 // If a terminated extension is loaded, remove it from the terminated list. 2051 // If a terminated extension is loaded, remove it from the terminated list.
2043 UntrackTerminatedExtension(extension->id()); 2052 UntrackTerminatedExtension(extension->id());
2044 2053
2045 // If the extension was disabled for a reload, then enable it. 2054 // If the extension was disabled for a reload, then enable it.
2046 if (disabled_extension_paths_.erase(extension->id()) > 0) 2055 if (reloading_extensions_.erase(extension->id()) > 0)
2047 EnableExtension(extension->id()); 2056 EnableExtension(extension->id());
Jeffrey Yasskin 2013/04/25 01:53:37 This Enable followed by Unload can cause an extra
Matt Perry 2013/04/25 19:03:46 Do you mean the Unload on line 2065? Can you just
Jeffrey Yasskin 2013/04/25 19:12:28 Not immediately, that breaks tests. :) I'm figurin
2048 2057
2049 // Check if the extension's privileges have changed and disable the 2058 // Check if the extension's privileges have changed and mark the
2050 // extension if necessary. 2059 // extension disabled if necessary.
2051 InitializePermissions(extension); 2060 CheckPermissionsIncrease(extension, is_extension_upgrade);
2061
2062 if (is_extension_upgrade) {
2063 // To upgrade an extension in place, unload the old one and
2064 // then load the new one.
2065 UnloadExtension(extension->id(), extension_misc::UNLOAD_REASON_UPDATE);
2066 }
2052 2067
2053 if (extension_prefs_->IsExtensionBlacklisted(extension->id())) { 2068 if (extension_prefs_->IsExtensionBlacklisted(extension->id())) {
2054 // Only prefs is checked for the blacklist. We rely on callers to check the 2069 // Only prefs is checked for the blacklist. We rely on callers to check the
2055 // blacklist before calling into here, e.g. CrxInstaller checks before 2070 // blacklist before calling into here, e.g. CrxInstaller checks before
2056 // installation, we check when loading installed extensions. 2071 // installation, we check when loading installed extensions.
2057 blacklisted_extensions_.Insert(extension); 2072 blacklisted_extensions_.Insert(extension);
2058 } else if (extension_prefs_->IsExtensionDisabled(extension->id())) { 2073 } else if (extension_prefs_->IsExtensionDisabled(extension->id())) {
2059 disabled_extensions_.Insert(extension); 2074 disabled_extensions_.Insert(extension);
2060 SyncExtensionChangeIfNeeded(*extension); 2075 SyncExtensionChangeIfNeeded(*extension);
2061 content::NotificationService::current()->Notify( 2076 content::NotificationService::current()->Notify(
(...skipping 17 matching lines...) Expand all
2079 } 2094 }
2080 extension_prefs_->extension_sorting()->EnsureValidOrdinals( 2095 extension_prefs_->extension_sorting()->EnsureValidOrdinals(
2081 extension->id(), syncer::StringOrdinal()); 2096 extension->id(), syncer::StringOrdinal());
2082 } 2097 }
2083 2098
2084 extensions_.Insert(extension); 2099 extensions_.Insert(extension);
2085 SyncExtensionChangeIfNeeded(*extension); 2100 SyncExtensionChangeIfNeeded(*extension);
2086 NotifyExtensionLoaded(extension); 2101 NotifyExtensionLoaded(extension);
2087 DoPostLoadTasks(extension); 2102 DoPostLoadTasks(extension);
2088 } 2103 }
2104 SetBeingUpgraded(extension, false);
Jeffrey Yasskin 2013/04/25 01:53:37 This should be late enough to cover the uses insid
2089 } 2105 }
2090 2106
2091 void ExtensionService::AddComponentExtension(const Extension* extension) { 2107 void ExtensionService::AddComponentExtension(const Extension* extension) {
2092 const std::string old_version_string( 2108 const std::string old_version_string(
2093 extension_prefs_->GetVersionString(extension->id())); 2109 extension_prefs_->GetVersionString(extension->id()));
2094 const Version old_version(old_version_string); 2110 const Version old_version(old_version_string);
2095 2111
2096 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) { 2112 if (!old_version.IsValid() || !old_version.Equals(*extension->version())) {
2097 VLOG(1) << "Component extension " << extension->name() << " (" 2113 VLOG(1) << "Component extension " << extension->name() << " ("
2098 << extension->id() << ") installing/upgrading from '" 2114 << extension->id() << ") installing/upgrading from '"
2099 << old_version_string << "' to " << extension->version()->GetString(); 2115 << old_version_string << "' to " << extension->version()->GetString();
2100 2116
2101 AddNewOrUpdatedExtension(extension, 2117 AddNewOrUpdatedExtension(extension,
2102 Extension::ENABLED_COMPONENT, 2118 Extension::ENABLED_COMPONENT,
2103 syncer::StringOrdinal()); 2119 syncer::StringOrdinal());
2104 return; 2120 return;
2105 } 2121 }
2106 2122
2107 AddExtension(extension); 2123 AddExtension(extension);
2108 } 2124 }
2109 2125
2110 void ExtensionService::InitializePermissions(const Extension* extension) { 2126 void ExtensionService::UpdateActivePermissions(const Extension* extension) {
2111 // If the extension has used the optional permissions API, it will have a 2127 // If the extension has used the optional permissions API, it will have a
2112 // custom set of active permissions defined in the extension prefs. Here, 2128 // custom set of active permissions defined in the extension prefs. Here,
2113 // we update the extension's active permissions based on the prefs. 2129 // we update the extension's active permissions based on the prefs.
2114 scoped_refptr<PermissionSet> active_permissions = 2130 scoped_refptr<PermissionSet> active_permissions =
2115 extension_prefs()->GetActivePermissions(extension->id()); 2131 extension_prefs()->GetActivePermissions(extension->id());
2116 2132
2117 if (active_permissions) { 2133 if (active_permissions) {
2118 // We restrict the active permissions to be within the bounds defined in the 2134 // We restrict the active permissions to be within the bounds defined in the
2119 // extension's manifest. 2135 // extension's manifest.
2120 // a) active permissions must be a subset of optional + default permissions 2136 // a) active permissions must be a subset of optional + default permissions
2121 // b) active permissions must contains all default permissions 2137 // b) active permissions must contains all default permissions
2122 scoped_refptr<PermissionSet> total_permissions = 2138 scoped_refptr<PermissionSet> total_permissions =
2123 PermissionSet::CreateUnion( 2139 PermissionSet::CreateUnion(
2124 extension->required_permission_set(), 2140 extension->required_permission_set(),
2125 extension->optional_permission_set()); 2141 extension->optional_permission_set());
2126 2142
2127 // Make sure the active permissions contain no more than optional + default. 2143 // Make sure the active permissions contain no more than optional + default.
2128 scoped_refptr<PermissionSet> adjusted_active = 2144 scoped_refptr<PermissionSet> adjusted_active =
2129 PermissionSet::CreateIntersection( 2145 PermissionSet::CreateIntersection(
2130 total_permissions.get(), active_permissions.get()); 2146 total_permissions.get(), active_permissions.get());
2131 2147
2132 // Make sure the active permissions contain the default permissions. 2148 // Make sure the active permissions contain the default permissions.
2133 adjusted_active = PermissionSet::CreateUnion( 2149 adjusted_active = PermissionSet::CreateUnion(
2134 extension->required_permission_set(), adjusted_active.get()); 2150 extension->required_permission_set(), adjusted_active.get());
2135 2151
2136 extensions::PermissionsUpdater perms_updater(profile()); 2152 extensions::PermissionsUpdater perms_updater(profile());
2137 perms_updater.UpdateActivePermissions(extension, adjusted_active); 2153 perms_updater.UpdateActivePermissions(extension, adjusted_active);
2138 } 2154 }
2155 }
2156
2157 void ExtensionService::CheckPermissionsIncrease(const Extension* extension,
2158 bool is_extension_upgrade) {
2159 UpdateActivePermissions(extension);
2139 2160
2140 // We keep track of all permissions the user has granted each extension. 2161 // We keep track of all permissions the user has granted each extension.
2141 // This allows extensions to gracefully support backwards compatibility 2162 // This allows extensions to gracefully support backwards compatibility
2142 // by including unknown permissions in their manifests. When the user 2163 // by including unknown permissions in their manifests. When the user
2143 // installs the extension, only the recognized permissions are recorded. 2164 // installs the extension, only the recognized permissions are recorded.
2144 // When the unknown permissions become recognized (e.g., through browser 2165 // When the unknown permissions become recognized (e.g., through browser
2145 // upgrade), we can prompt the user to accept these new permissions. 2166 // upgrade), we can prompt the user to accept these new permissions.
2146 // Extensions can also silently upgrade to less permissions, and then 2167 // Extensions can also silently upgrade to less permissions, and then
2147 // silently upgrade to a version that adds these permissions back. 2168 // silently upgrade to a version that adds these permissions back.
2148 // 2169 //
2149 // For example, pretend that Chrome 10 includes a permission "omnibox" 2170 // For example, pretend that Chrome 10 includes a permission "omnibox"
2150 // for an API that adds suggestions to the omnibox. An extension can 2171 // for an API that adds suggestions to the omnibox. An extension can
2151 // maintain backwards compatibility while still having "omnibox" in the 2172 // maintain backwards compatibility while still having "omnibox" in the
2152 // manifest. If a user installs the extension on Chrome 9, the browser 2173 // manifest. If a user installs the extension on Chrome 9, the browser
2153 // will record the permissions it recognized, not including "omnibox." 2174 // will record the permissions it recognized, not including "omnibox."
2154 // When upgrading to Chrome 10, "omnibox" will be recognized and Chrome 2175 // When upgrading to Chrome 10, "omnibox" will be recognized and Chrome
2155 // will disable the extension and prompt the user to approve the increase 2176 // will disable the extension and prompt the user to approve the increase
2156 // in privileges. The extension could then release a new version that 2177 // in privileges. The extension could then release a new version that
2157 // removes the "omnibox" permission. When the user upgrades, Chrome will 2178 // removes the "omnibox" permission. When the user upgrades, Chrome will
2158 // still remember that "omnibox" had been granted, so that if the 2179 // still remember that "omnibox" had been granted, so that if the
2159 // extension once again includes "omnibox" in an upgrade, the extension 2180 // extension once again includes "omnibox" in an upgrade, the extension
2160 // can upgrade without requiring this user's approval. 2181 // can upgrade without requiring this user's approval.
2161 const Extension* old = GetInstalledExtension(extension->id());
2162 bool is_extension_upgrade = old != NULL;
2163 bool is_privilege_increase = false;
2164 bool previously_disabled = false;
2165 int disable_reasons = extension_prefs_->GetDisableReasons(extension->id()); 2182 int disable_reasons = extension_prefs_->GetDisableReasons(extension->id());
2166 2183
2184 bool is_default_app_install =
2185 (!is_extension_upgrade && extension->was_installed_by_default());
2186 // Silently grant all active permissions to default apps only on install.
2187 // After install they should behave like other apps.
2188 if (is_default_app_install)
2189 GrantPermissions(extension);
2190
2191 bool is_privilege_increase = false;
2167 // We only need to compare the granted permissions to the current permissions 2192 // We only need to compare the granted permissions to the current permissions
2168 // if the extension is not allowed to silently increase its permissions. 2193 // if the extension is not allowed to silently increase its permissions.
2169 bool is_default_app_install = 2194 if (!(extension->CanSilentlyIncreasePermissions() ||
2170 (!is_extension_upgrade && extension->was_installed_by_default()); 2195 is_default_app_install)) {
2171 if (!(extension->CanSilentlyIncreasePermissions()
2172 || is_default_app_install)) {
2173 // Add all the recognized permissions if the granted permissions list 2196 // Add all the recognized permissions if the granted permissions list
Jeffrey Yasskin 2013/04/25 01:53:37 This isn't actually the effect of the next line, a
2174 // hasn't been initialized yet. 2197 // hasn't been initialized yet.
2175 scoped_refptr<PermissionSet> granted_permissions = 2198 scoped_refptr<PermissionSet> granted_permissions =
2176 extension_prefs_->GetGrantedPermissions(extension->id()); 2199 extension_prefs_->GetGrantedPermissions(extension->id());
2177 CHECK(granted_permissions.get()); 2200 CHECK(granted_permissions.get());
2178 2201
2179 // Here, we check if an extension's privileges have increased in a manner 2202 // Here, we check if an extension's privileges have increased in a manner
2180 // that requires the user's approval. This could occur because the browser 2203 // that requires the user's approval. This could occur because the browser
2181 // upgraded and recognized additional privileges, or an extension upgrades 2204 // upgraded and recognized additional privileges, or an extension upgrades
2182 // to a version that requires additional privileges. 2205 // to a version that requires additional privileges.
2183 is_privilege_increase = 2206 is_privilege_increase =
2184 granted_permissions->HasLessPrivilegesThan( 2207 granted_permissions->HasLessPrivilegesThan(
2185 extension->GetActivePermissions()); 2208 extension->GetActivePermissions());
2186 } 2209 }
2187 2210
2188 // Silently grant all active permissions to default apps only on install.
2189 // After install they should behave like other apps.
2190 if (is_default_app_install)
2191 GrantPermissions(extension);
2192
2193 if (is_extension_upgrade) { 2211 if (is_extension_upgrade) {
2194 // Other than for unpacked extensions, CrxInstaller should have guaranteed
2195 // that we aren't downgrading.
2196 if (!Manifest::IsUnpackedLocation(extension->location()))
2197 CHECK_GE(extension->version()->CompareTo(*(old->version())), 0);
2198
2199 // Extensions get upgraded if the privileges are allowed to increase or
2200 // the privileges haven't increased.
2201 if (!is_privilege_increase) {
2202 SetBeingUpgraded(old, true);
2203 SetBeingUpgraded(extension, true);
2204 }
2205
2206 // If the extension was already disabled, suppress any alerts for becoming 2212 // If the extension was already disabled, suppress any alerts for becoming
2207 // disabled on permissions increase. 2213 // disabled on permissions increase.
2208 previously_disabled = extension_prefs_->IsExtensionDisabled(old->id()); 2214 bool previously_disabled =
2215 extension_prefs_->IsExtensionDisabled(extension->id());
2209 // Legacy disabled extensions do not have a disable reason. Infer that if 2216 // Legacy disabled extensions do not have a disable reason. Infer that if
2210 // there was no permission increase, it was likely disabled by the user. 2217 // there was no permission increase, it was likely disabled by the user.
2211 if (previously_disabled && disable_reasons == Extension::DISABLE_NONE && 2218 if (previously_disabled && disable_reasons == Extension::DISABLE_NONE &&
2212 !extension_prefs_->DidExtensionEscalatePermissions(old->id())) { 2219 !extension_prefs_->DidExtensionEscalatePermissions(extension->id())) {
2213 disable_reasons |= Extension::DISABLE_USER_ACTION; 2220 disable_reasons |= Extension::DISABLE_USER_ACTION;
2214 } 2221 }
2215 // Extensions that came to us disabled from sync need a similar inference, 2222 // Extensions that came to us disabled from sync need a similar inference,
2216 // except based on the new version's permissions. 2223 // except based on the new version's permissions.
2217 if (previously_disabled && 2224 if (previously_disabled &&
2218 disable_reasons == Extension::DISABLE_UNKNOWN_FROM_SYNC) { 2225 disable_reasons == Extension::DISABLE_UNKNOWN_FROM_SYNC) {
2219 // Remove the DISABLE_UNKNOWN_FROM_SYNC reason. 2226 // Remove the DISABLE_UNKNOWN_FROM_SYNC reason.
2220 extension_prefs_->ClearDisableReasons(extension->id()); 2227 extension_prefs_->ClearDisableReasons(extension->id());
Jeffrey Yasskin 2013/04/25 01:53:37 If there's no privilege increase, this will drop a
Matt Perry 2013/04/25 19:03:46 Seems harmless here, though, because disable_reaso
Jeffrey Yasskin 2013/04/25 19:12:28 We want to clear that and add DISABLE_USER_ACTION.
Matt Perry 2013/04/25 19:22:43 We only add DISABLE_USER_ACTION if it's *not* a pr
Yoyo Zhou 2013/04/25 19:24:39 I think we (I, specifically) forgot to actually ad
Matt Perry 2013/04/25 19:29:55 Oh right, because we only AddDisableReason if it's
2221 if (!is_privilege_increase) 2228 if (!is_privilege_increase)
2222 disable_reasons |= Extension::DISABLE_USER_ACTION; 2229 disable_reasons |= Extension::DISABLE_USER_ACTION;
2223 } 2230 }
2224 if (disable_reasons != Extension::DISABLE_NONE) 2231 if (disable_reasons != Extension::DISABLE_NONE)
2225 disable_reasons &= ~Extension::DISABLE_UNKNOWN_FROM_SYNC; 2232 disable_reasons &= ~Extension::DISABLE_UNKNOWN_FROM_SYNC;
Jeffrey Yasskin 2013/04/25 01:53:37 This has no effect unless the ClearDisableReasons
Yoyo Zhou 2013/04/25 19:21:58 This logic is quite complicated to compensate for
Jeffrey Yasskin 2013/04/26 00:52:44 Moving SetExtensionState broke a ManagementPolicy
2226
2227 // To upgrade an extension in place, unload the old one and
2228 // then load the new one.
2229 UnloadExtension(old->id(), extension_misc::UNLOAD_REASON_UPDATE);
2230 old = NULL;
2231 } 2233 }
2232 2234
2233 // Extension has changed permissions significantly. Disable it. A 2235 // Extension has changed permissions significantly. Disable it. A
2234 // notification should be sent by the caller. 2236 // notification should be sent by the caller.
2235 if (is_privilege_increase) { 2237 if (is_privilege_increase) {
2236 disable_reasons |= Extension::DISABLE_PERMISSIONS_INCREASE; 2238 disable_reasons |= Extension::DISABLE_PERMISSIONS_INCREASE;
2237 if (!extension_prefs_->DidExtensionEscalatePermissions(extension->id())) { 2239 if (!extension_prefs_->DidExtensionEscalatePermissions(extension->id())) {
2238 RecordPermissionMessagesHistogram( 2240 RecordPermissionMessagesHistogram(
2239 extension, "Extensions.Permissions_AutoDisable"); 2241 extension, "Extensions.Permissions_AutoDisable");
2240 } 2242 }
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
2774 } 2776 }
2775 2777
2776 bool ExtensionService::IsBeingUpgraded(const Extension* extension) const { 2778 bool ExtensionService::IsBeingUpgraded(const Extension* extension) const {
2777 ExtensionRuntimeDataMap::const_iterator it = 2779 ExtensionRuntimeDataMap::const_iterator it =
2778 extension_runtime_data_.find(extension->id()); 2780 extension_runtime_data_.find(extension->id());
2779 return it == extension_runtime_data_.end() ? false : 2781 return it == extension_runtime_data_.end() ? false :
2780 it->second.being_upgraded; 2782 it->second.being_upgraded;
2781 } 2783 }
2782 2784
2783 void ExtensionService::SetBeingUpgraded(const Extension* extension, 2785 void ExtensionService::SetBeingUpgraded(const Extension* extension,
2784 bool value) { 2786 bool value) {
2785 extension_runtime_data_[extension->id()].being_upgraded = value; 2787 extension_runtime_data_[extension->id()].being_upgraded = value;
2786 } 2788 }
2787 2789
2788 bool ExtensionService::HasUsedWebRequest(const Extension* extension) const { 2790 bool ExtensionService::HasUsedWebRequest(const Extension* extension) const {
2789 ExtensionRuntimeDataMap::const_iterator it = 2791 ExtensionRuntimeDataMap::const_iterator it =
2790 extension_runtime_data_.find(extension->id()); 2792 extension_runtime_data_.find(extension->id());
2791 return it == extension_runtime_data_.end() ? false : 2793 return it == extension_runtime_data_.end() ? false :
2792 it->second.has_used_webrequest; 2794 it->second.has_used_webrequest;
2793 } 2795 }
2794 2796
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
3090 } 3092 }
3091 3093
3092 void ExtensionService::AddUpdateObserver(extensions::UpdateObserver* observer) { 3094 void ExtensionService::AddUpdateObserver(extensions::UpdateObserver* observer) {
3093 update_observers_.AddObserver(observer); 3095 update_observers_.AddObserver(observer);
3094 } 3096 }
3095 3097
3096 void ExtensionService::RemoveUpdateObserver( 3098 void ExtensionService::RemoveUpdateObserver(
3097 extensions::UpdateObserver* observer) { 3099 extensions::UpdateObserver* observer) {
3098 update_observers_.RemoveObserver(observer); 3100 update_observers_.RemoveObserver(observer);
3099 } 3101 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698