Index: third_party/WebKit/Source/platform/JSONValues.cpp |
diff --git a/third_party/WebKit/Source/platform/JSONValues.cpp b/third_party/WebKit/Source/platform/JSONValues.cpp |
deleted file mode 100644 |
index 7bfb9dfb20986df6af820cdd5c94fbe10619b3ad..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/platform/JSONValues.cpp |
+++ /dev/null |
@@ -1,533 +0,0 @@ |
-/* |
- * Copyright (C) 2010 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "platform/JSONValues.h" |
- |
-#include "platform/Decimal.h" |
-#include "wtf/MathExtras.h" |
-#include "wtf/text/StringBuilder.h" |
-#include <algorithm> |
-#include <cmath> |
- |
-namespace blink { |
- |
-namespace { |
- |
-const char* const nullString = "null"; |
-const char* const trueString = "true"; |
-const char* const falseString = "false"; |
- |
-inline bool escapeChar(UChar c, StringBuilder* dst) |
-{ |
- switch (c) { |
- case '\b': dst->append("\\b"); break; |
- case '\f': dst->append("\\f"); break; |
- case '\n': dst->append("\\n"); break; |
- case '\r': dst->append("\\r"); break; |
- case '\t': dst->append("\\t"); break; |
- case '\\': dst->append("\\\\"); break; |
- case '"': dst->append("\\\""); break; |
- default: |
- return false; |
- } |
- return true; |
-} |
- |
-const LChar hexDigits[17] = "0123456789ABCDEF"; |
- |
-void appendUnsignedAsHex(UChar number, StringBuilder* dst) |
-{ |
- dst->append("\\u"); |
- for (size_t i = 0; i < 4; ++i) { |
- dst->append(hexDigits[(number & 0xF000) >> 12]); |
- number <<= 4; |
- } |
-} |
- |
-void writeIndent(int depth, StringBuilder* output) |
-{ |
- for (int i = 0; i < depth; ++i) |
- output->append(" "); |
-} |
- |
-} // anonymous namespace |
- |
-void escapeStringForJSON(const String& str, StringBuilder* dst) |
-{ |
- for (unsigned i = 0; i < str.length(); ++i) { |
- UChar c = str[i]; |
- if (!escapeChar(c, dst)) { |
- if (c < 32 || c > 126 || c == '<' || c == '>') { |
- // 1. Escaping <, > to prevent script execution. |
- // 2. Technically, we could also pass through c > 126 as UTF8, but this |
- // is also optional. It would also be a pain to implement here. |
- appendUnsignedAsHex(c, dst); |
- } else { |
- dst->append(c); |
- } |
- } |
- } |
-} |
- |
-void doubleQuoteStringForJSON(const String& str, StringBuilder* dst) |
-{ |
- dst->append('"'); |
- escapeStringForJSON(str, dst); |
- dst->append('"'); |
-} |
- |
-String JSONValue::quoteString(const String& input) |
-{ |
- StringBuilder builder; |
- doubleQuoteStringForJSON(input, &builder); |
- return builder.toString(); |
-} |
- |
-bool JSONValue::asBoolean(bool*) const |
-{ |
- return false; |
-} |
- |
-bool JSONValue::asDouble(double*) const |
-{ |
- return false; |
-} |
- |
-bool JSONValue::asInteger(int*) const |
-{ |
- return false; |
-} |
- |
-bool JSONValue::asString(String*) const |
-{ |
- return false; |
-} |
- |
-String JSONValue::toJSONString() const |
-{ |
- StringBuilder result; |
- result.reserveCapacity(512); |
- writeJSON(&result); |
- return result.toString(); |
-} |
- |
-String JSONValue::toPrettyJSONString() const |
-{ |
- StringBuilder result; |
- result.reserveCapacity(512); |
- prettyWriteJSON(&result); |
- return result.toString(); |
-} |
- |
-void JSONValue::writeJSON(StringBuilder* output) const |
-{ |
- DCHECK(m_type == TypeNull); |
- output->append(nullString, 4); |
-} |
- |
-void JSONValue::prettyWriteJSON(StringBuilder* output) const |
-{ |
- prettyWriteJSONInternal(output, 0); |
- output->append('\n'); |
-} |
- |
-void JSONValue::prettyWriteJSONInternal(StringBuilder* output, int depth) const |
-{ |
- writeJSON(output); |
-} |
- |
-std::unique_ptr<JSONValue> JSONValue::clone() const |
-{ |
- return JSONValue::null(); |
-} |
- |
-bool JSONBasicValue::asBoolean(bool* output) const |
-{ |
- if (getType() != TypeBoolean) |
- return false; |
- *output = m_boolValue; |
- return true; |
-} |
- |
-bool JSONBasicValue::asDouble(double* output) const |
-{ |
- if (getType() == TypeDouble) { |
- *output = m_doubleValue; |
- return true; |
- } |
- if (getType() == TypeInteger) { |
- *output = m_integerValue; |
- return true; |
- } |
- return false; |
-} |
- |
-bool JSONBasicValue::asInteger(int* output) const |
-{ |
- if (getType() != TypeInteger) |
- return false; |
- *output = m_integerValue; |
- return true; |
-} |
- |
-void JSONBasicValue::writeJSON(StringBuilder* output) const |
-{ |
- DCHECK(getType() == TypeBoolean || getType() == TypeInteger || getType() == TypeDouble); |
- if (getType() == TypeBoolean) { |
- if (m_boolValue) |
- output->append(trueString, 4); |
- else |
- output->append(falseString, 5); |
- } else if (getType() == TypeDouble) { |
- if (!std::isfinite(m_doubleValue)) { |
- output->append(nullString, 4); |
- return; |
- } |
- output->append(Decimal::fromDouble(m_doubleValue).toString()); |
- } else if (getType() == TypeInteger) { |
- output->append(String::number(m_integerValue)); |
- } |
-} |
- |
-std::unique_ptr<JSONValue> JSONBasicValue::clone() const |
-{ |
- switch (getType()) { |
- case TypeDouble: return JSONBasicValue::create(m_doubleValue); |
- case TypeInteger: return JSONBasicValue::create(m_integerValue); |
- case TypeBoolean: return JSONBasicValue::create(m_boolValue); |
- default: |
- NOTREACHED(); |
- } |
- return nullptr; |
-} |
- |
-bool JSONString::asString(String* output) const |
-{ |
- *output = m_stringValue; |
- return true; |
-} |
- |
-void JSONString::writeJSON(StringBuilder* output) const |
-{ |
- DCHECK(getType() == TypeString); |
- doubleQuoteStringForJSON(m_stringValue, output); |
-} |
- |
-std::unique_ptr<JSONValue> JSONString::clone() const |
-{ |
- return JSONString::create(m_stringValue); |
-} |
- |
-JSONObject::~JSONObject() |
-{ |
-} |
- |
-void JSONObject::setBoolean(const String& name, bool value) |
-{ |
- setValue(name, JSONBasicValue::create(value)); |
-} |
- |
-void JSONObject::setInteger(const String& name, int value) |
-{ |
- setValue(name, JSONBasicValue::create(value)); |
-} |
- |
-void JSONObject::setDouble(const String& name, double value) |
-{ |
- setValue(name, JSONBasicValue::create(value)); |
-} |
- |
-void JSONObject::setString(const String& name, const String& value) |
-{ |
- setValue(name, JSONString::create(value)); |
-} |
- |
-void JSONObject::setValue(const String& name, std::unique_ptr<JSONValue> value) |
-{ |
- set(name, value); |
-} |
- |
-void JSONObject::setObject(const String& name, std::unique_ptr<JSONObject> value) |
-{ |
- set(name, value); |
-} |
- |
-void JSONObject::setArray(const String& name, std::unique_ptr<JSONArray> value) |
-{ |
- set(name, value); |
-} |
- |
-bool JSONObject::getBoolean(const String& name, bool* output) const |
-{ |
- JSONValue* value = get(name); |
- if (!value) |
- return false; |
- return value->asBoolean(output); |
-} |
- |
-bool JSONObject::getInteger(const String& name, int* output) const |
-{ |
- JSONValue* value = get(name); |
- if (!value) |
- return false; |
- return value->asInteger(output); |
-} |
- |
-bool JSONObject::getDouble(const String& name, double* output) const |
-{ |
- JSONValue* value = get(name); |
- if (!value) |
- return false; |
- return value->asDouble(output); |
-} |
- |
-bool JSONObject::getString(const String& name, String* output) const |
-{ |
- JSONValue* value = get(name); |
- if (!value) |
- return false; |
- return value->asString(output); |
-} |
- |
-JSONObject* JSONObject::getObject(const String& name) const |
-{ |
- return JSONObject::cast(get(name)); |
-} |
- |
-JSONArray* JSONObject::getArray(const String& name) const |
-{ |
- return JSONArray::cast(get(name)); |
-} |
- |
-JSONValue* JSONObject::get(const String& name) const |
-{ |
- Dictionary::const_iterator it = m_data.find(name); |
- if (it == m_data.end()) |
- return nullptr; |
- return it->value.get(); |
-} |
- |
-JSONObject::Entry JSONObject::at(size_t index) const |
-{ |
- const String key = m_order[index]; |
- return std::make_pair(key, m_data.find(key)->value.get()); |
-} |
- |
-bool JSONObject::booleanProperty(const String& name, bool defaultValue) const |
-{ |
- bool result = defaultValue; |
- getBoolean(name, &result); |
- return result; |
-} |
- |
-int JSONObject::integerProperty(const String& name, int defaultValue) const |
-{ |
- int result = defaultValue; |
- getInteger(name, &result); |
- return result; |
-} |
- |
-double JSONObject::doubleProperty(const String& name, double defaultValue) const |
-{ |
- double result = defaultValue; |
- getDouble(name, &result); |
- return result; |
-} |
- |
-void JSONObject::remove(const String& name) |
-{ |
- m_data.remove(name); |
- for (size_t i = 0; i < m_order.size(); ++i) { |
- if (m_order[i] == name) { |
- m_order.remove(i); |
- break; |
- } |
- } |
-} |
- |
-void JSONObject::writeJSON(StringBuilder* output) const |
-{ |
- output->append('{'); |
- for (size_t i = 0; i < m_order.size(); ++i) { |
- Dictionary::const_iterator it = m_data.find(m_order[i]); |
- CHECK(it != m_data.end()); |
- if (i) |
- output->append(','); |
- doubleQuoteStringForJSON(it->key, output); |
- output->append(':'); |
- it->value->writeJSON(output); |
- } |
- output->append('}'); |
-} |
- |
-void JSONObject::prettyWriteJSONInternal(StringBuilder* output, int depth) const |
-{ |
- output->append("{\n"); |
- for (size_t i = 0; i < m_order.size(); ++i) { |
- Dictionary::const_iterator it = m_data.find(m_order[i]); |
- CHECK(it != m_data.end()); |
- if (i) |
- output->append(",\n"); |
- writeIndent(depth + 1, output); |
- doubleQuoteStringForJSON(it->key, output); |
- output->append(": "); |
- it->value->prettyWriteJSONInternal(output, depth + 1); |
- } |
- output->append('\n'); |
- writeIndent(depth, output); |
- output->append('}'); |
-} |
- |
-std::unique_ptr<JSONValue> JSONObject::clone() const |
-{ |
- std::unique_ptr<JSONObject> result = JSONObject::create(); |
- for (size_t i = 0; i < m_order.size(); ++i) { |
- String key = m_order[i]; |
- Dictionary::const_iterator value = m_data.find(key); |
- DCHECK(value != m_data.end() && value->value); |
- result->setValue(key, value->value->clone()); |
- } |
- return std::move(result); |
-} |
- |
-JSONObject::JSONObject() |
- : JSONValue(TypeObject) |
- , m_data() |
- , m_order() |
-{ |
-} |
- |
-JSONArray::~JSONArray() |
-{ |
-} |
- |
-void JSONArray::writeJSON(StringBuilder* output) const |
-{ |
- output->append('['); |
- bool first = true; |
- for (const std::unique_ptr<JSONValue>& value : m_data) { |
- if (!first) |
- output->append(','); |
- value->writeJSON(output); |
- first = false; |
- } |
- output->append(']'); |
-} |
- |
-void JSONArray::prettyWriteJSONInternal(StringBuilder* output, int depth) const |
-{ |
- output->append('['); |
- bool first = true; |
- bool lastInsertedNewLine = false; |
- for (const std::unique_ptr<JSONValue>& value : m_data) { |
- bool insertNewLine = value->getType() == JSONValue::TypeObject || value->getType() == JSONValue::TypeArray || value->getType() == JSONValue::TypeString; |
- if (first) { |
- if (insertNewLine) { |
- output->append('\n'); |
- writeIndent(depth + 1, output); |
- } |
- first = false; |
- } else { |
- output->append(','); |
- if (lastInsertedNewLine) { |
- output->append('\n'); |
- writeIndent(depth + 1, output); |
- } else { |
- output->append(' '); |
- } |
- } |
- value->prettyWriteJSONInternal(output, depth + 1); |
- lastInsertedNewLine = insertNewLine; |
- } |
- if (lastInsertedNewLine) { |
- output->append('\n'); |
- writeIndent(depth, output); |
- } |
- output->append(']'); |
-} |
- |
-std::unique_ptr<JSONValue> JSONArray::clone() const |
-{ |
- std::unique_ptr<JSONArray> result = JSONArray::create(); |
- for (const std::unique_ptr<JSONValue>& value : m_data) |
- result->pushValue(value->clone()); |
- return std::move(result); |
-} |
- |
-JSONArray::JSONArray() |
- : JSONValue(TypeArray) |
-{ |
-} |
- |
-void JSONArray::pushBoolean(bool value) |
-{ |
- m_data.append(JSONBasicValue::create(value)); |
-} |
- |
-void JSONArray::pushInteger(int value) |
-{ |
- m_data.append(JSONBasicValue::create(value)); |
-} |
- |
-void JSONArray::pushDouble(double value) |
-{ |
- m_data.append(JSONBasicValue::create(value)); |
-} |
- |
-void JSONArray::pushString(const String& value) |
-{ |
- m_data.append(JSONString::create(value)); |
-} |
- |
-void JSONArray::pushValue(std::unique_ptr<JSONValue> value) |
-{ |
- DCHECK(value); |
- m_data.append(std::move(value)); |
-} |
- |
-void JSONArray::pushObject(std::unique_ptr<JSONObject> value) |
-{ |
- DCHECK(value); |
- m_data.append(std::move(value)); |
-} |
- |
-void JSONArray::pushArray(std::unique_ptr<JSONArray> value) |
-{ |
- DCHECK(value); |
- m_data.append(std::move(value)); |
-} |
- |
-JSONValue* JSONArray::at(size_t index) |
-{ |
- DCHECK_LT(index, m_data.size()); |
- return m_data[index].get(); |
-} |
- |
-} // namespace blink |