| Index: chrome/browser/extensions/extension_management.cc
|
| diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
|
| index dff3946aebc7b63e0667c4513baa4f6ae6b6ea78..6904f5e3de8665fd89dae41c46014e70b0683c0c 100644
|
| --- a/chrome/browser/extensions/extension_management.cc
|
| +++ b/chrome/browser/extensions/extension_management.cc
|
| @@ -6,17 +6,18 @@
|
|
|
| #include <algorithm>
|
| #include <string>
|
| -#include <vector>
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/logging.h"
|
| #include "base/prefs/pref_service.h"
|
| +#include "base/strings/string16.h"
|
| #include "base/strings/string_util.h"
|
| #include "chrome/browser/extensions/extension_management_constants.h"
|
| #include "chrome/browser/extensions/extension_management_internal.h"
|
| #include "chrome/browser/extensions/external_policy_loader.h"
|
| #include "chrome/browser/extensions/external_provider_impl.h"
|
| +#include "chrome/browser/extensions/permissions_based_management_policy_provider.h"
|
| #include "chrome/browser/extensions/standard_management_policy_provider.h"
|
| #include "chrome/browser/profiles/incognito_helpers.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| @@ -24,6 +25,8 @@
|
| #include "components/keyed_service/content/browser_context_dependency_manager.h"
|
| #include "components/pref_registry/pref_registry_syncable.h"
|
| #include "extensions/browser/pref_names.h"
|
| +#include "extensions/common/permissions/api_permission_set.h"
|
| +#include "extensions/common/permissions/permission_set.h"
|
| #include "extensions/common/url_pattern.h"
|
| #include "url/gurl.h"
|
|
|
| @@ -49,12 +52,18 @@ ExtensionManagement::ExtensionManagement(PrefService* pref_service)
|
| // before first call to Refresh(), so in order to resolve this, Refresh() must
|
| // be called in the initialization of ExtensionManagement.
|
| Refresh();
|
| - provider_.reset(new StandardManagementPolicyProvider(this));
|
| + providers_.push_back(new StandardManagementPolicyProvider(this));
|
| + providers_.push_back(new PermissionsBasedManagementPolicyProvider(this));
|
| }
|
|
|
| ExtensionManagement::~ExtensionManagement() {
|
| }
|
|
|
| +void ExtensionManagement::Shutdown() {
|
| + pref_change_registrar_.RemoveAll();
|
| + pref_service_ = nullptr;
|
| +}
|
| +
|
| void ExtensionManagement::AddObserver(Observer* observer) {
|
| observer_list_.AddObserver(observer);
|
| }
|
| @@ -63,8 +72,9 @@ void ExtensionManagement::RemoveObserver(Observer* observer) {
|
| observer_list_.RemoveObserver(observer);
|
| }
|
|
|
| -ManagementPolicy::Provider* ExtensionManagement::GetProvider() const {
|
| - return provider_.get();
|
| +std::vector<ManagementPolicy::Provider*> ExtensionManagement::GetProviders()
|
| + const {
|
| + return providers_.get();
|
| }
|
|
|
| bool ExtensionManagement::BlacklistedByDefault() const {
|
| @@ -144,6 +154,31 @@ bool ExtensionManagement::IsAllowedManifestType(
|
| allowed_types.end();
|
| }
|
|
|
| +const APIPermissionSet& ExtensionManagement::GetBlockedAPIPermissions(
|
| + const ExtensionId& id) const {
|
| + return ReadById(id)->blocked_permissions;
|
| +}
|
| +
|
| +scoped_refptr<const PermissionSet> ExtensionManagement::GetBlockedPermissions(
|
| + const ExtensionId& id) const {
|
| + // Only api permissions are supported currently.
|
| + return scoped_refptr<const PermissionSet>(
|
| + new PermissionSet(GetBlockedAPIPermissions(id),
|
| + ManifestPermissionSet(),
|
| + URLPatternSet(),
|
| + URLPatternSet()));
|
| +}
|
| +
|
| +bool ExtensionManagement::IsPermissionSetAllowed(
|
| + const ExtensionId& id,
|
| + scoped_refptr<const PermissionSet> perms) const {
|
| + for (const auto& blocked_api : GetBlockedAPIPermissions(id)) {
|
| + if (perms->HasAPIPermission(blocked_api->id()))
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| void ExtensionManagement::Refresh() {
|
| // Load all extension management settings preferences.
|
| const base::ListValue* allowed_list_pref =
|
| @@ -301,6 +336,8 @@ const base::Value* ExtensionManagement::LoadPreference(
|
| const char* pref_name,
|
| bool force_managed,
|
| base::Value::Type expected_type) {
|
| + if (!pref_service_)
|
| + return nullptr;
|
| const PrefService::Preference* pref =
|
| pref_service_->FindPreference(pref_name);
|
| if (pref && !pref->IsDefaultValue() &&
|
| @@ -309,7 +346,7 @@ const base::Value* ExtensionManagement::LoadPreference(
|
| if (value && value->IsType(expected_type))
|
| return value;
|
| }
|
| - return NULL;
|
| + return nullptr;
|
| }
|
|
|
| void ExtensionManagement::OnExtensionPrefChanged() {
|
|
|