blob: f501b5d0195f4b11164539f32ab73337d94f5f99 [file] [log] [blame]
// Copyright 2017 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 "third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits.h"
#include "mojo/public/cpp/base/big_buffer_mojom_traits.h"
#include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace mojo {
Vector<SkBitmap>
StructTraits<blink::mojom::blink::TransferableMessage::DataView,
blink::BlinkTransferableMessage>::
image_bitmap_contents_array(const blink::BlinkCloneableMessage& input) {
Vector<SkBitmap> out;
out.ReserveInitialCapacity(
input.message->GetImageBitmapContentsArray().size());
for (auto& bitmap_contents : input.message->GetImageBitmapContentsArray()) {
base::Optional<SkBitmap> bitmap = blink::ToSkBitmap(bitmap_contents);
if (!bitmap) {
return Vector<SkBitmap>();
}
out.push_back(std::move(bitmap.value()));
}
return out;
}
bool StructTraits<blink::mojom::blink::TransferableMessage::DataView,
blink::BlinkTransferableMessage>::
Read(blink::mojom::blink::TransferableMessage::DataView data,
blink::BlinkTransferableMessage* out) {
Vector<mojo::ScopedMessagePipeHandle> ports;
Vector<mojo::ScopedMessagePipeHandle> stream_channels;
blink::SerializedScriptValue::ArrayBufferContentsArray
array_buffer_contents_array;
Vector<SkBitmap> sk_bitmaps;
if (!data.ReadMessage(static_cast<blink::BlinkCloneableMessage*>(out)) ||
!data.ReadArrayBufferContentsArray(&array_buffer_contents_array) ||
!data.ReadImageBitmapContentsArray(&sk_bitmaps) ||
!data.ReadPorts(&ports) || !data.ReadStreamChannels(&stream_channels) ||
!data.ReadUserActivation(&out->user_activation)) {
return false;
}
out->ports.ReserveInitialCapacity(ports.size());
out->ports.AppendRange(std::make_move_iterator(ports.begin()),
std::make_move_iterator(ports.end()));
out->message->GetStreamChannels().AppendRange(
std::make_move_iterator(stream_channels.begin()),
std::make_move_iterator(stream_channels.end()));
out->transfer_user_activation = data.transfer_user_activation();
out->allow_autoplay = data.allow_autoplay();
out->message->SetArrayBufferContentsArray(
std::move(array_buffer_contents_array));
array_buffer_contents_array.clear();
// Bitmaps are serialized in mojo as SkBitmaps to leverage existing
// serialization logic, but SerializedScriptValue uses StaticBitmapImage, so
// the SkBitmaps need to be converted to StaticBitmapImages.
blink::SerializedScriptValue::ImageBitmapContentsArray
image_bitmap_contents_array;
for (auto& sk_bitmap : sk_bitmaps) {
const scoped_refptr<blink::StaticBitmapImage> bitmap_contents =
blink::ToStaticBitmapImage(sk_bitmap);
if (!bitmap_contents) {
return false;
}
image_bitmap_contents_array.push_back(bitmap_contents);
}
out->message->SetImageBitmapContentsArray(image_bitmap_contents_array);
return true;
}
bool StructTraits<blink::mojom::blink::SerializedArrayBufferContents::DataView,
blink::ArrayBufferContents>::
Read(blink::mojom::blink::SerializedArrayBufferContents::DataView data,
blink::ArrayBufferContents* out) {
mojo_base::BigBufferView contents_view;
if (!data.ReadContents(&contents_view))
return false;
auto contents_data = contents_view.data();
blink::ArrayBufferContents array_buffer_contents(
contents_data.size(), 1, blink::ArrayBufferContents::kNotShared,
blink::ArrayBufferContents::kDontInitialize);
if (contents_data.size() != array_buffer_contents.DataLength()) {
return false;
}
memcpy(array_buffer_contents.Data(), contents_data.data(),
contents_data.size());
*out = std::move(array_buffer_contents);
return true;
}
} // namespace mojo