| Index: chrome/browser/chromeos/policy/login_profile_policy_provider.cc
|
| diff --git a/chrome/browser/chromeos/policy/login_profile_policy_provider.cc b/chrome/browser/chromeos/policy/login_profile_policy_provider.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..87bbdaf757653648855ca47afe115ad23699d622
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/policy/login_profile_policy_provider.cc
|
| @@ -0,0 +1,114 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/chromeos/policy/login_profile_policy_provider.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/policy/policy_bundle.h"
|
| +#include "chrome/browser/policy/policy_map.h"
|
| +#include "chrome/browser/policy/policy_types.h"
|
| +#include "policy/policy_constants.h"
|
| +
|
| +namespace policy {
|
| +
|
| +namespace {
|
| +
|
| +// Applies the value of |device_policy| in |device_policy_map| as the
|
| +// recommended value of |user_policy| in |user_policy_map|. If the value of
|
| +// |device_policy| is unset, does nothing.
|
| +void ApplyDevicePolicy(const std::string& device_policy,
|
| + const std::string& user_policy,
|
| + const PolicyMap& device_policy_map,
|
| + PolicyMap* user_policy_map) {
|
| + const base::Value* value = device_policy_map.GetValue(device_policy);
|
| + if (value) {
|
| + user_policy_map->Set(user_policy,
|
| + POLICY_LEVEL_RECOMMENDED,
|
| + POLICY_SCOPE_USER,
|
| + value->DeepCopy());
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +LoginProfilePolicyProvider::LoginProfilePolicyProvider(
|
| + PolicyService* device_policy_service)
|
| + : device_policy_service_(device_policy_service),
|
| + waiting_for_device_policy_refresh_(false),
|
| + weak_factory_(this) {
|
| +}
|
| +
|
| +LoginProfilePolicyProvider::~LoginProfilePolicyProvider() {
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::Init() {
|
| + ConfigurationPolicyProvider::Init();
|
| + device_policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this);
|
| + if (device_policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME))
|
| + UpdateFromDevicePolicy();
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::Shutdown() {
|
| + device_policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this);
|
| + weak_factory_.InvalidateWeakPtrs();
|
| + ConfigurationPolicyProvider::Shutdown();
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::RefreshPolicies() {
|
| + waiting_for_device_policy_refresh_ = true;
|
| + weak_factory_.InvalidateWeakPtrs();
|
| + device_policy_service_->RefreshPolicies(base::Bind(
|
| + &LoginProfilePolicyProvider::OnDevicePolicyRefreshDone,
|
| + weak_factory_.GetWeakPtr()));
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::OnPolicyUpdated(const PolicyNamespace& ns,
|
| + const PolicyMap& previous,
|
| + const PolicyMap& current) {
|
| + if (ns == PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
|
| + UpdateFromDevicePolicy();
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::OnPolicyServiceInitialized(
|
| + PolicyDomain domain) {
|
| + if (domain == POLICY_DOMAIN_CHROME)
|
| + UpdateFromDevicePolicy();
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::OnDevicePolicyRefreshDone() {
|
| + waiting_for_device_policy_refresh_ = false;
|
| + UpdateFromDevicePolicy();
|
| +}
|
| +
|
| +void LoginProfilePolicyProvider::UpdateFromDevicePolicy() {
|
| + // If a policy refresh is in progress, wait for it to finish.
|
| + if (waiting_for_device_policy_refresh_)
|
| + return;
|
| +
|
| + const PolicyNamespace chrome_namespaces(POLICY_DOMAIN_CHROME, std::string());
|
| + const PolicyMap& device_policy_map =
|
| + device_policy_service_->GetPolicies(chrome_namespaces);
|
| + scoped_ptr<PolicyBundle> bundle(new PolicyBundle);
|
| + PolicyMap& user_policy_map = bundle->Get(chrome_namespaces);
|
| +
|
| + ApplyDevicePolicy(key::kDeviceLoginScreenDefaultLargeCursorEnabled,
|
| + key::kLargeCursorEnabled,
|
| + device_policy_map, &user_policy_map);
|
| + ApplyDevicePolicy(key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
|
| + key::kSpokenFeedbackEnabled,
|
| + device_policy_map, &user_policy_map);
|
| + ApplyDevicePolicy(key::kDeviceLoginScreenDefaultHighContrastEnabled,
|
| + key::kHighContrastEnabled,
|
| + device_policy_map, &user_policy_map);
|
| + ApplyDevicePolicy(key::kDeviceLoginScreenDefaultScreenMagnifierType,
|
| + key::kScreenMagnifierType,
|
| + device_policy_map, &user_policy_map);
|
| + UpdatePolicy(bundle.Pass());
|
| +}
|
| +
|
| +} // namespace policy
|
|
|