// Copyright 2022 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 "extensions/common/extension_param_traits.h" #include "ipc/ipc_message_utils.h" #include "ipc/ipc_mojo_message_helper.h" #include "third_party/blink/public/mojom/blob/blob.mojom.h" #include "third_party/blink/public/mojom/blob/serialized_blob.mojom.h" namespace IPC { void ParamTraits::Write( base::Pickle* m, const param_type& p) { WriteParam(m, !p.is_null()); if (!p) return; m->WriteUInt32(p->blobs.size()); for (const auto& blob : p->blobs) { m->WriteString(blob->uuid); m->WriteString(blob->content_type); m->WriteUInt64(blob->size); MojoMessageHelper::WriteMessagePipeTo(m, blob->blob.PassPipe()); } } bool ParamTraits::Read( const base::Pickle* m, base::PickleIterator* iter, param_type* r) { bool is_not_null; if (!ReadParam(m, iter, &is_not_null)) return false; if (!is_not_null) return true; *r = extensions::mojom::ExtraResponseData::New(); uint32_t blob_count; if (!ReadParam(m, iter, &blob_count)) return false; (*r)->blobs.resize(blob_count); for (auto& blob : (*r)->blobs) { blob = blink::mojom::SerializedBlob::New(); if (!ReadParam(m, iter, &blob->uuid) || !ReadParam(m, iter, &blob->content_type) || !ReadParam(m, iter, &blob->size)) { return false; } mojo::ScopedMessagePipeHandle blob_handle; if (!MojoMessageHelper::ReadMessagePipeFrom(m, iter, &blob_handle) || !blob_handle.is_valid()) return false; blob->blob = mojo::PendingRemote( std::move(blob_handle), blink::mojom::Blob::Version_); } return true; } void ParamTraits::Log( const param_type& p, std::string* l) { l->append(""); } } // namespace IPC