blob: d5c55c4646a58a73e3ba759f6b4d84eff100c4d3 [file] [log] [blame]
// Copyright 2020 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 "pdf/ppapi_migration/value_conversions.h"
#include <algorithm>
#include "base/containers/span.h"
#include "base/notreached.h"
#include "base/values.h"
#include "ppapi/cpp/var.h"
#include "ppapi/cpp/var_array.h"
#include "ppapi/cpp/var_array_buffer.h"
#include "ppapi/cpp/var_dictionary.h"
namespace chrome_pdf {
pp::Var VarFromValue(const base::Value& value) {
switch (value.type()) {
case base::Value::Type::NONE:
return pp::Var::Null();
case base::Value::Type::BOOLEAN:
return pp::Var(value.GetBool());
case base::Value::Type::INTEGER:
return pp::Var(value.GetInt());
case base::Value::Type::DOUBLE:
return pp::Var(value.GetDouble());
case base::Value::Type::STRING:
return pp::Var(value.GetString());
case base::Value::Type::BINARY: {
const base::Value::BlobStorage& blob = value.GetBlob();
pp::VarArrayBuffer buffer(blob.size());
std::copy(blob.begin(), blob.end(), static_cast<uint8_t*>(buffer.Map()));
return buffer;
}
case base::Value::Type::DICTIONARY: {
pp::VarDictionary var_dict;
for (auto value_pair : value.DictItems()) {
var_dict.Set(value_pair.first, VarFromValue(value_pair.second));
}
return var_dict;
}
case base::Value::Type::LIST: {
pp::VarArray var_array;
uint32_t i = 0;
for (const auto& val : value.GetList()) {
var_array.Set(i, VarFromValue(val));
i++;
}
return var_array;
}
}
}
base::Value ValueFromVar(const pp::Var& var) {
switch (var.pp_var().type) {
case PP_VARTYPE_UNDEFINED:
return base::Value();
case PP_VARTYPE_NULL:
return base::Value();
case PP_VARTYPE_BOOL:
return base::Value(var.AsBool());
case PP_VARTYPE_INT32:
return base::Value(var.AsInt());
case PP_VARTYPE_DOUBLE:
return base::Value(var.AsDouble());
case PP_VARTYPE_STRING:
return base::Value(var.AsString());
case PP_VARTYPE_OBJECT:
// There is no valid conversion from PP_VARTYPE_OBJECT to a base::Value
// type. This should not be called to convert this type.
NOTREACHED();
return base::Value();
case PP_VARTYPE_ARRAY: {
pp::VarArray var_array(var);
base::Value::ListStorage list_storage(var_array.GetLength());
for (uint32_t i = 0; i < var_array.GetLength(); ++i) {
list_storage[i] = ValueFromVar(var_array.Get(i));
}
return base::Value(std::move(list_storage));
}
case PP_VARTYPE_DICTIONARY: {
base::Value val_dictionary(base::Value::Type::DICTIONARY);
pp::VarDictionary var_dict(var);
pp::VarArray dict_keys = var_dict.GetKeys();
for (uint32_t i = 0; i < dict_keys.GetLength(); ++i) {
pp::Var key = dict_keys.Get(i);
val_dictionary.SetKey(key.AsString(), ValueFromVar(var_dict.Get(key)));
}
return val_dictionary;
}
case PP_VARTYPE_ARRAY_BUFFER: {
pp::VarArrayBuffer var_array_buffer(var);
base::Value value(
base::make_span(static_cast<uint8_t*>(var_array_buffer.Map()),
var_array_buffer.ByteLength()));
var_array_buffer.Unmap();
return value;
}
case PP_VARTYPE_RESOURCE:
// There is no valid conversion from PP_VARTYPE_RESOURCE to a base::Value
// type. This should not be called to convert this type.
NOTREACHED();
return base::Value();
}
}
} // namespace chrome_pdf