| Index: components/policy/tools/generate_policy_source.py
 | 
| diff --git a/components/policy/tools/generate_policy_source.py b/components/policy/tools/generate_policy_source.py
 | 
| index 74a237b71df4c564a76d9d9310f8581167fb07c3..a8311c5d67cb01ff7f5333ec5a7efe1662fce7bb 100755
 | 
| --- a/components/policy/tools/generate_policy_source.py
 | 
| +++ b/components/policy/tools/generate_policy_source.py
 | 
| @@ -666,6 +666,7 @@ def _WritePolicyConstantSource(policies, os, f, riskTags):
 | 
|            '#include <climits>\n'
 | 
|            '\n'
 | 
|            '#include "base/logging.h"\n'
 | 
| +          '#include "base/memory/ptr_util.h"\n'
 | 
|            '#include "policy/risk_tag.h"\n'
 | 
|            '#include "components/policy/core/common/policy_types.h"\n'
 | 
|            '#include "components/policy/core/common/schema_internal.h"\n'
 | 
| @@ -753,7 +754,7 @@ def _WritePolicyConstantSource(policies, os, f, riskTags):
 | 
|                '                    POLICY_LEVEL_MANDATORY,\n'
 | 
|                '                    POLICY_SCOPE_USER,\n'
 | 
|                '                    POLICY_SOURCE_ENTERPRISE_DEFAULT,\n'
 | 
| -              '                    %s,\n'
 | 
| +              '                    base::WrapUnique(%s),\n'
 | 
|                '                    NULL);\n'
 | 
|                '  }\n' % (policy.name, policy.name, creation_expression))
 | 
|  
 | 
| @@ -1003,11 +1004,13 @@ def _WriteCloudPolicyProtobuf(policies, os, f, riskTags):
 | 
|  CPP_HEAD = '''
 | 
|  #include <limits>
 | 
|  #include <memory>
 | 
| +#include <utility>
 | 
|  #include <string>
 | 
|  
 | 
|  #include "base/callback.h"
 | 
|  #include "base/json/json_reader.h"
 | 
|  #include "base/logging.h"
 | 
| +#include "base/memory/ptr_util.h"
 | 
|  #include "base/memory/weak_ptr.h"
 | 
|  #include "base/values.h"
 | 
|  #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
 | 
| @@ -1023,7 +1026,8 @@ namespace policy {
 | 
|  
 | 
|  namespace em = enterprise_management;
 | 
|  
 | 
| -base::Value* DecodeIntegerValue(google::protobuf::int64 value) {
 | 
| +std::unique_ptr<base::Value> DecodeIntegerValue(
 | 
| +    google::protobuf::int64 value) {
 | 
|    if (value < std::numeric_limits<int>::min() ||
 | 
|        value > std::numeric_limits<int>::max()) {
 | 
|      LOG(WARNING) << "Integer value " << value
 | 
| @@ -1031,20 +1035,19 @@ base::Value* DecodeIntegerValue(google::protobuf::int64 value) {
 | 
|      return nullptr;
 | 
|    }
 | 
|  
 | 
| -  return new base::FundamentalValue(static_cast<int>(value));
 | 
| +  return base::WrapUnique(
 | 
| +      new base::FundamentalValue(static_cast<int>(value)));
 | 
|  }
 | 
|  
 | 
| -base::ListValue* DecodeStringList(const em::StringList& string_list) {
 | 
| -  base::ListValue* list_value = new base::ListValue;
 | 
| -  RepeatedPtrField<std::string>::const_iterator entry;
 | 
| -  for (entry = string_list.entries().begin();
 | 
| -       entry != string_list.entries().end(); ++entry) {
 | 
| -    list_value->AppendString(*entry);
 | 
| -  }
 | 
| +std::unique_ptr<base::ListValue> DecodeStringList(
 | 
| +    const em::StringList& string_list) {
 | 
| +  std::unique_ptr<base::ListValue> list_value(new base::ListValue);
 | 
| +  for (const auto& entry : string_list.entries())
 | 
| +    list_value->AppendString(entry);
 | 
|    return list_value;
 | 
|  }
 | 
|  
 | 
| -base::Value* DecodeJson(const std::string& json) {
 | 
| +std::unique_ptr<base::Value> DecodeJson(const std::string& json) {
 | 
|    std::unique_ptr<base::Value> root =
 | 
|        base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS);
 | 
|  
 | 
| @@ -1053,7 +1056,7 @@ base::Value* DecodeJson(const std::string& json) {
 | 
|  
 | 
|    // Accept any Value type that parsed as JSON, and leave it to the handler to
 | 
|    // convert and check the concrete type.
 | 
| -  return root.release();
 | 
| +  return root;
 | 
|  }
 | 
|  
 | 
|  void DecodePolicy(const em::CloudPolicySettings& policy,
 | 
| @@ -1086,7 +1089,7 @@ def _CreateValue(type, arg):
 | 
|  def _CreateExternalDataFetcher(type, name):
 | 
|    if type == 'TYPE_EXTERNAL':
 | 
|      return 'new ExternalDataFetcher(external_data_manager, key::k%s)' % name
 | 
| -  return 'NULL'
 | 
| +  return 'nullptr'
 | 
|  
 | 
|  
 | 
|  def _WritePolicyCode(f, policy):
 | 
| @@ -1114,19 +1117,20 @@ def _WritePolicyCode(f, policy):
 | 
|            '        }\n'
 | 
|            '      }\n'
 | 
|            '      if (do_set) {\n')
 | 
| -  f.write('        base::Value* value = %s;\n' %
 | 
| +  f.write('        std::unique_ptr<base::Value> value(%s);\n' %
 | 
|            (_CreateValue(policy.policy_type, 'policy_proto.value()')))
 | 
|    # TODO(bartfab): |value| == NULL indicates that the policy value could not be
 | 
|    # parsed successfully. Surface such errors in the UI.
 | 
|    f.write('        if (value) {\n')
 | 
| -  f.write('          ExternalDataFetcher* external_data_fetcher = %s;\n' %
 | 
| +  f.write('          std::unique_ptr<ExternalDataFetcher>\n')
 | 
| +  f.write('              external_data_fetcher(%s);\n' %
 | 
|            _CreateExternalDataFetcher(policy.policy_type, policy.name))
 | 
|    f.write('          map->Set(key::k%s, \n' % policy.name)
 | 
|    f.write('                   level, \n'
 | 
|            '                   POLICY_SCOPE_USER, \n'
 | 
|            '                   POLICY_SOURCE_CLOUD, \n'
 | 
| -          '                   value, \n'
 | 
| -          '                   external_data_fetcher);\n'
 | 
| +          '                   std::move(value), \n'
 | 
| +          '                   std::move(external_data_fetcher));\n'
 | 
|            '        }\n'
 | 
|            '      }\n'
 | 
|            '    }\n'
 | 
| 
 |