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 |