platform2: Fix issues with new version of libchrome

libchrome r334380 has the following breaking changes that need to be fixed:
- base::JSONWriter::Write() and base::JSONWriter::WriteWithOptions() take
  "const base::Value&" instead of "const base::Value*"
- base::JSONReader::Read() and base::JSONReader::ReadAndReturnError()
  return a scoped_ptr<base::Value> instead of base::Value*
- base/safe_strerror_posix.h is moved to base/posix/safe_strerror.h
- safe_strerror() is now in "base" namespace
- StartsWithASCII(), EndsWith(), StringToUpperASCII(), LowerCaseEqualsASCII()
  are now in "base" namespace
- ObserverList<T> is now in "base" namespace
- base::PrintTo(base::FilePath) used in gtest is now moved to libchrome-test
  library and as such, unit test runners need to link to this library now.
- crypto::RSAPrivateKey::CreateSensitive() is now removed from //crypto, so
  some of tests in chromeos-login that used that function had to be changed
  to use crypto::GenerateRSAKeyPairNSS() directly.
- UnixDomanSocket class is now in "base" namespace
- Pickle class is now in "base" namespace

BUG=chromium:496469
TEST=`./build_packages`
CQ-DEPEND=CL:277662

Change-Id: I36e5fbf2e36a92068873ffbd44020c862a3ed9e3
Reviewed-on: https://chromium-review.googlesource.com/277671
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
Trybot-Ready: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index ab8f189..8c9e075 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -337,8 +337,10 @@
                        ManagerProxy* manager_proxy) {
     ErrorPtr error;
     std::string error_message;
-    std::unique_ptr<base::Value> json(base::JSONReader::ReadAndReturnError(
-        value, base::JSON_PARSE_RFC, nullptr, &error_message));
+    std::unique_ptr<base::Value> json(
+        base::JSONReader::ReadAndReturnError(value, base::JSON_PARSE_RFC,
+                                             nullptr, &error_message)
+            .release());
     if (!json) {
       Error::AddTo(&error, FROM_HERE, chromeos::errors::json::kDomain,
                    chromeos::errors::json::kParseError, error_message);
diff --git a/buffet/commands/command_manager_unittest.cc b/buffet/commands/command_manager_unittest.cc
index f270655..81c2a5b 100644
--- a/buffet/commands/command_manager_unittest.cc
+++ b/buffet/commands/command_manager_unittest.cc
@@ -56,7 +56,7 @@
 static void SaveJsonToFile(const base::DictionaryValue& dict,
                            const base::FilePath& file_path) {
   std::string json;
-  base::JSONWriter::Write(&dict, &json);
+  base::JSONWriter::Write(dict, &json);
   const int bytes_to_write = static_cast<int>(json.size());
   CHECK_EQ(bytes_to_write, WriteFile(file_path, json.data(), bytes_to_write));
 }
diff --git a/buffet/commands/prop_constraints.cc b/buffet/commands/prop_constraints.cc
index f773290..1fd43e6 100644
--- a/buffet/commands/prop_constraints.cc
+++ b/buffet/commands/prop_constraints.cc
@@ -19,7 +19,7 @@
   std::string result;
   auto json = value.ToJson(nullptr);
   if (json)
-    base::JSONWriter::Write(json.get(), &result);
+    base::JSONWriter::Write(*json, &result);
   return result;
 }
 
diff --git a/buffet/commands/schema_utils.cc b/buffet/commands/schema_utils.cc
index 47b757f..efb758e 100644
--- a/buffet/commands/schema_utils.cc
+++ b/buffet/commands/schema_utils.cc
@@ -21,7 +21,7 @@
                             const std::string& expected_type,
                             chromeos::ErrorPtr* error) {
   std::string value_as_string;
-  base::JSONWriter::Write(value_in, &value_as_string);
+  base::JSONWriter::Write(*value_in, &value_as_string);
   chromeos::Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
                                errors::commands::kTypeMismatch,
                                "Unable to convert value %s into %s",
@@ -255,14 +255,14 @@
 std::string ToString(const native_types::Object& obj) {
   auto val = TypedValueToJson(obj, nullptr);
   std::string str;
-  base::JSONWriter::Write(val.get(), &str);
+  base::JSONWriter::Write(*val, &str);
   return str;
 }
 
 std::string ToString(const native_types::Array& arr) {
   auto val = TypedValueToJson(arr, nullptr);
   std::string str;
-  base::JSONWriter::Write(val.get(), &str);
+  base::JSONWriter::Write(*val, &str);
   return str;
 }
 
diff --git a/buffet/commands/unittest_utils.cc b/buffet/commands/unittest_utils.cc
index be4d4e7..df07289 100644
--- a/buffet/commands/unittest_utils.cc
+++ b/buffet/commands/unittest_utils.cc
@@ -16,8 +16,10 @@
   std::replace(json2.begin(), json2.end(), '\'', '"');
   int error = 0;
   std::string message;
-  std::unique_ptr<base::Value> value{base::JSONReader::ReadAndReturnError(
-      json2, base::JSON_PARSE_RFC, &error, &message)};
+  std::unique_ptr<base::Value> value{
+      base::JSONReader::ReadAndReturnError(json2, base::JSON_PARSE_RFC, &error,
+                                           &message)
+          .release()};
   CHECK(value) << "Failed to load JSON: " << message << ", " << json;
   return value;
 }
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index cb0cb3e..279e2b9 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -579,7 +579,7 @@
 
   std::string data;
   if (body)
