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 |