| Index: chrome/browser/policy/configuration_policy_provider.cc
|
| diff --git a/chrome/browser/policy/configuration_policy_provider.cc b/chrome/browser/policy/configuration_policy_provider.cc
|
| index 4979abf875e18789ee5f8f65ac5391c1feffc114..435fb9b8273c7b156f7c4a410ff3b3e4be501028 100644
|
| --- a/chrome/browser/policy/configuration_policy_provider.cc
|
| +++ b/chrome/browser/policy/configuration_policy_provider.cc
|
| @@ -4,7 +4,7 @@
|
|
|
| #include "chrome/browser/policy/configuration_policy_provider.h"
|
|
|
| -#include <algorithm>
|
| +#include <string>
|
|
|
| #include "chrome/browser/policy/policy_map.h"
|
| #include "policy/policy_constants.h"
|
| @@ -42,11 +42,8 @@ ConfigurationPolicyProvider::~ConfigurationPolicyProvider() {
|
| }
|
|
|
| bool ConfigurationPolicyProvider::Provide(PolicyMap* result) {
|
| - if (ProvideInternal(result)) {
|
| - FixDeprecatedPolicies(result);
|
| - return true;
|
| - }
|
| - return false;
|
| + result->CopyFrom(policy_bundle_.Get(POLICY_DOMAIN_CHROME, std::string()));
|
| + return true;
|
| }
|
|
|
| bool ConfigurationPolicyProvider::IsInitializationComplete() const {
|
| @@ -92,7 +89,11 @@ void ConfigurationPolicyProvider::FixDeprecatedPolicies(PolicyMap* policies) {
|
| }
|
| }
|
|
|
| -void ConfigurationPolicyProvider::NotifyPolicyUpdated() {
|
| +void ConfigurationPolicyProvider::UpdatePolicy(
|
| + scoped_ptr<PolicyBundle> bundle) {
|
| + policy_bundle_.Swap(bundle.get());
|
| + FixDeprecatedPolicies(
|
| + &policy_bundle_.Get(POLICY_DOMAIN_CHROME, std::string()));
|
| FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
|
| observer_list_,
|
| OnUpdatePolicy(this));
|
| @@ -111,13 +112,17 @@ ConfigurationPolicyObserverRegistrar::ConfigurationPolicyObserverRegistrar()
|
| observer_(NULL) {}
|
|
|
| ConfigurationPolicyObserverRegistrar::~ConfigurationPolicyObserverRegistrar() {
|
| - if (provider_)
|
| + // Subtle: see the comment in OnProviderGoingAway().
|
| + if (observer_)
|
| provider_->RemoveObserver(this);
|
| }
|
|
|
| void ConfigurationPolicyObserverRegistrar::Init(
|
| ConfigurationPolicyProvider* provider,
|
| ConfigurationPolicyProvider::Observer* observer) {
|
| + // Must be either both NULL or both not NULL.
|
| + DCHECK(provider);
|
| + DCHECK(observer);
|
| provider_ = provider;
|
| observer_ = observer;
|
| provider_->AddObserver(this);
|
| @@ -132,11 +137,16 @@ void ConfigurationPolicyObserverRegistrar::OnUpdatePolicy(
|
| void ConfigurationPolicyObserverRegistrar::OnProviderGoingAway(
|
| ConfigurationPolicyProvider* provider) {
|
| DCHECK_EQ(provider_, provider);
|
| - // The |observer_| might delete |this| during this callback. Don't touch any
|
| + // The |observer_| might delete |this| during this callback: don't touch any
|
| // of |this| field's after it returns.
|
| + // It might also invoke provider() during this callback, so |provider_| can't
|
| + // be set to NULL. So we set |observer_| to NULL instead to signal that
|
| + // we're not observing the provider anymore.
|
| + ConfigurationPolicyProvider::Observer* observer = observer_;
|
| + observer_ = NULL;
|
| provider_->RemoveObserver(this);
|
| - provider_ = NULL;
|
| - observer_->OnProviderGoingAway(provider);
|
| +
|
| + observer->OnProviderGoingAway(provider);
|
| }
|
|
|
| } // namespace policy
|
|
|