| Index: components/policy/core/common/schema_registry.h | 
| diff --git a/components/policy/core/common/schema_registry.h b/components/policy/core/common/schema_registry.h | 
| index b9f7fa8777e02f181d70d6441be6c52755a40589..6df4db2b19a7565337e8ce2a619990584e37afcc 100644 | 
| --- a/components/policy/core/common/schema_registry.h | 
| +++ b/components/policy/core/common/schema_registry.h | 
| @@ -43,6 +43,16 @@ class POLICY_EXPORT SchemaRegistry : public base::NonThreadSafe { | 
| virtual ~Observer(); | 
| }; | 
|  | 
| +  // This observer is only meant to be used by subclasses. | 
| +  class POLICY_EXPORT InternalObserver { | 
| +   public: | 
| +    // Invoked when |registry| is about to be destroyed. | 
| +    virtual void OnSchemaRegistryShuttingDown(SchemaRegistry* registry) = 0; | 
| + | 
| +   protected: | 
| +    virtual ~InternalObserver(); | 
| +  }; | 
| + | 
| SchemaRegistry(); | 
| virtual ~SchemaRegistry(); | 
|  | 
| @@ -69,7 +79,8 @@ class POLICY_EXPORT SchemaRegistry : public base::NonThreadSafe { | 
| void AddObserver(Observer* observer); | 
| void RemoveObserver(Observer* observer); | 
|  | 
| -  bool HasObservers() const; | 
| +  void AddInternalObserver(InternalObserver* observer); | 
| +  void RemoveInternalObserver(InternalObserver* observer); | 
|  | 
| protected: | 
| void Notify(bool has_new_schemas); | 
| @@ -78,30 +89,35 @@ class POLICY_EXPORT SchemaRegistry : public base::NonThreadSafe { | 
|  | 
| private: | 
| ObserverList<Observer, true> observers_; | 
| +  ObserverList<InternalObserver, true> internal_observers_; | 
| bool domains_ready_[POLICY_DOMAIN_SIZE]; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(SchemaRegistry); | 
| }; | 
|  | 
| // A registry that combines the maps of other registries. | 
| -class POLICY_EXPORT CombinedSchemaRegistry : public SchemaRegistry, | 
| -                                             public SchemaRegistry::Observer { | 
| +class POLICY_EXPORT CombinedSchemaRegistry | 
| +    : public SchemaRegistry, | 
| +      public SchemaRegistry::Observer, | 
| +      public SchemaRegistry::InternalObserver { | 
| public: | 
| CombinedSchemaRegistry(); | 
| virtual ~CombinedSchemaRegistry(); | 
|  | 
| void Track(SchemaRegistry* registry); | 
| -  void Untrack(SchemaRegistry* registry); | 
|  | 
| +  // SchemaRegistry: | 
| virtual void RegisterComponents(PolicyDomain domain, | 
| const ComponentMap& components) OVERRIDE; | 
| - | 
| virtual void UnregisterComponent(const PolicyNamespace& ns) OVERRIDE; | 
|  | 
| +  // SchemaRegistry::Observer: | 
| virtual void OnSchemaRegistryUpdated(bool has_new_schemas) OVERRIDE; | 
| - | 
| virtual void OnSchemaRegistryReady() OVERRIDE; | 
|  | 
| +  // SchemaRegistry::InternalObserver: | 
| +  virtual void OnSchemaRegistryShuttingDown(SchemaRegistry* registry) OVERRIDE; | 
| + | 
| private: | 
| void Combine(bool has_new_schemas); | 
|  | 
| @@ -111,6 +127,35 @@ class POLICY_EXPORT CombinedSchemaRegistry : public SchemaRegistry, | 
| DISALLOW_COPY_AND_ASSIGN(CombinedSchemaRegistry); | 
| }; | 
|  | 
| +// A registry that wraps another schema registry. | 
| +class POLICY_EXPORT ForwardingSchemaRegistry | 
| +    : public SchemaRegistry, | 
| +      public SchemaRegistry::Observer, | 
| +      public SchemaRegistry::InternalObserver { | 
| + public: | 
| +  // This registry will stop updating its SchemaMap when |wrapped| is | 
| +  // destroyed. | 
| +  explicit ForwardingSchemaRegistry(SchemaRegistry* wrapped); | 
| +  virtual ~ForwardingSchemaRegistry(); | 
| + | 
| +  // SchemaRegistry: | 
| +  virtual void RegisterComponents(PolicyDomain domain, | 
| +                                  const ComponentMap& components) OVERRIDE; | 
| +  virtual void UnregisterComponent(const PolicyNamespace& ns) OVERRIDE; | 
| + | 
| +  // SchemaRegistry::Observer: | 
| +  virtual void OnSchemaRegistryUpdated(bool has_new_schemas) OVERRIDE; | 
| +  virtual void OnSchemaRegistryReady() OVERRIDE; | 
| + | 
| +  // SchemaRegistry::InternalObserver: | 
| +  virtual void OnSchemaRegistryShuttingDown(SchemaRegistry* registry) OVERRIDE; | 
| + | 
| + private: | 
| +  SchemaRegistry* wrapped_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(ForwardingSchemaRegistry); | 
| +}; | 
| + | 
| }  // namespace policy | 
|  | 
| #endif  // COMPONENTS_POLICY_CORE_COMMON_SCHEMA_REGISTRY_H_ | 
|  |