-    base::JSONWriter::Write(body, &data);
+    base::JSONWriter::Write(*body, &data);
 
   const std::string mime_type{chromeos::mime::AppendParameter(
       chromeos::mime::application::kJson,
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 86f6988..6921f47 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -153,8 +153,8 @@
   }
 
   std::string device_info_str;
-  base::JSONWriter::WriteWithOptions(device_info.get(),
-      base::JSONWriter::OPTIONS_PRETTY_PRINT, &device_info_str);
+  base::JSONWriter::WriteWithOptions(
+      *device_info, base::JSONWriter::OPTIONS_PRETTY_PRINT, &device_info_str);
   response->Return(device_info_str);
 }
 
@@ -191,7 +191,7 @@
   if (!json)
     return false;
   base::JSONWriter::WriteWithOptions(
-      json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, state);
+      *json, base::JSONWriter::OPTIONS_PRETTY_PRINT, state);
   return true;
 }
 
@@ -199,8 +199,10 @@
                          const std::string& json_command,
                          const std::string& in_user_role) {
   std::string error_message;
-  std::unique_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
-      json_command, base::JSON_PARSE_RFC, nullptr, &error_message));
+  std::unique_ptr<base::Value> value(
+      base::JSONReader::ReadAndReturnError(json_command, base::JSON_PARSE_RFC,
+                                           nullptr, &error_message)
+          .release());
   const base::DictionaryValue* command{nullptr};
   if (!value || !value->GetAsDictionary(&command)) {
     return response->ReplyWithError(FROM_HERE, chromeos::errors::json::kDomain,
@@ -229,8 +231,8 @@
     return;
   }
   std::string command_str;
-  base::JSONWriter::WriteWithOptions(command->ToJson().get(),
-      base::JSONWriter::OPTIONS_PRETTY_PRINT, &command_str);
+  base::JSONWriter::WriteWithOptions(
+      *command->ToJson(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &command_str);
   response->Return(command_str);
 }
 
@@ -316,8 +318,8 @@
       }, true, nullptr);
   CHECK(commands);
   std::string json;
-  base::JSONWriter::WriteWithOptions(commands.get(),
-      base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
+  base::JSONWriter::WriteWithOptions(
+      *commands, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
   dbus_adaptor_.SetCommandDefs(json);
 }
 
@@ -326,7 +328,7 @@
   CHECK(state);
   std::string json;
   base::JSONWriter::WriteWithOptions(
-      state.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
+      *state, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
   dbus_adaptor_.SetState(json);
 }
 
diff --git a/buffet/privet/cloud_delegate.cc b/buffet/privet/cloud_delegate.cc
index 95b0aff..83c7bbb 100644
--- a/buffet/privet/cloud_delegate.cc
+++ b/buffet/privet/cloud_delegate.cc
@@ -144,7 +144,7 @@
     if (!is_gcd_setup_enabled_) {
       chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
                              errors::kSetupUnavailable,
-                             "GCD setup unavailible");
+                             "GCD setup unavailable");
       return false;
     }
     if (setup_state_.IsStatusEqual(SetupState::kInProgress)) {
diff --git a/buffet/privet/cloud_delegate.h b/buffet/privet/cloud_delegate.h
index 39f3722..95bcca8 100644
--- a/buffet/privet/cloud_delegate.h
+++ b/buffet/privet/cloud_delegate.h
@@ -139,7 +139,7 @@
       buffet::StateManager* state_manager);
 
  private:
