12#include "src/inspector/protocol/Protocol.h"
19std::pair<uint8_t, uint8_t> SplitByte(uint8_t
byte, uint8_t split) {
20 return {
byte >> split, (
byte & ((1 << split) - 1)) << (6 - split)};
26 if (
'0' <=
byte &&
byte <=
'9')
36 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
37 if (
size() == 0)
return {};
38 std::basic_string<UChar>
result;
41 for (
size_t n = 0; n <
size();) {
42 auto split = SplitByte((*
bytes_)[n], 2 + 2 * (n % 3));
43 result.push_back(table[split.first | last]);
46 if (n <
size() && n % 3 == 0) {
47 result.push_back(table[split.second]);
53 result.push_back(table[last]);
71 std::vector<uint8_t>
result;
75 for (
size_t i = 0;
i < base64.
length();
i += 4) {
76 uint8_t a = 0, b = 0, c = 0, d = 0;
77 if (!DecodeByte(base64[
i + 0]).To(&a))
return {};
78 if (!DecodeByte(base64[
i + 1]).To(&b))
return {};
79 if (!DecodeByte(base64[
i + 2]).To(&c)) {
81 if (
i + 4 < base64.
length() || base64[
i + 2] != pad ||
82 base64[
i + 3] != pad) {
86 if (!DecodeByte(base64[
i + 3]).To(&d)) {
88 if (
i + 4 < base64.
length() || base64[
i + 3] != pad) {
93 result.push_back((a << 2) | (b >> 4));
94 if (base64[
i + 2] !=
'=')
result.push_back((0xFF & (b << 4)) | (c >> 2));
95 if (base64[
i + 3] !=
'=')
result.push_back((0xFF & (c << 6)) | d);
98 return Binary(std::make_shared<std::vector<uint8_t>>(std::move(
result)));
106 isolate,
reinterpret_cast<const uint16_t*
>(
string.characters16()),
116 isolate,
reinterpret_cast<const uint16_t*
>(
string.characters16()),
118 static_cast<int>(
string.
length()))
134 isolate,
reinterpret_cast<const uint8_t*
>(
string.characters8()),
138 isolate,
reinterpret_cast<const uint16_t*
>(
string.characters16()),
144 if (value.IsEmpty() || value->IsNullOrUndefined())
return String16();
145 uint32_t length = value->Length();
146 std::unique_ptr<UChar[]> buffer(
new UChar[length]);
147 value->WriteV2(isolate, 0, length,
reinterpret_cast<uint16_t*
>(buffer.get()));
148 return String16(buffer.get(), length);
153 if (value.IsEmpty() || !value->IsString())
return String16();
160 return String16(
reinterpret_cast<const char*
>(
string.characters8()),
171 if (!
string.
length())
return !(*prefix);
172 if (
string.is8Bit()) {
173 for (
size_t i = 0, j = 0; prefix[j] &&
i <
string.
length(); ++
i, ++j) {
174 if (
string.characters8()[
i] != prefix[j])
return false;
177 for (
size_t i = 0, j = 0; prefix[j] &&
i <
string.
length(); ++
i, ++j) {
178 if (
string.characters16()[
i] != prefix[j])
return false;
187class EmptyStringBuffer :
public StringBuffer {
189 StringView string()
const override {
return StringView(); }
193class StringBuffer8 :
public StringBuffer {
195 explicit StringBuffer8(std::vector<uint8_t> data) :
data_(
std::move(data)) {}
197 StringView string()
const override {
198 return StringView(
data_.data(),
data_.size());
206class StringBuffer16 :
public StringBuffer {
208 explicit StringBuffer16(String16 data) :
data_(std::move(data)) {}
210 StringView string()
const override {
211 return StringView(
data_.characters16(),
data_.length());
221 if (
string.
length() == 0)
return std::make_unique<EmptyStringBuffer>();
222 if (
string.is8Bit()) {
223 return std::make_unique<StringBuffer8>(std::vector<uint8_t>(
224 string.characters8(),
string.characters8() +
string.
length()));
226 return std::make_unique<StringBuffer16>(
231 if (str.
isEmpty())
return std::make_unique<EmptyStringBuffer>();
232 return std::make_unique<StringBuffer16>(std::move(str));
236 if (str.empty())
return std::make_unique<EmptyStringBuffer>();
237 return std::make_unique<StringBuffer8>(std::move(str));
255bool ProtocolTypeTraits<String16>::Deserialize(DeserializerState* state,
257 auto* tokenizer = state->tokenizer();
258 if (tokenizer->TokenTag() == cbor::CBORTokenTag::STRING8) {
259 const auto str = tokenizer->GetString8();
263 if (tokenizer->TokenTag() == cbor::CBORTokenTag::STRING16) {
264 const auto str = tokenizer->GetString16WireRep();
266 reinterpret_cast<const uint16_t*
>(str.data()), str.size() / 2);
269 state->RegisterError(Error::BINDINGS_STRING_VALUE_EXPECTED);
274void ProtocolTypeTraits<String16>::Serialize(
const String16& value,
275 std::vector<uint8_t>* bytes) {
276 cbor::EncodeFromUTF16(
277 span<uint16_t>(
reinterpret_cast<const uint16_t*
>(value.characters16()),
283bool ProtocolTypeTraits<Binary>::Deserialize(DeserializerState* state,
285 auto* tokenizer = state->tokenizer();
286 if (tokenizer->TokenTag() == cbor::CBORTokenTag::BINARY) {
290 if (tokenizer->TokenTag() == cbor::CBORTokenTag::STRING8) {
291 const auto str_span = tokenizer->GetString8();
293 bool success =
false;
297 state->RegisterError(Error::BINDINGS_BINARY_VALUE_EXPECTED);
302void ProtocolTypeTraits<Binary>::Serialize(
const Binary& value,
303 std::vector<uint8_t>* bytes) {
304 cbor::EncodeBinary(span<uint8_t>(value.data(), value.size()), bytes);
uint8_t data_[MAX_STACK_LENGTH]
static constexpr int kMaxLength
static V8_WARN_UNUSED_RESULT MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=NewStringType::kNormal, int length=-1)
static V8_INLINE Local< String > Empty(Isolate *isolate)
static V8_WARN_UNUSED_RESULT MaybeLocal< String > NewFromTwoByte(Isolate *isolate, const uint16_t *data, NewStringType type=NewStringType::kNormal, int length=-1)
static V8_WARN_UNUSED_RESULT MaybeLocal< String > NewFromOneByte(Isolate *isolate, const uint8_t *data, NewStringType type=NewStringType::kNormal, int length=-1)
static std::unique_ptr< StringBuffer > create(StringView)
static Binary fromBase64(const String &base64, bool *success)
std::shared_ptr< std::vector< uint8_t > > bytes_
static Binary fromSpan(v8_crdtp::span< uint8_t > span)
static String fromUTF16LE(const uint16_t *data, size_t length)
static String fromUTF8(const uint8_t *data, size_t length)
ZoneVector< RpoNumber > & result
bool stringViewStartsWith(const StringView &string, const char *prefix)
String16 toProtocolString(v8::Isolate *isolate, v8::Local< v8::String > value)
String16 stackTraceIdToString(uintptr_t id)
StringView toStringView(const String16 &string)
std::unique_ptr< StringBuffer > StringBufferFrom(String16 str)
v8::Local< v8::String > toV8String(v8::Isolate *isolate, const String16 &string)
String16 toProtocolStringWithTypeCheck(v8::Isolate *isolate, v8::Local< v8::Value > value)
String16 toString16(const StringView &string)
v8::Local< v8::String > toV8StringInternalized(v8::Isolate *isolate, const String16 &string)
Maybe< T > Just(const T &t)
#define DCHECK_GT(v1, v2)