| // Copyright (c) 2015 The Chromium Embedded Framework 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 "include/cef_parser.h" |
| #include "libcef/common/values_impl.h" |
| |
| #include "base/json/json_reader.h" |
| #include "base/json/json_writer.h" |
| #include "base/values.h" |
| |
| namespace { |
| |
| int GetJSONReaderOptions(cef_json_parser_options_t options) { |
| int op = base::JSON_PARSE_RFC; |
| if (options & JSON_PARSER_ALLOW_TRAILING_COMMAS) |
| op |= base::JSON_ALLOW_TRAILING_COMMAS; |
| return op; |
| } |
| |
| int GetJSONWriterOptions(cef_json_writer_options_t options) { |
| int op = 0; |
| if (options & JSON_WRITER_OMIT_BINARY_VALUES) |
| op |= base::JSONWriter::OPTIONS_OMIT_BINARY_VALUES; |
| if (options & JSON_WRITER_OMIT_DOUBLE_TYPE_PRESERVATION) |
| op |= base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION; |
| if (options & JSON_WRITER_PRETTY_PRINT) |
| op |= base::JSONWriter::OPTIONS_PRETTY_PRINT; |
| return op; |
| } |
| |
| } // namespace |
| |
| CefRefPtr<CefValue> CefParseJSON(const CefString& json_string, |
| cef_json_parser_options_t options) { |
| const std::string& json = json_string.ToString(); |
| return CefParseJSON(json.data(), json.size(), options); |
| } |
| |
| CefRefPtr<CefValue> CefParseJSON(const void* json, |
| size_t json_size, |
| cef_json_parser_options_t options) { |
| if (!json || json_size == 0) |
| return nullptr; |
| base::Optional<base::Value> parse_result = base::JSONReader::Read( |
| base::StringPiece(static_cast<const char*>(json), json_size), |
| GetJSONReaderOptions(options)); |
| if (parse_result) { |
| return new CefValueImpl( |
| base::Value::ToUniquePtrValue(std::move(parse_result.value())) |
| .release()); |
| } |
| return nullptr; |
| } |
| |
| CefRefPtr<CefValue> CefParseJSONAndReturnError( |
| const CefString& json_string, |
| cef_json_parser_options_t options, |
| cef_json_parser_error_t& error_code_out, |
| CefString& error_msg_out) { |
| const std::string& json = json_string.ToString(); |
| |
| std::string error_msg; |
| base::JSONReader::ValueWithError value_and_error = |
| base::JSONReader::ReadAndReturnValueWithError( |
| json, GetJSONReaderOptions(options)); |
| if (value_and_error.value) { |
| return new CefValueImpl( |
| base::Value::ToUniquePtrValue(std::move(value_and_error.value.value())) |
| .release()); |
| } |
| |
| error_code_out = |
| static_cast<cef_json_parser_error_t>(value_and_error.error_code); |
| error_msg_out = value_and_error.error_message; |
| return nullptr; |
| } |
| |
| CefString CefWriteJSON(CefRefPtr<CefValue> node, |
| cef_json_writer_options_t options) { |
| if (!node.get() || !node->IsValid()) |
| return CefString(); |
| |
| CefValueImpl* impl = static_cast<CefValueImpl*>(node.get()); |
| CefValueImpl::ScopedLockedValue scoped_value(impl); |
| |
| std::string json_string; |
| if (base::JSONWriter::WriteWithOptions( |
| *scoped_value.value(), GetJSONWriterOptions(options), &json_string)) { |
| return json_string; |
| } |
| return CefString(); |
| } |