| Index: chrome/browser/policy/device_management_policy_cache.cc | 
| diff --git a/chrome/browser/policy/device_management_policy_cache.cc b/chrome/browser/policy/device_management_policy_cache.cc | 
| index 2cc2bc5220c3ed7d08859fab69a1e0af969b3f28..81af0f4eb616829ffe1219aaebd74fcae0b33f2f 100644 | 
| --- a/chrome/browser/policy/device_management_policy_cache.cc | 
| +++ b/chrome/browser/policy/device_management_policy_cache.cc | 
| @@ -25,7 +25,12 @@ class PersistPolicyTask : public Task { | 
| public: | 
| PersistPolicyTask(const FilePath& path, | 
| const em::DevicePolicyResponse* policy, | 
| -                    const base::Time& timestamp); | 
| +                    const base::Time& timestamp, | 
| +                    const bool is_device_unmanaged) | 
| +      : path_(path), | 
| +        policy_(policy), | 
| +        timestamp_(timestamp), | 
| +        is_device_unmanaged_(is_device_unmanaged) {} | 
|  | 
| private: | 
| // Task override. | 
| @@ -34,20 +39,16 @@ class PersistPolicyTask : public Task { | 
| const FilePath path_; | 
| scoped_ptr<const em::DevicePolicyResponse> policy_; | 
| const base::Time timestamp_; | 
| +  const bool is_device_unmanaged_; | 
| }; | 
|  | 
| -PersistPolicyTask::PersistPolicyTask(const FilePath& path, | 
| -                                     const em::DevicePolicyResponse* policy, | 
| -                                     const base::Time& timestamp) | 
| -    : path_(path), | 
| -      policy_(policy), | 
| -      timestamp_(timestamp) { | 
| -} | 
| - | 
| void PersistPolicyTask::Run() { | 
| std::string data; | 
| em::CachedDevicePolicyResponse cached_policy; | 
| -  cached_policy.mutable_policy()->CopyFrom(*policy_); | 
| +  if (policy_.get()) | 
| +    cached_policy.mutable_policy()->CopyFrom(*policy_); | 
| +  if (is_device_unmanaged_) | 
| +    cached_policy.set_unmanaged(true); | 
| cached_policy.set_timestamp(timestamp_.ToInternalValue()); | 
| if (!cached_policy.SerializeToString(&data)) { | 
| LOG(WARNING) << "Failed to serialize policy data"; | 
| @@ -65,7 +66,8 @@ DeviceManagementPolicyCache::DeviceManagementPolicyCache( | 
| const FilePath& backing_file_path) | 
| : backing_file_path_(backing_file_path), | 
| policy_(new DictionaryValue), | 
| -      fresh_policy_(false) { | 
| +      fresh_policy_(false), | 
| +      is_device_unmanaged_(false) { | 
| } | 
|  | 
| void DeviceManagementPolicyCache::LoadPolicyFromFile() { | 
| @@ -95,6 +97,7 @@ void DeviceManagementPolicyCache::LoadPolicyFromFile() { | 
| << ", file is from the future."; | 
| return; | 
| } | 
| +  is_device_unmanaged_ = cached_policy.unmanaged(); | 
|  | 
| // Decode and swap in the new policy information. | 
| scoped_ptr<DictionaryValue> value(DecodePolicy(cached_policy.policy())); | 
| @@ -108,9 +111,10 @@ void DeviceManagementPolicyCache::LoadPolicyFromFile() { | 
|  | 
| bool DeviceManagementPolicyCache::SetPolicy( | 
| const em::DevicePolicyResponse& policy) { | 
| +  is_device_unmanaged_ = false; | 
| DictionaryValue* value = DeviceManagementPolicyCache::DecodePolicy(policy); | 
| const bool new_policy_differs = !(value->Equals(policy_.get())); | 
| -  base::Time now(base::Time::Now()); | 
| +  base::Time now(base::Time::NowFromSystemTime()); | 
| { | 
| AutoLock lock(lock_); | 
| policy_.reset(value); | 
| @@ -123,8 +127,7 @@ bool DeviceManagementPolicyCache::SetPolicy( | 
| BrowserThread::PostTask( | 
| BrowserThread::FILE, | 
| FROM_HERE, | 
| -      new PersistPolicyTask(backing_file_path_, policy_copy, | 
| -                            base::Time::NowFromSystemTime())); | 
| +      new PersistPolicyTask(backing_file_path_, policy_copy, now, false)); | 
| return new_policy_differs; | 
| } | 
|  | 
| @@ -133,6 +136,28 @@ DictionaryValue* DeviceManagementPolicyCache::GetPolicy() { | 
| return static_cast<DictionaryValue*>(policy_->DeepCopy()); | 
| } | 
|  | 
| +void DeviceManagementPolicyCache::SetDeviceUnmanaged(bool is_device_unmanaged) { | 
| +  if (is_device_unmanaged_ == is_device_unmanaged) | 
| +    return; | 
| + | 
| +  is_device_unmanaged_ = is_device_unmanaged; | 
| +  base::Time now(base::Time::NowFromSystemTime()); | 
| +  DictionaryValue* empty = new DictionaryValue(); | 
| +  { | 
| +    AutoLock lock(lock_); | 
| +    policy_.reset(empty); | 
| +    last_policy_refresh_time_ = now; | 
| +  } | 
| +  BrowserThread::PostTask( | 
| +      BrowserThread::FILE, | 
| +      FROM_HERE, | 
| +      new PersistPolicyTask(backing_file_path_, | 
| +                            (is_device_unmanaged ? NULL | 
| +                                : new em::DevicePolicyResponse()), | 
| +                            now, | 
| +                            is_device_unmanaged_)); | 
| +} | 
| + | 
| // static | 
| Value* DeviceManagementPolicyCache::DecodeIntegerValue( | 
| google::protobuf::int64 value) { | 
|  |