---
# System prepended metadata

title: Policy Update
tags: [Chromium-General, elkurin-daily-note]

---

# Policy Update

Policy configuration is complicated and have a deep stack.  
To understand how policy is/should be updated, let's roam around the related codes.


## Notify updates
[PolicyService](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_service.h;l=38;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) is a class responsible for merging policies from all sources.  
This lives as a singleton.  
On production, [PolicyServiceImpl](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_service_impl.h;l=36;drc=133b2d903fa57cfda1317bc589b349cf4c284b7c) is the actual implementation.  
[RefreshPolicies](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_service_impl.cc;l=212;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) will post [MergeAndTriggerUpdates](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_service_impl.cc;l=354;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) which complets immediately if there is no policy provbiders.  
As the method name says, it merges the policies from multiple sources such [`chrome_policies`](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_service_impl.cc;l=366;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) from POLICY_DOMAIN_CHROME, PolicyBundle provided via registered [ConfigurationPolicyProvider](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/configuration_policy_provider.h;l=23;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5).  


[PolicyService::Observer](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_service.h;l=40;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) observes the policy update.  

[PolicyNamespace](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_namespace.h;l=39;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) represents a policy domain.  
We have 4 [PolicyDomain](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/common/policy_namespace.h;l=21;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5).  
CHROME, EXTENSIONS and SIGNIN_EXTENSIONS are the domains here.  
Then it passes `previous` map and `current` map so that we can take the diff.  
This notifies many classes such as [ArcPolicyBridge](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/arc/policy/arc_policy_bridge.cc;l=630;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5). This is used when the policy should be controlled by ARC.

## Policy entry
[kSimplePolicyMap](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/policy/configuration_policy_handler_list_factory.cc;l=283;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) contains a list of policy including kArcEnabled.  
Each entry is [PolicyToPreferenceMapEntry](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_handler.h;l=32;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) struct.
```cpp=
struct POLICY_EXPORT PolicyToPreferenceMapEntry {
  const char* const policy_name;
  const char* const preference_path;
  const base::Value::Type value_type;
};

...
{ key::kArcEnabled,
  arc::prefs::kArcEnabled,
  base::Value::Type::BOOLEAN },
...
```

These entries are mapped via [SimplePolicyHandler](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_handler.h;l=221;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5).  
Here's the only meaningful method for SimplePolicyHandler.
```cpp=
void SimplePolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
                                              PrefValueMap* prefs) {
  const base::Value* value = policies.GetValueUnsafe(policy_name());
  if (value)
    prefs->SetValue(pref_path_, value->Clone());
}
```
PrefValueMap is a mapping of the preferences and when given PolicyMap `policies` it extracts the policy value corresponding to `policy_name` and set it to `prefs`.

The policy is applied on [CreatePreferencesFromPolicies](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_pref_store.cc;l=143-145;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5), called on [Refresh](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_pref_store.cc;l=118;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5).  
We need to Refresh the policy to apply the up-to-date policies.

### Configuration Policy Pref Store
The method mentioned above is in [ConfigurationPolicyPrefStore](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_pref_store.h;l=30;drc=894b522cbf353e182bef8c9e1a53e1342fa0d825).  
[ConfigurationPolicyPrefStore](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_pref_store.h;l=30;drc=894b522cbf353e182bef8c9e1a53e1342fa0d825) is an implementation of PrefStore that bridges policy settings as read from the PolicyService to preferences.

On refresh, it calculates the prefs which is different from the existing one by [GetDifferingKeys](https://source.chromium.org/chromium/chromium/src/+/main:components/prefs/pref_value_map.cc;l=135;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) and then send [OnPrefValueChanged](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/core/browser/configuration_policy_pref_store.cc;l=127;drc=c3a520cd08d04365a91c6837b947dfa714cfbfd5) notification only for changed prefs.