1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/push_messaging/push_message_data.h"
#include <memory>
#include "base/containers/span.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview_usvstring.h"
#include "third_party/blink/renderer/core/fileapi/blob.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/blob/blob_data.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
#include "v8/include/v8.h"
namespace blink {
PushMessageData* PushMessageData::Create(const String& message_string) {
// The standard supports both an empty but valid message and a null message.
// In case the message is explicitly null, return a null pointer which will
// be set in the PushEvent.
if (message_string.IsNull())
return nullptr;
return PushMessageData::Create(
MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrUSVString>(
message_string));
}
PushMessageData* PushMessageData::Create(
const V8UnionArrayBufferOrArrayBufferViewOrUSVString* message_data) {
if (!message_data)
return nullptr;
switch (message_data->GetContentType()) {
case V8UnionArrayBufferOrArrayBufferViewOrUSVString::ContentType::
kArrayBuffer: {
const DOMArrayBuffer* buffer = message_data->GetAsArrayBuffer();
return MakeGarbageCollected<PushMessageData>(buffer->ByteSpan());
}
case V8UnionArrayBufferOrArrayBufferViewOrUSVString::ContentType::
kArrayBufferView: {
const DOMArrayBufferView* buffer_view =
message_data->GetAsArrayBufferView().Get();
return MakeGarbageCollected<PushMessageData>(buffer_view->ByteSpan());
}
case V8UnionArrayBufferOrArrayBufferViewOrUSVString::ContentType::
kUSVString: {
std::string encoded_string = UTF8Encoding().Encode(
message_data->GetAsUSVString(), WTF::kNoUnencodables);
return MakeGarbageCollected<PushMessageData>(
base::as_byte_span(encoded_string));
}
}
NOTREACHED();
}
PushMessageData::PushMessageData(base::span<const uint8_t> data) {
data_.AppendSpan(data);
}
PushMessageData::~PushMessageData() = default;
DOMArrayBuffer* PushMessageData::arrayBuffer() const {
return DOMArrayBuffer::Create(data_);
}
Blob* PushMessageData::blob() const {
auto blob_data = std::make_unique<BlobData>();
blob_data->AppendBytes(data_);
// Note that the content type of the Blob object is deliberately not being
// provided, following the specification.
const uint64_t byte_length = blob_data->length();
return MakeGarbageCollected<Blob>(
BlobDataHandle::Create(std::move(blob_data), byte_length));
}
NotShared<DOMUint8Array> PushMessageData::bytes() const {
return NotShared(DOMUint8Array::Create(data_));
}
ScriptValue PushMessageData::json(ScriptState* script_state) const {
return ScriptValue(script_state->GetIsolate(),
FromJSONString(script_state, text()));
}
String PushMessageData::text() const {
return UTF8Encoding().Decode(data_);
}
} // namespace blink
|