diff --git a/tools/gn/command_desc.cc b/tools/gn/command_desc.cc
index 72525e9..acb8077 100644
--- a/tools/gn/command_desc.cc
+++ b/tools/gn/command_desc.cc
@@ -459,7 +459,7 @@
 
   if (json) {
     // Convert all targets/configs to JSON, serialize and print them
-    auto res = base::WrapUnique(new base::DictionaryValue());
+    auto res = base::MakeUnique<base::DictionaryValue>();
     if (!target_matches.empty()) {
       for (const auto* target : target_matches) {
         res->Set(target->label().GetUserVisibleName(
diff --git a/tools/gn/desc_builder.cc b/tools/gn/desc_builder.cc
index bc8f02a..aca148c 100644
--- a/tools/gn/desc_builder.cc
+++ b/tools/gn/desc_builder.cc
@@ -114,7 +114,7 @@
 
   template <typename T>
   ValuePtr RenderValue(const std::vector<T>& vector) {
-    auto res = base::WrapUnique(new base::ListValue());
+    auto res = base::MakeUnique<base::ListValue>();
     for (const auto& v : vector)
       res->Append(RenderValue(v));
 
@@ -181,7 +181,7 @@
       : BaseDescBuilder(what, false, false, false), config_(config) {}
 
   std::unique_ptr<base::DictionaryValue> BuildDescription() {
-    auto res = base::WrapUnique(new base::DictionaryValue());
+    auto res = base::MakeUnique<base::DictionaryValue>();
     const ConfigValues& values = config_->resolved_values();
 
     if (what_.empty())
@@ -190,7 +190,7 @@
           config_->label().GetToolchainLabel().GetUserVisibleName(false));
 
     if (what(variables::kConfigs) && !config_->configs().empty()) {
-      auto configs = base::WrapUnique(new base::ListValue());
+      auto configs = base::MakeUnique<base::ListValue>();
       FillInConfigVector(configs.get(), config_->configs().vector());
       res->Set(variables::kConfigs, std::move(configs));
     }
@@ -233,7 +233,7 @@
   ValuePtr render_config_value_array(
       const ConfigValues& values,
       const std::vector<T>& (ConfigValues::*getter)() const) {
-    auto res = base::WrapUnique(new base::ListValue());
+    auto res = base::MakeUnique<base::ListValue>();
 
     for (const T& cur : (values.*getter)())
       res->Append(RenderValue(cur));
@@ -254,7 +254,7 @@
       : BaseDescBuilder(what, all, tree, blame), target_(target) {}
 
   std::unique_ptr<base::DictionaryValue> BuildDescription() {
-    auto res = base::WrapUnique(new base::DictionaryValue());
+    auto res = base::MakeUnique<base::DictionaryValue>();
     bool is_binary_output = target_->IsBinary();
 
     if (what_.empty()) {
@@ -277,7 +277,7 @@
         res->SetBoolean(variables::kCheckIncludes, target_->check_includes());
 
       if (what(variables::kAllowCircularIncludesFrom)) {
-        auto labels = base::WrapUnique(new base::ListValue());
+        auto labels = base::MakeUnique<base::ListValue>();
         for (const auto& cur : target_->allow_circular_includes_from())
           labels->AppendString(cur.GetUserVisibleName(GetToolchainLabel()));
 
@@ -309,20 +309,20 @@
 
     if (is_binary_output && what(variables::kConfigs) &&
         !target_->configs().empty()) {
-      auto configs = base::WrapUnique(new base::ListValue());
+      auto configs = base::MakeUnique<base::ListValue>();
       FillInConfigVector(configs.get(), target_->configs().vector());
       res->Set(variables::kConfigs, std::move(configs));
     }
 
     if (what(variables::kPublicConfigs) && !target_->public_configs().empty()) {
-      auto configs = base::WrapUnique(new base::ListValue());
+      auto configs = base::MakeUnique<base::ListValue>();
       FillInConfigVector(configs.get(), target_->public_configs());
       res->Set(variables::kPublicConfigs, std::move(configs));
     }
 
     if (what(variables::kAllDependentConfigs) &&
         !target_->all_dependent_configs().empty()) {
-      auto configs = base::WrapUnique(new base::ListValue());
+      auto configs = base::MakeUnique<base::ListValue>();
       FillInConfigVector(configs.get(), target_->all_dependent_configs());
       res->Set(variables::kAllDependentConfigs, std::move(configs));
     }
@@ -335,7 +335,7 @@
                        target_->action_values().script().value());
 
       if (what(variables::kArgs)) {
-        auto args = base::WrapUnique(new base::ListValue());
+        auto args = base::MakeUnique<base::ListValue>();
         for (const auto& elem : target_->action_values().args().list())
           args->AppendString(elem.AsString());
 
@@ -405,7 +405,7 @@
     if (what(variables::kLibs)) {
       const OrderedSet<LibFile>& all_libs = target_->all_libs();
       if (!all_libs.empty()) {
-        auto libs = base::WrapUnique(new base::ListValue());
+        auto libs = base::MakeUnique<base::ListValue>();
         for (size_t i = 0; i < all_libs.size(); i++)
           libs->AppendString(all_libs[i].value());
         res->Set(variables::kLibs, std::move(libs));
@@ -415,7 +415,7 @@
     if (what(variables::kLibDirs)) {
       const OrderedSet<SourceDir>& all_lib_dirs = target_->all_lib_dirs();
       if (!all_lib_dirs.empty()) {
-        auto lib_dirs = base::WrapUnique(new base::ListValue());
+        auto lib_dirs = base::MakeUnique<base::ListValue>();
         for (size_t i = 0; i < all_lib_dirs.size(); i++)
           lib_dirs->AppendString(FormatSourceDir(all_lib_dirs[i]));
         res->Set(variables::kLibDirs, std::move(lib_dirs));
@@ -472,7 +472,7 @@
   }
 
   ValuePtr RenderDeps() {
-    auto res = base::WrapUnique(new base::ListValue());
+    auto res = base::MakeUnique<base::ListValue>();
 
     // Tree mode is separate.
     if (tree_) {
@@ -506,7 +506,7 @@
   }
 
   ValuePtr RenderRuntimeDeps() {
-    auto res = base::WrapUnique(new base::ListValue());
+    auto res = base::MakeUnique<base::ListValue>();
 
     const Target* previous_from = NULL;
     for (const auto& pair : ComputeRuntimeDeps(target_)) {
@@ -532,12 +532,12 @@
   }
 
   void FillInSourceOutputs(base::DictionaryValue* res) {
-    auto dict = base::WrapUnique(new base::DictionaryValue());
+    auto dict = base::MakeUnique<base::DictionaryValue>();
     for (const auto& source : target_->sources()) {
       std::vector<OutputFile> outputs;
       Toolchain::ToolType tool_type = Toolchain::TYPE_NONE;
       if (target_->GetOutputFilesForSource(source, &tool_type, &outputs)) {
-        auto list = base::WrapUnique(new base::ListValue());
+        auto list = base::MakeUnique<base::ListValue>();
         for (const auto& output : outputs)
           list->AppendString(output.value());
 
@@ -548,7 +548,7 @@
   }
 
   void FillInBundle(base::DictionaryValue* res) {
-    auto data = base::WrapUnique(new base::DictionaryValue());
+    auto data = base::MakeUnique<base::DictionaryValue>();
     const BundleData& bundle_data = target_->bundle_data();
     const Settings* settings = target_->settings();
     BundleData::SourceFiles sources;
@@ -562,7 +562,7 @@
     data->Set("plugins_dir", RenderValue(bundle_data.plugins_dir()));
     data->SetString("product_type", bundle_data.product_type());
 
-    auto deps = base::WrapUnique(new base::ListValue());
+    auto deps = base::MakeUnique<base::ListValue>();
     for (const auto* dep : bundle_data.bundle_deps())
       deps->AppendString(dep->label().GetUserVisibleName(GetToolchainLabel()));
 
@@ -572,7 +572,7 @@
 
   void FillInOutputs(base::DictionaryValue* res) {
     if (target_->output_type() == Target::ACTION) {
-      auto list = base::WrapUnique(new base::ListValue());
+      auto list = base::MakeUnique<base::ListValue>();
       for (const auto& elem : target_->action_values().outputs().list())
         list->AppendString(elem.AsString());
 
@@ -586,7 +586,7 @@
                target_->output_type() == Target::COPY_FILES) {
       const SubstitutionList& outputs = target_->action_values().outputs();
       if (!outputs.required_types().empty()) {
-        auto patterns = base::WrapUnique(new base::ListValue());
+        auto patterns = base::MakeUnique<base::ListValue>();
         for (const auto& elem : outputs.list())
           patterns->AppendString(elem.AsString());
 
@@ -619,7 +619,7 @@
   template <class T>
   ValuePtr RenderConfigValues(const std::vector<T>& (ConfigValues::*getter)()
                                   const) {
-    auto res = base::WrapUnique(new base::ListValue());
+    auto res = base::MakeUnique<base::ListValue>();
     for (ConfigValuesIterator iter(target_); !iter.done(); iter.Next()) {
       const std::vector<T>& vec = (iter.cur().*getter)();
 
@@ -653,7 +653,7 @@
         // Indent string values in blame mode
         if (blame_ && rendered->GetAsString(&str)) {
           str = "  " + str;
-          rendered = base::WrapUnique(new base::StringValue(str));
+          rendered = base::MakeUnique<base::StringValue>(str);
         }
         res->Append(std::move(rendered));
       }
diff --git a/tools/gn/functions_unittest.cc b/tools/gn/functions_unittest.cc
index c6681bf..7156747 100644
--- a/tools/gn/functions_unittest.cc
+++ b/tools/gn/functions_unittest.cc
@@ -48,8 +48,7 @@
   // "defined(def.foo)" to see if foo is defined on the def scope.
   std::unique_ptr<AccessorNode> undef_accessor(new AccessorNode);
   undef_accessor->set_base(defined_token);
-  undef_accessor->set_member(
-      base::WrapUnique(new IdentifierNode(undefined_token)));
+  undef_accessor->set_member(base::MakeUnique<IdentifierNode>(undefined_token));
   ListNode args_list_accessor_defined;
   args_list_accessor_defined.append_item(std::move(undef_accessor));
   result = functions::RunDefined(setup.scope(), &function_call,
diff --git a/tools/gn/json_project_writer.cc b/tools/gn/json_project_writer.cc
index dc375a6..67c21ee 100644
--- a/tools/gn/json_project_writer.cc
+++ b/tools/gn/json_project_writer.cc
@@ -86,7 +86,7 @@
                        std::vector<const Target*>& all_targets) {
   Label default_toolchain_label;
 
-  auto targets = base::WrapUnique(new base::DictionaryValue());
+  auto targets = base::MakeUnique<base::DictionaryValue>();
   for (const auto* target : all_targets) {
     if (default_toolchain_label.is_null())
       default_toolchain_label = target->settings()->default_toolchain_label();
@@ -104,13 +104,13 @@
                  std::move(description));
   }
 
-  auto settings = base::WrapUnique(new base::DictionaryValue());
+  auto settings = base::MakeUnique<base::DictionaryValue>();
   settings->SetString("root_path", build_settings->root_path_utf8());
   settings->SetString("build_dir", build_settings->build_dir().value());
   settings->SetString("default_toolchain",
                       default_toolchain_label.GetUserVisibleName(false));
 
-  auto output = base::WrapUnique(new base::DictionaryValue());
+  auto output = base::MakeUnique<base::DictionaryValue>();
   output->Set("targets", std::move(targets));
   output->Set("build_settings", std::move(settings));
 
diff --git a/tools/gn/parser.cc b/tools/gn/parser.cc
index 76d4580..5fe9506 100644
--- a/tools/gn/parser.cc
+++ b/tools/gn/parser.cc
@@ -462,7 +462,7 @@
 }
 
 std::unique_ptr<ParseNode> Parser::Literal(const Token& token) {
-  return base::WrapUnique(new LiteralNode(token));
+  return base::MakeUnique<LiteralNode>(token);
 }
 
 std::unique_ptr<ParseNode> Parser::Name(const Token& token) {
@@ -529,7 +529,7 @@
     const Token& token) {
   std::unique_ptr<ListNode> list(new ListNode);
   list->set_begin_token(token);
-  list->set_end(base::WrapUnique(new EndNode(token)));
+  list->set_end(base::MakeUnique<EndNode>(token));
   std::unique_ptr<BlockNode> block;
   bool has_arg = false;
   if (LookAhead(Token::LEFT_PAREN)) {
@@ -669,7 +669,7 @@
     *err_ = Err(cur_token(), "Trailing comma");
     return std::unique_ptr<ListNode>();
   }
-  list->set_end(base::WrapUnique(new EndNode(cur_token())));
+  list->set_end(base::MakeUnique<EndNode>(cur_token()));
   return list;
 }
 
@@ -728,7 +728,7 @@
 
   for (;;) {
     if (LookAhead(Token::RIGHT_BRACE)) {
-      block->set_end(base::WrapUnique(new EndNode(Consume())));
+      block->set_end(base::MakeUnique<EndNode>(Consume()));
       break;
     }
 
diff --git a/tools/gn/xcode_object.cc b/tools/gn/xcode_object.cc
index ef24e7d..dc5bfb8 100644
--- a/tools/gn/xcode_object.cc
+++ b/tools/gn/xcode_object.cc
@@ -317,7 +317,7 @@
       name_(name) {
   if (!shell_script.empty()) {
     build_phases_.push_back(
-        base::WrapUnique(new PBXShellScriptBuildPhase(name, shell_script)));
+        base::MakeUnique<PBXShellScriptBuildPhase>(name, shell_script));
   }
 }
 
@@ -475,8 +475,8 @@
   DCHECK(!source_path.empty());
   std::string::size_type sep = source_path.find("/");
   if (sep == std::string::npos) {
-    children_.push_back(base::WrapUnique(
-        new PBXFileReference(std::string(), source_path, std::string())));
+    children_.push_back(base::MakeUnique<PBXFileReference>(
+        std::string(), source_path, std::string()));
     return static_cast<PBXFileReference*>(children_.back().get());
   }
 
@@ -563,7 +563,7 @@
     const PBXFileReference* file_reference) {
   DCHECK(file_reference);
   source_build_phase_->AddBuildFile(
-      base::WrapUnique(new PBXBuildFile(file_reference, source_build_phase_)));
+      base::MakeUnique<PBXBuildFile>(file_reference, source_build_phase_));
 }
 
 PBXObjectClass PBXNativeTarget::Class() const {
@@ -596,11 +596,11 @@
   attributes_["BuildIndependentTargetsInParallel"] = "YES";
 
   main_group_.reset(new PBXGroup);
-  sources_ = static_cast<PBXGroup*>(main_group_->AddChild(
-      base::WrapUnique(new PBXGroup(source_path, "Source"))));
+  sources_ = static_cast<PBXGroup*>(
+      main_group_->AddChild(base::MakeUnique<PBXGroup>(source_path, "Source")));
   products_ = static_cast<PBXGroup*>(main_group_->AddChild(
-      base::WrapUnique(new PBXGroup(std::string(), "Product"))));
-  main_group_->AddChild(base::WrapUnique(new PBXGroup(std::string(), "Build")));
+      base::MakeUnique<PBXGroup>(std::string(), "Product")));
+  main_group_->AddChild(base::MakeUnique<PBXGroup>(std::string(), "Build"));
 
   configurations_.reset(new XCConfigurationList(config_name, attributes, this));
 }
@@ -620,13 +620,13 @@
     attributes["PRODUCT_NAME"] = name_;
 
     PBXFileReference* product_reference = static_cast<PBXFileReference*>(
-        products_->AddChild(base::WrapUnique(new PBXFileReference(
-            std::string(), name_, "compiled.mach-o.executable"))));
+        products_->AddChild(base::MakeUnique<PBXFileReference>(
+            std::string(), name_, "compiled.mach-o.executable")));
 
     const char product_type[] = "com.apple.product-type.tool";
-    targets_.push_back(base::WrapUnique(
-        new PBXNativeTarget(name_, std::string(), config_name_, attributes,
-                            product_type, name_, product_reference)));
+    targets_.push_back(base::MakeUnique<PBXNativeTarget>(
+        name_, std::string(), config_name_, attributes, product_type, name_,
+        product_reference));
     target_for_indexing_ = static_cast<PBXNativeTarget*>(targets_.back().get());
   }
 
@@ -641,8 +641,8 @@
   attributes["CONFIGURATION_BUILD_DIR"] = ".";
   attributes["PRODUCT_NAME"] = name;
 
-  targets_.push_back(base::WrapUnique(
-      new PBXAggregateTarget(name, shell_script, config_name_, attributes)));
+  targets_.push_back(base::MakeUnique<PBXAggregateTarget>(
+      name, shell_script, config_name_, attributes));
 }
 
 void PBXProject::AddNativeTarget(const std::string& name,
@@ -651,10 +651,10 @@
                                  const std::string& output_type,
                                  const std::string& shell_script) {
   base::StringPiece ext = FindExtension(&output_name);
-  PBXFileReference* product =
-      static_cast<PBXFileReference*>(products_->AddChild(base::WrapUnique(
-          new PBXFileReference(std::string(), output_name,
-                               type.empty() ? GetSourceType(ext) : type))));
+  PBXFileReference* product = static_cast<PBXFileReference*>(
+      products_->AddChild(base::MakeUnique<PBXFileReference>(
+          std::string(), output_name,
+          type.empty() ? GetSourceType(ext) : type)));
 
   size_t ext_offset = FindExtensionOffset(output_name);
   std::string product_name = ext_offset != std::string::npos
@@ -666,9 +666,9 @@
   attributes["CONFIGURATION_BUILD_DIR"] = ".";
   attributes["PRODUCT_NAME"] = product_name;
 
-  targets_.push_back(base::WrapUnique(
-      new PBXNativeTarget(name, shell_script, config_name_, attributes,
-                          output_type, product_name, product)));
+  targets_.push_back(base::MakeUnique<PBXNativeTarget>(
+      name, shell_script, config_name_, attributes, output_type, product_name,
+      product));
 }
 
 void PBXProject::SetProjectDirPath(const std::string& project_dir_path) {
@@ -831,7 +831,7 @@
     : owner_reference_(owner_reference) {
   DCHECK(owner_reference_);
   configurations_.push_back(
-      base::WrapUnique(new XCBuildConfiguration(name, attributes)));
+      base::MakeUnique<XCBuildConfiguration>(name, attributes));
 }
 
 XCConfigurationList::~XCConfigurationList() {}
