| Index: chrome/browser/extensions/extension_service.cc
|
| diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
|
| index 755c7d6285113a0cdbd854fd6d744f961014bd3a..ec74802e6a1e4034735774a8658b8e78e18a1530 100644
|
| --- a/chrome/browser/extensions/extension_service.cc
|
| +++ b/chrome/browser/extensions/extension_service.cc
|
| @@ -551,6 +551,7 @@ ExtensionService::ExtensionService(Profile* profile,
|
| show_extensions_prompts_(true),
|
| ready_(false),
|
| toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
|
| + permissions_manager_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
|
| apps_promo_(profile->GetPrefs()),
|
| event_routers_initialized_(false) {
|
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -983,7 +984,7 @@ void ExtensionService::GrantPermissions(const Extension* extension) {
|
| CHECK_EQ(Extension::INTERNAL, extension->location());
|
|
|
| extension_prefs_->AddGrantedPermissions(extension->id(),
|
| - extension->permission_set());
|
| + extension->GetActivePermissions());
|
| }
|
|
|
| void ExtensionService::GrantPermissionsAndEnableExtension(
|
| @@ -996,6 +997,13 @@ void ExtensionService::GrantPermissionsAndEnableExtension(
|
| EnableExtension(extension->id());
|
| }
|
|
|
| +void ExtensionService::UpdateActivePermissions(
|
| + const Extension* extension,
|
| + const ExtensionPermissionSet* permissions) {
|
| + extension_prefs()->SetActivePermissions(extension->id(), permissions);
|
| + extension->SetActivePermissions(permissions);
|
| +}
|
| +
|
| void ExtensionService::LoadExtension(const FilePath& extension_path) {
|
| BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| NewRunnableMethod(backend_.get(),
|
| @@ -1306,7 +1314,8 @@ void ExtensionService::NotifyExtensionLoaded(const Extension* extension) {
|
| if (host->profile()->GetOriginalProfile() ==
|
| profile_->GetOriginalProfile()) {
|
| host->Send(
|
| - new ExtensionMsg_Loaded(ExtensionMsg_Loaded_Params(extension)));
|
| + new ExtensionMsg_Loaded(ExtensionMsg_Loaded_Params(
|
| + extension, extension->GetActivePermissions())));
|
| }
|
| }
|
|
|
| @@ -1914,7 +1923,7 @@ void ExtensionService::AddExtension(const Extension* extension) {
|
|
|
| // Check if the extension's privileges have changed and disable the
|
| // extension if necessary.
|
| - DisableIfPrivilegeIncrease(extension);
|
| + InitializePermissions(extension);
|
|
|
| bool disabled = Extension::UserMayDisable(extension->location()) &&
|
| extension_prefs_->GetExtensionState(extension->id()) ==
|
| @@ -1935,7 +1944,36 @@ void ExtensionService::AddExtension(const Extension* extension) {
|
| NotifyExtensionLoaded(extension);
|
| }
|
|
|
| -void ExtensionService::DisableIfPrivilegeIncrease(const Extension* extension) {
|
| +void ExtensionService::InitializePermissions(const Extension* extension) {
|
| + // If the extension has used the optional permissions API, it will have a
|
| + // custom set of active permissions defined in the extension prefs. Here,
|
| + // we update the extension's active permissions based on the prefs.
|
| + scoped_ptr<ExtensionPermissionSet> active_permissions(
|
| + extension_prefs()->GetActivePermissions(extension->id()));
|
| +
|
| + if (active_permissions.get()) {
|
| + // We restrict the active permissions to be within the bounds defined in the
|
| + // extension's manifest.
|
| + // a) active permissions must be a subset of optional + default permissions
|
| + // b) active permissions must contains all default permissions
|
| + scoped_ptr<ExtensionPermissionSet> total_permissions(
|
| + ExtensionPermissionSet::CreateUnion(
|
| + extension->required_permission_set(),
|
| + extension->optional_permission_set()));
|
| +
|
| + // Make sure the active permissions contain no more than optional + default.
|
| + scoped_ptr<ExtensionPermissionSet> adjusted_active(
|
| + ExtensionPermissionSet::CreateIntersection(
|
| + total_permissions.get(), active_permissions.get()));
|
| +
|
| + // Make sure the active permissions contain the default permissions.
|
| + adjusted_active.reset(
|
| + ExtensionPermissionSet::CreateUnion(
|
| + extension->required_permission_set(), adjusted_active.get()));
|
| +
|
| + UpdateActivePermissions(extension, adjusted_active.release());
|
| + }
|
| +
|
| // We keep track of all permissions the user has granted each extension.
|
| // This allows extensions to gracefully support backwards compatibility
|
| // by including unknown permissions in their manifests. When the user
|
| @@ -1976,7 +2014,8 @@ void ExtensionService::DisableIfPrivilegeIncrease(const Extension* extension) {
|
| // upgraded and recognized additional privileges, or an extension upgrades
|
| // to a version that requires additional privileges.
|
| is_privilege_increase =
|
| - granted_permissions->HasLessPrivilegesThan(extension->permission_set());
|
| + granted_permissions->HasLessPrivilegesThan(
|
| + extension->GetActivePermissions());
|
| }
|
|
|
| if (is_extension_upgrade) {
|
| @@ -2328,7 +2367,8 @@ void ExtensionService::Observe(int type,
|
| // Loaded extensions.
|
| for (size_t i = 0; i < extensions_.size(); ++i) {
|
| process->Send(new ExtensionMsg_Loaded(
|
| - ExtensionMsg_Loaded_Params(extensions_[i])));
|
| + ExtensionMsg_Loaded_Params(
|
| + extensions_[i], extensions_[i]->GetActivePermissions())));
|
| }
|
| break;
|
| }
|
|
|