| Index: content/browser/devtools/protocol_string.cc | 
| diff --git a/content/browser/devtools/protocol_string.cc b/content/browser/devtools/protocol_string.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..f5de9499d459fbee0594351106b667facbf2ccdf | 
| --- /dev/null | 
| +++ b/content/browser/devtools/protocol_string.cc | 
| @@ -0,0 +1,107 @@ | 
| +// Copyright 2016 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 "content/browser/devtools/protocol_string.h" | 
| + | 
| +#include "base/json/json_reader.h" | 
| +#include "base/values.h" | 
| +#include "content/browser/devtools/protocol/protocol.h" | 
| + | 
| +namespace content { | 
| +namespace { | 
| + | 
| +std::unique_ptr<protocol::Value> toProtocolValue( | 
| +    const base::Value* value, int depth) { | 
| +  if (!value || !depth) | 
| +    return nullptr; | 
| +  if (value->IsType(base::Value::TYPE_NULL)) | 
| +    return protocol::Value::null(); | 
| +  if (value->IsType(base::Value::TYPE_BOOLEAN)) { | 
| +    bool inner; | 
| +    value->GetAsBoolean(&inner); | 
| +    return protocol::FundamentalValue::create(inner); | 
| +  } | 
| +  if (value->IsType(base::Value::TYPE_INTEGER)) { | 
| +    int inner; | 
| +    value->GetAsInteger(&inner); | 
| +    return protocol::FundamentalValue::create(inner); | 
| +  } | 
| +  if (value->IsType(base::Value::TYPE_DOUBLE)) { | 
| +    double inner; | 
| +    value->GetAsDouble(&inner); | 
| +    return protocol::FundamentalValue::create(inner); | 
| +  } | 
| +  if (value->IsType(base::Value::TYPE_STRING)) { | 
| +    std::string inner; | 
| +    value->GetAsString(&inner); | 
| +    return protocol::StringValue::create(inner); | 
| +  } | 
| +  if (value->IsType(base::Value::TYPE_LIST)) { | 
| +    const base::ListValue* list = nullptr; | 
| +    value->GetAsList(&list); | 
| +    std::unique_ptr<protocol::ListValue> result = protocol::ListValue::create(); | 
| +    for (size_t i = 0; i < list->GetSize(); i++) { | 
| +      const base::Value* item = nullptr; | 
| +      list->Get(i, &item); | 
| +      std::unique_ptr<protocol::Value> converted = | 
| +          toProtocolValue(item, depth - 1); | 
| +      if (converted) | 
| +        result->pushValue(std::move(converted)); | 
| +    } | 
| +    return std::move(result); | 
| +  } | 
| +  if (value->IsType(base::Value::TYPE_DICTIONARY)) { | 
| +    const base::DictionaryValue* dictionary = nullptr; | 
| +    value->GetAsDictionary(&dictionary); | 
| +    std::unique_ptr<protocol::DictionaryValue> result = | 
| +        protocol::DictionaryValue::create(); | 
| +    for (base::DictionaryValue::Iterator it(*dictionary); | 
| +        !it.IsAtEnd(); it.Advance()) { | 
| +      std::unique_ptr<protocol::Value> converted = | 
| +          toProtocolValue(&it.value(), depth - 1); | 
| +      if (converted) | 
| +        result->setValue(it.key(), std::move(converted)); | 
| +    } | 
| +    return std::move(result); | 
| +  } | 
| +  return nullptr; | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| +namespace protocol { | 
| + | 
| +// static | 
| +std::unique_ptr<protocol::Value> StringUtil::parseJSON( | 
| +    const std::string& json) { | 
| +  std::unique_ptr<base::Value> value = base::JSONReader::Read(json); | 
| +  return toProtocolValue(value.get(), 1000); | 
| +} | 
| + | 
| +StringBuilder::StringBuilder() {} | 
| + | 
| +StringBuilder::~StringBuilder() {} | 
| + | 
| +void StringBuilder::append(const std::string& s) { | 
| +  string_ += s; | 
| +} | 
| + | 
| +void StringBuilder::append(char c) { | 
| +  string_ += c; | 
| +} | 
| + | 
| +void StringBuilder::append(const char* characters, size_t length) { | 
| +  string_.append(characters, length); | 
| +} | 
| + | 
| +std::string StringBuilder::toString() { | 
| +  return string_; | 
| +} | 
| + | 
| +void StringBuilder::reserveCapacity(size_t capacity) { | 
| +  string_.reserve(capacity); | 
| +} | 
| + | 
| +}  // namespace protocol | 
| +}  // namespace content | 
|  |