-  ObserverList<Observer> observer_list_;
+  base::ObserverList<Observer> observer_list_;
 };
 
 }  // namespace privetd
diff --git a/buffet/privet/privet_handler_unittest.cc b/buffet/privet/privet_handler_unittest.cc
index bf883bf..2ae76d9 100644
--- a/buffet/privet/privet_handler_unittest.cc
+++ b/buffet/privet/privet_handler_unittest.cc
@@ -37,8 +37,10 @@
   base::ReplaceChars(json, "'", "\"", &json);
   int error = 0;
   std::string message;
-  std::unique_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
-      json, base::JSON_PARSE_RFC, &error, &message));
+  std::unique_ptr<base::Value> value(
+      base::JSONReader::ReadAndReturnError(json, base::JSON_PARSE_RFC, &error,
+                                           &message)
+          .release());
   EXPECT_TRUE(value.get()) << "\nError: " << message << "\n" << json;
   base::DictionaryValue* dictionary_ptr = nullptr;
   if (value->GetAsDictionary(&dictionary_ptr))
diff --git a/buffet/privet/privet_manager.cc b/buffet/privet/privet_manager.cc
index 28971ae..7b23326 100644
--- a/buffet/privet/privet_manager.cc
+++ b/buffet/privet/privet_manager.cc
@@ -187,7 +187,7 @@
     std::string content_type = chromeos::mime::RemoveParameters(
         GetFirstHeader(*request, chromeos::http::request_header::kContentType));
     if (content_type == chromeos::mime::application::kJson) {
-      value.reset(base::JSONReader::Read(data));
+      value.reset(base::JSONReader::Read(data).release());
       if (value)
         value->GetAsDictionary(&dictionary);
     }
diff --git a/buffet/storage_impls.cc b/buffet/storage_impls.cc
index d030ecb..d3242b7 100644
--- a/buffet/storage_impls.cc
+++ b/buffet/storage_impls.cc
@@ -27,7 +27,7 @@
 bool FileStorage::Save(const base::DictionaryValue& config) {
   std::string json;
   base::JSONWriter::WriteWithOptions(
-      &config, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
+      config, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
   return base::ImportantFileWriter::WriteFileAtomically(file_path_, json);
 }
 
diff --git a/buffet/test_daemon/main.cc b/buffet/test_daemon/main.cc
index 64c0c00..eeb0caf 100644
--- a/buffet/test_daemon/main.cc
+++ b/buffet/test_daemon/main.cc
@@ -66,7 +66,7 @@
 std::string DictionaryToString(const chromeos::VariantDictionary& dictionary) {
   std::unique_ptr<base::DictionaryValue> json{DictionaryToJson(dictionary)};
   std::string str;
-  base::JSONWriter::Write(json.get(), &str);
+  base::JSONWriter::Write(*json, &str);
   return str;
 }
 
diff --git a/buffet/utils.cc b/buffet/utils.cc
index 707b19d..33fc292 100644
--- a/buffet/utils.cc
+++ b/buffet/utils.cc
@@ -11,6 +11,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <base/bind_helpers.h>
 #include <base/files/file_util.h>
 #include <base/json/json_reader.h>
 #include <chromeos/errors/error_codes.h>
@@ -56,7 +57,7 @@
     chromeos::ErrorPtr* error) {
   std::unique_ptr<base::DictionaryValue> result;
   std::string error_message;
-  base::Value* value = base::JSONReader::ReadAndReturnError(
+  auto value = base::JSONReader::ReadAndReturnError(
       json_string, base::JSON_PARSE_RFC, nullptr, &error_message);
   if (!value) {
     chromeos::Error::AddToPrintf(error, FROM_HERE,
@@ -69,13 +70,15 @@
   }
   base::DictionaryValue* dict_value = nullptr;
   if (!value->GetAsDictionary(&dict_value)) {
-    delete value;
     chromeos::Error::AddToPrintf(error, FROM_HERE,
                                  chromeos::errors::json::kDomain,
                                  chromeos::errors::json::kObjectExpected,
                                  "JSON string '%s' is not a JSON object",
                                  LimitString(json_string, kMaxStrLen).c_str());
     return result;
+  } else {
+    // |value| is now owned by |dict_value|.
+    base::IgnoreResult(value.release());
   }
   result.reset(dict_value);
   return result;