diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-20 09:47:09 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-06-07 11:15:42 +0000 |
commit | 189d4fd8fad9e3c776873be51938cd31a42b6177 (patch) | |
tree | 6497caeff5e383937996768766ab3bb2081a40b2 /chromium/third_party/blink/renderer/bindings/core/v8/serialization | |
parent | 8bc75099d364490b22f43a7ce366b366c08f4164 (diff) | |
download | qtwebengine-chromium-189d4fd8fad9e3c776873be51938cd31a42b6177.tar.gz |
BASELINE: Update Chromium to 90.0.4430.221
Change-Id: Iff4d9d18d2fcf1a576f3b1f453010f744a232920
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/bindings/core/v8/serialization')
9 files changed, 367 insertions, 250 deletions
diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h index d1736184493..1eb157a30b0 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h @@ -43,16 +43,15 @@ enum SerializationTag { // transferred MojoHandle. kBlobTag = 'b', // uuid:WebCoreString, type:WebCoreString, size:uint64_t -> // Blob (ref) - kBlobIndexTag = 'i', // index:int32_t -> Blob (ref) - kFileTag = 'f', // file:RawFile -> File (ref) - kFileIndexTag = 'e', // index:int32_t -> File (ref) - kDOMFileSystemTag = 'd', // type:int32_t, name:WebCoreString, - // uuid:WebCoreString -> FileSystem (ref) - kNativeFileSystemFileHandleTag = 'n', // name:WebCoreString, index:uint32_t - // -> NativeFileSystemFileHandle (ref) - kNativeFileSystemDirectoryHandleTag = - 'N', // name:WebCoreString, index:uint32_t -> - // NativeFileSystemDirectoryHandle (ref) + kBlobIndexTag = 'i', // index:int32_t -> Blob (ref) + kFileTag = 'f', // file:RawFile -> File (ref) + kFileIndexTag = 'e', // index:int32_t -> File (ref) + kDOMFileSystemTag = 'd', // type:int32_t, name:WebCoreString, + // uuid:WebCoreString -> FileSystem (ref) + kFileSystemFileHandleTag = 'n', // name:WebCoreString, index:uint32_t + // -> FileSystemFileHandle (ref) + kFileSystemDirectoryHandleTag = 'N', // name:WebCoreString, index:uint32_t -> + // FileSystemDirectoryHandle (ref) kFileListTag = 'l', // length:uint32_t, files:RawFile[length] -> FileList (ref) kFileListIndexTag = diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc index 2eacec18fa6..1732c2b027b 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc @@ -8,47 +8,45 @@ namespace blink { -SerializedColorParams::SerializedColorParams() - : color_space_(SerializedColorSpace::kSRGB), - pixel_format_(SerializedPixelFormat::kRGBA8), - opacity_mode_(SerializedOpacityMode::kNonOpaque), - storage_format_(SerializedImageDataStorageFormat::kUint8Clamped) {} - -SerializedColorParams::SerializedColorParams(CanvasColorParams color_params) { - switch (color_params.ColorSpace()) { +namespace { + +SerializedColorSpace SerializeColorSpace(CanvasColorSpace color_space) { + switch (color_space) { case CanvasColorSpace::kSRGB: - color_space_ = SerializedColorSpace::kSRGB; - break; + return SerializedColorSpace::kSRGB; case CanvasColorSpace::kRec2020: - color_space_ = SerializedColorSpace::kRec2020; - break; + return SerializedColorSpace::kRec2020; case CanvasColorSpace::kP3: - color_space_ = SerializedColorSpace::kP3; - break; + return SerializedColorSpace::kP3; } + NOTREACHED(); + return SerializedColorSpace::kSRGB; +} - switch (color_params.PixelFormat()) { - case CanvasPixelFormat::kRGBA8: - pixel_format_ = SerializedPixelFormat::kRGBA8; - break; - case CanvasPixelFormat::kBGRA8: - pixel_format_ = SerializedPixelFormat::kBGRA8; - break; - case CanvasPixelFormat::kF16: - pixel_format_ = SerializedPixelFormat::kF16; - break; +CanvasColorSpace DeserializeColorSpace( + SerializedColorSpace serialized_color_space) { + switch (serialized_color_space) { + case SerializedColorSpace::kLegacyObsolete: + case SerializedColorSpace::kSRGB: + return CanvasColorSpace::kSRGB; + case SerializedColorSpace::kRec2020: + return CanvasColorSpace::kRec2020; + case SerializedColorSpace::kP3: + return CanvasColorSpace::kP3; } - - opacity_mode_ = SerializedOpacityMode::kNonOpaque; - if (color_params.GetOpacityMode() == blink::kOpaque) - opacity_mode_ = SerializedOpacityMode::kOpaque; - storage_format_ = SerializedImageDataStorageFormat::kUint8Clamped; + NOTREACHED(); + return CanvasColorSpace::kSRGB; } -SerializedColorParams::SerializedColorParams( - CanvasColorParams color_params, +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// SerializedImageDataSettings + +SerializedImageDataSettings::SerializedImageDataSettings( + CanvasColorSpace color_space, ImageDataStorageFormat storage_format) - : SerializedColorParams(color_params) { + : color_space_(SerializeColorSpace(color_space)) { switch (storage_format) { case kUint8ClampedArrayStorageFormat: storage_format_ = SerializedImageDataStorageFormat::kUint8Clamped; @@ -62,64 +60,16 @@ SerializedColorParams::SerializedColorParams( } } -SerializedColorParams::SerializedColorParams( +SerializedImageDataSettings::SerializedImageDataSettings( SerializedColorSpace color_space, - SerializedPixelFormat pixel_format, - SerializedOpacityMode opacity_mode, - SerializedImageDataStorageFormat storage_format) { - SetSerializedColorSpace(color_space); - SetSerializedPixelFormat(pixel_format); - SetSerializedOpacityMode(opacity_mode); - SetSerializedImageDataStorageFormat(storage_format); -} + SerializedImageDataStorageFormat storage_format) + : color_space_(color_space), storage_format_(storage_format) {} -CanvasColorParams SerializedColorParams::GetCanvasColorParams() const { - CanvasColorSpace color_space = CanvasColorSpace::kSRGB; - switch (color_space_) { - case SerializedColorSpace::kLegacyObsolete: - case SerializedColorSpace::kSRGB: - color_space = CanvasColorSpace::kSRGB; - break; - case SerializedColorSpace::kRec2020: - color_space = CanvasColorSpace::kRec2020; - break; - case SerializedColorSpace::kP3: - color_space = CanvasColorSpace::kP3; - break; - } - - CanvasPixelFormat pixel_format = CanvasPixelFormat::kRGBA8; - switch (pixel_format_) { - case SerializedPixelFormat::kNative8_LegacyObsolete: -#if defined(OS_ANDROID) - pixel_format = CanvasPixelFormat::kRGBA8; -#else - pixel_format = CanvasPixelFormat::kBGRA8; -#endif - break; - case SerializedPixelFormat::kRGBA8: - pixel_format = CanvasPixelFormat::kRGBA8; - break; - case SerializedPixelFormat::kBGRA8: - pixel_format = CanvasPixelFormat::kBGRA8; - break; - case SerializedPixelFormat::kF16: - pixel_format = CanvasPixelFormat::kF16; - break; - } - - blink::OpacityMode opacity_mode = blink::kNonOpaque; - if (opacity_mode_ == SerializedOpacityMode::kOpaque) - opacity_mode = blink::kOpaque; - - return CanvasColorParams(color_space, pixel_format, opacity_mode); -} - -CanvasColorSpace SerializedColorParams::GetColorSpace() const { - return GetCanvasColorParams().ColorSpace(); +CanvasColorSpace SerializedImageDataSettings::GetColorSpace() const { + return DeserializeColorSpace(color_space_); } -ImageDataStorageFormat SerializedColorParams::GetStorageFormat() const { +ImageDataStorageFormat SerializedImageDataSettings::GetStorageFormat() const { switch (storage_format_) { case SerializedImageDataStorageFormat::kUint8Clamped: return kUint8ClampedArrayStorageFormat; @@ -132,41 +82,125 @@ ImageDataStorageFormat SerializedColorParams::GetStorageFormat() const { return kUint8ClampedArrayStorageFormat; } -void SerializedColorParams::SetSerializedColorSpace( - SerializedColorSpace color_space) { - color_space_ = color_space; +ImageDataSettings* SerializedImageDataSettings::GetImageDataSettings() const { + ImageDataSettings* settings = ImageDataSettings::Create(); + switch (DeserializeColorSpace(color_space_)) { + case CanvasColorSpace::kSRGB: + settings->setColorSpace(kSRGBCanvasColorSpaceName); + break; + case CanvasColorSpace::kRec2020: + settings->setColorSpace(kRec2020CanvasColorSpaceName); + break; + case CanvasColorSpace::kP3: + settings->setColorSpace(kP3CanvasColorSpaceName); + break; + } + switch (storage_format_) { + case SerializedImageDataStorageFormat::kUint8Clamped: + settings->setStorageFormat(kUint8ClampedArrayStorageFormatName); + break; + case SerializedImageDataStorageFormat::kUint16: + settings->setStorageFormat(kUint16ArrayStorageFormatName); + break; + case SerializedImageDataStorageFormat::kFloat32: + settings->setStorageFormat(kFloat32ArrayStorageFormatName); + break; + } + return settings; } -void SerializedColorParams::SetSerializedPixelFormat( - SerializedPixelFormat pixel_format) { - pixel_format_ = pixel_format; -} +//////////////////////////////////////////////////////////////////////////////// +// SerializedImageBitmapSettings -void SerializedColorParams::SetSerializedOpacityMode( - SerializedOpacityMode opacity_mode) { - opacity_mode_ = opacity_mode; -} +SerializedImageBitmapSettings::SerializedImageBitmapSettings() = default; -void SerializedColorParams::SetSerializedImageDataStorageFormat( - SerializedImageDataStorageFormat storage_format) { - storage_format_ = storage_format; -} +SerializedImageBitmapSettings::SerializedImageBitmapSettings(SkImageInfo info) { + color_space_ = + SerializeColorSpace(CanvasColorSpaceFromSkColorSpace(info.colorSpace())); -SerializedColorSpace SerializedColorParams::GetSerializedColorSpace() const { - return color_space_; -} + switch (info.colorType()) { + default: + case kRGBA_8888_SkColorType: + pixel_format_ = SerializedPixelFormat::kRGBA8; + break; + case kBGRA_8888_SkColorType: + pixel_format_ = SerializedPixelFormat::kBGRA8; + break; + case kRGB_888x_SkColorType: + pixel_format_ = SerializedPixelFormat::kRGBX8; + break; + case kRGBA_F16_SkColorType: + pixel_format_ = SerializedPixelFormat::kF16; + break; + } -SerializedPixelFormat SerializedColorParams::GetSerializedPixelFormat() const { - return pixel_format_; + switch (info.alphaType()) { + case kUnknown_SkAlphaType: + case kPremul_SkAlphaType: + opacity_mode_ = SerializedOpacityMode::kNonOpaque; + is_premultiplied_ = true; + break; + case kUnpremul_SkAlphaType: + opacity_mode_ = SerializedOpacityMode::kNonOpaque; + is_premultiplied_ = false; + break; + case kOpaque_SkAlphaType: + opacity_mode_ = SerializedOpacityMode::kOpaque; + is_premultiplied_ = true; + break; + } } -SerializedOpacityMode SerializedColorParams::GetSerializedOpacityMode() const { - return opacity_mode_; -} +SerializedImageBitmapSettings::SerializedImageBitmapSettings( + SerializedColorSpace color_space, + SerializedPixelFormat pixel_format, + SerializedOpacityMode opacity_mode, + uint32_t is_premultiplied) + : color_space_(color_space), + pixel_format_(pixel_format), + opacity_mode_(opacity_mode), + is_premultiplied_(is_premultiplied) {} + +SkImageInfo SerializedImageBitmapSettings::GetSkImageInfo( + uint32_t width, + uint32_t height) const { + sk_sp<SkColorSpace> sk_color_space = + CanvasColorSpaceToSkColorSpace(DeserializeColorSpace(color_space_)); + + SkColorType sk_color_type = kRGBA_8888_SkColorType; + switch (pixel_format_) { + case SerializedPixelFormat::kNative8_LegacyObsolete: + sk_color_type = kN32_SkColorType; + break; + case SerializedPixelFormat::kRGBA8: + sk_color_type = kRGBA_8888_SkColorType; + break; + case SerializedPixelFormat::kBGRA8: + sk_color_type = kBGRA_8888_SkColorType; + break; + case SerializedPixelFormat::kRGBX8: + sk_color_type = kRGB_888x_SkColorType; + break; + case SerializedPixelFormat::kF16: + sk_color_type = kRGBA_F16_SkColorType; + break; + } + + SkAlphaType sk_alpha_type = kPremul_SkAlphaType; + if (opacity_mode_ == SerializedOpacityMode::kOpaque) { + sk_alpha_type = kOpaque_SkAlphaType; + } else if (is_premultiplied_) { + sk_alpha_type = kPremul_SkAlphaType; + } else { + sk_alpha_type = kUnpremul_SkAlphaType; + } + + blink::OpacityMode opacity_mode = blink::kNonOpaque; + if (opacity_mode_ == SerializedOpacityMode::kOpaque) + opacity_mode = blink::kOpaque; -SerializedImageDataStorageFormat -SerializedColorParams::GetSerializedImageDataStorageFormat() const { - return storage_format_; + return SkImageInfo::Make(width, height, sk_color_type, sk_alpha_type, + std::move(sk_color_space)); } } // namespace blink diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h index 512df80ae8e..0d87169a169 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h @@ -53,7 +53,8 @@ enum class SerializedPixelFormat : uint32_t { kF16 = 1, kRGBA8 = 2, kBGRA8 = 3, - kLast = kBGRA8, + kRGBX8 = 4, + kLast = kRGBX8, }; // This enumeration specifies the values used to serialize @@ -71,35 +72,52 @@ enum class SerializedOpacityMode : uint32_t { kLast = kOpaque, }; -class SerializedColorParams { +class SerializedImageDataSettings { public: - SerializedColorParams(); - SerializedColorParams(CanvasColorParams); - SerializedColorParams(CanvasColorParams, ImageDataStorageFormat); - SerializedColorParams(SerializedColorSpace, - SerializedPixelFormat, - SerializedOpacityMode, - SerializedImageDataStorageFormat); - - CanvasColorParams GetCanvasColorParams() const; + SerializedImageDataSettings(CanvasColorSpace, ImageDataStorageFormat); + SerializedImageDataSettings(SerializedColorSpace, + SerializedImageDataStorageFormat); + CanvasColorSpace GetColorSpace() const; ImageDataStorageFormat GetStorageFormat() const; + ImageDataSettings* GetImageDataSettings() const; - void SetSerializedColorSpace(SerializedColorSpace); - void SetSerializedPixelFormat(SerializedPixelFormat); - void SetSerializedOpacityMode(SerializedOpacityMode); - void SetSerializedImageDataStorageFormat(SerializedImageDataStorageFormat); + SerializedColorSpace GetSerializedColorSpace() const { return color_space_; } + SerializedImageDataStorageFormat GetSerializedImageDataStorageFormat() const { + return storage_format_; + } - SerializedColorSpace GetSerializedColorSpace() const; - SerializedPixelFormat GetSerializedPixelFormat() const; - SerializedImageDataStorageFormat GetSerializedImageDataStorageFormat() const; - SerializedOpacityMode GetSerializedOpacityMode() const; + private: + SerializedColorSpace color_space_ = SerializedColorSpace::kSRGB; + SerializedImageDataStorageFormat storage_format_ = + SerializedImageDataStorageFormat::kUint8Clamped; +}; + +class SerializedImageBitmapSettings { + public: + SerializedImageBitmapSettings(); + explicit SerializedImageBitmapSettings(SkImageInfo); + SerializedImageBitmapSettings(SerializedColorSpace, + SerializedPixelFormat, + SerializedOpacityMode, + uint32_t is_premultiplied); + + SkImageInfo GetSkImageInfo(uint32_t width, uint32_t height) const; + + SerializedColorSpace GetSerializedColorSpace() const { return color_space_; } + SerializedPixelFormat GetSerializedPixelFormat() const { + return pixel_format_; + } + SerializedOpacityMode GetSerializedOpacityMode() const { + return opacity_mode_; + } + uint32_t IsPremultiplied() const { return is_premultiplied_; } private: - SerializedColorSpace color_space_; - SerializedPixelFormat pixel_format_; - SerializedOpacityMode opacity_mode_; - SerializedImageDataStorageFormat storage_format_; + SerializedColorSpace color_space_ = SerializedColorSpace::kSRGB; + SerializedPixelFormat pixel_format_ = SerializedPixelFormat::kRGBA8; + SerializedOpacityMode opacity_mode_ = SerializedOpacityMode::kNonOpaque; + bool is_premultiplied_ = true; }; } // namespace blink diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc index dea409f2322..766e3328a1b 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc @@ -409,6 +409,9 @@ void SerializedScriptValue::TransferReadableStream( readable_stream->Serialize(script_state, local_port, exception_state); if (exception_state.HadException()) return; + // The last element is added by the above `AddStreamChannel()` call. + streams_.back().readable_optimizer = + readable_stream->TakeTransferringOptimizer(); } void SerializedScriptValue::TransferWritableStreams( @@ -433,6 +436,9 @@ void SerializedScriptValue::TransferWritableStream( writable_stream->Serialize(script_state, local_port, exception_state); if (exception_state.HadException()) return; + // The last element is added by the above `AddStreamChannel()` call. + streams_.back().writable_optimizer = + writable_stream->TakeTransferringOptimizer(); } void SerializedScriptValue::TransferTransformStreams( @@ -790,7 +796,7 @@ static_assert(kSerializedScriptValueVersion == "Update WebSerializedScriptValueVersion.h."); bool SerializedScriptValue::IsOriginCheckRequired() const { - return native_file_system_tokens_.size() > 0; + return file_system_access_tokens_.size() > 0; } } // namespace blink diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h index c057291fab8..7898c521db4 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h @@ -38,7 +38,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/common/messaging/message_port_channel.h" #include "third_party/blink/public/common/messaging/message_port_descriptor.h" -#include "third_party/blink/public/mojom/file_system_access/native_file_system_transfer_token.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/transferables.h" #include "third_party/blink/renderer/core/core_export.h" @@ -46,6 +46,7 @@ #include "third_party/blink/renderer/core/streams/readable_stream_transferring_optimizer.h" #include "third_party/blink/renderer/core/streams/writable_stream_transferring_optimizer.h" #include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h" +#include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/allocator/partitions.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" @@ -102,8 +103,8 @@ class CORE_EXPORT SerializedScriptValue using TransferredWasmModulesArray = WTF::Vector<v8::CompiledWasmModule>; using MessagePortChannelArray = Vector<MessagePortChannel>; using StreamArray = Vector<Stream>; - using NativeFileSystemTokensArray = - Vector<mojo::PendingRemote<mojom::blink::NativeFileSystemTransferToken>>; + using FileSystemAccessTokensArray = + Vector<mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken>>; // Increment this for each incompatible change to the wire format. // Version 2: Added StringUCharTag for UChar v8 strings. @@ -271,12 +272,19 @@ class CORE_EXPORT SerializedScriptValue size_t DataLengthInBytes() const { return data_buffer_size_; } TransferredWasmModulesArray& WasmModules() { return wasm_modules_; } + + const SecurityOrigin* origin() { return origin_.get(); } + + void set_origin(const SecurityOrigin* origin) { + origin_ = origin->IsolatedCopy(); + } + SharedArrayBufferContentsArray& SharedArrayBuffersContents() { return shared_array_buffers_contents_; } BlobDataHandleMap& BlobDataHandles() { return blob_data_handles_; } - NativeFileSystemTokensArray& NativeFileSystemTokens() { - return native_file_system_tokens_; + FileSystemAccessTokensArray& FileSystemAccessTokens() { + return file_system_access_tokens_; } MojoScopedHandleArray& MojoHandles() { return mojo_handles_; } ArrayBufferContentsArray& GetArrayBufferContentsArray() { @@ -393,10 +401,14 @@ class CORE_EXPORT SerializedScriptValue // These do not have one-use transferred contents, like the above. TransferredWasmModulesArray wasm_modules_; + // To count how often WebAssembly modules get transferred cross-origin, we + // allow to store the |SecurityOrigin| in the |V8SerializedScriptValue|. The + // |SecurityOrigin| has to be set explicitly with |set_origin()|. + scoped_refptr<SecurityOrigin> origin_; BlobDataHandleMap blob_data_handles_; MojoScopedHandleArray mojo_handles_; SharedArrayBufferContentsArray shared_array_buffers_contents_; - NativeFileSystemTokensArray native_file_system_tokens_; + FileSystemAccessTokensArray file_system_access_tokens_; HashMap<const void* const*, std::unique_ptr<Attachment>> attachments_; bool has_registered_external_allocation_; diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc index 697b1fe0ce9..e4f056150e2 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc @@ -31,6 +31,7 @@ #include "third_party/blink/renderer/core/mojo/mojo_handle.h" #include "third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" +#include "third_party/blink/renderer/core/streams/readable_stream_transferring_optimizer.h" #include "third_party/blink/renderer/core/streams/transform_stream.h" #include "third_party/blink/renderer/core/streams/writable_stream.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" @@ -95,6 +96,14 @@ size_t ReadVersionEnvelope(SerializedScriptValue* serialized_script_value, return i; } +MessagePort* CreateEntangledPort(ScriptState* script_state, + const MessagePortChannel& channel) { + MessagePort* const port = + MakeGarbageCollected<MessagePort>(*ExecutionContext::From(script_state)); + port->Entangle(channel); + return port; +} + } // namespace V8ScriptValueDeserializer::V8ScriptValueDeserializer( @@ -183,12 +192,7 @@ void V8ScriptValueDeserializer::Transfer() { // TODO(ricea): Make ExtendableMessageEvent store an // UnpackedSerializedScriptValue like MessageEvent does, and then this // special case won't be necessary. - Vector<MessagePortChannel> channels; - for (auto& stream : serialized_script_value_->GetStreams()) { - channels.push_back(stream.channel); - } - transferred_stream_ports_ = MessagePort::EntanglePorts( - *ExecutionContext::From(script_state_), channels); + streams_ = std::move(serialized_script_value_->GetStreams()); } // There's nothing else to transfer if the deserializer was not given an @@ -354,14 +358,12 @@ ScriptWrappable* V8ScriptValueDeserializer::ReadDOMObject( if (!ReadUint32(&width) || !ReadUint32(&height) || !ReadUint32(&byte_length) || !ReadRawBytes(byte_length, &pixels)) return nullptr; - CanvasColorParams color_params = - SerializedColorParams(canvas_color_space, canvas_pixel_format, - canvas_opacity_mode, - SerializedImageDataStorageFormat::kUint8Clamped) - .GetCanvasColorParams(); - base::CheckedNumeric<uint32_t> computed_byte_length = width; - computed_byte_length *= height; - computed_byte_length *= color_params.BytesPerPixel(); + SkImageInfo info = + SerializedImageBitmapSettings(canvas_color_space, canvas_pixel_format, + canvas_opacity_mode, is_premultiplied) + .GetSkImageInfo(width, height); + base::CheckedNumeric<uint32_t> computed_byte_length = + info.computeMinByteSize(); if (!computed_byte_length.IsValid() || computed_byte_length.ValueOrDie() != byte_length) return nullptr; @@ -370,8 +372,8 @@ ScriptWrappable* V8ScriptValueDeserializer::ReadDOMObject( // been deprecated. return nullptr; } - return MakeGarbageCollected<ImageBitmap>( - pixels, width, height, is_premultiplied, origin_clean, color_params); + SkPixmap pixmap(info, pixels, info.minRowBytes()); + return MakeGarbageCollected<ImageBitmap>(pixmap, origin_clean); } case kImageBitmapTransferTag: { uint32_t index = 0; @@ -426,24 +428,23 @@ ScriptWrappable* V8ScriptValueDeserializer::ReadDOMObject( return nullptr; } - SerializedColorParams color_params( - canvas_color_space, SerializedPixelFormat::kNative8_LegacyObsolete, - SerializedOpacityMode::kNonOpaque, image_data_storage_format); - ImageDataStorageFormat storage_format = color_params.GetStorageFormat(); + SerializedImageDataSettings settings(canvas_color_space, + image_data_storage_format); base::CheckedNumeric<size_t> computed_byte_length = width; computed_byte_length *= height; computed_byte_length *= - ImageData::StorageFormatBytesPerPixel(storage_format); + ImageData::StorageFormatBytesPerPixel(settings.GetStorageFormat()); if (!computed_byte_length.IsValid() || computed_byte_length.ValueOrDie() != byte_length) return nullptr; - ImageData* image_data = ImageData::Create( - IntSize(width, height), color_params.GetColorSpace(), storage_format); + ImageData* image_data = ImageData::ValidateAndCreate( + width, height, base::nullopt, settings.GetImageDataSettings(), + exception_state); if (!image_data) return nullptr; - DOMArrayBufferBase* pixel_buffer = image_data->BufferBase(); - DCHECK_EQ(pixel_buffer->ByteLength(), byte_length); - memcpy(pixel_buffer->Data(), pixels, byte_length); + SkPixmap image_data_pixmap = image_data->GetSkPixmap(); + DCHECK_EQ(image_data_pixmap.computeByteSize(), byte_length); + memcpy(image_data_pixmap.writable_addr(), pixels, byte_length); return image_data; } case kDOMPointTag: { @@ -558,52 +559,56 @@ ScriptWrappable* V8ScriptValueDeserializer::ReadDOMObject( if (!TransferableStreamsEnabled()) return nullptr; uint32_t index = 0; - if (!ReadUint32(&index) || !transferred_stream_ports_ || - index >= transferred_stream_ports_->size()) { + if (!ReadUint32(&index) || index >= streams_.size()) { return nullptr; } return ReadableStream::Deserialize( - script_state_, (*transferred_stream_ports_)[index].Get(), - exception_state); + script_state_, + CreateEntangledPort(GetScriptState(), streams_[index].channel), + std::move(streams_[index].readable_optimizer), exception_state); } case kWritableStreamTransferTag: { if (!TransferableStreamsEnabled()) return nullptr; uint32_t index = 0; - if (!ReadUint32(&index) || !transferred_stream_ports_ || - index >= transferred_stream_ports_->size()) { + if (!ReadUint32(&index) || index >= streams_.size()) { return nullptr; } return WritableStream::Deserialize( - script_state_, (*transferred_stream_ports_)[index].Get(), - exception_state); + script_state_, + CreateEntangledPort(GetScriptState(), streams_[index].channel), + std::move(streams_[index].writable_optimizer), exception_state); } case kTransformStreamTransferTag: { if (!TransferableStreamsEnabled()) return nullptr; uint32_t index = 0; - if (!ReadUint32(&index) || !transferred_stream_ports_ || + if (!ReadUint32(&index) || index == std::numeric_limits<decltype(index)>::max() || - index + 1 >= transferred_stream_ports_->size()) { + index + 1 >= streams_.size()) { return nullptr; } + MessagePort* const port_for_readable = + CreateEntangledPort(GetScriptState(), streams_[index].channel); + MessagePort* const port_for_writable = + CreateEntangledPort(GetScriptState(), streams_[index + 1].channel); // https://streams.spec.whatwg.org/#ts-transfer // 1. Let readableRecord be ! // StructuredDeserializeWithTransfer(dataHolder.[[readable]], the // current Realm). - ReadableStream* readable = ReadableStream::Deserialize( - script_state_, (*transferred_stream_ports_)[index].Get(), - exception_state); + ReadableStream* readable = + ReadableStream::Deserialize(script_state_, port_for_readable, + /*optimizer=*/nullptr, exception_state); if (!readable) return nullptr; // 2. Let writableRecord be ! // StructuredDeserializeWithTransfer(dataHolder.[[writable]], the // current Realm). - WritableStream* writable = WritableStream::Deserialize( - script_state_, (*transferred_stream_ports_)[index + 1].Get(), - exception_state); + WritableStream* writable = + WritableStream::Deserialize(script_state_, port_for_writable, + /*optimizer=*/nullptr, exception_state); if (!writable) return nullptr; @@ -746,6 +751,14 @@ v8::MaybeLocal<v8::WasmModuleObject> V8ScriptValueDeserializer::GetWasmModuleFromId(v8::Isolate* isolate, uint32_t id) { if (id < serialized_script_value_->WasmModules().size()) { + ExecutionContext* execution_context = ExecutionContext::From(script_state_); + DCHECK(serialized_script_value_->origin()); + UseCounter::Count(execution_context, WebFeature::kWasmModuleSharing); + if (!serialized_script_value_->origin()->IsSameOriginWith( + execution_context->GetSecurityOrigin())) { + UseCounter::Count(execution_context, + WebFeature::kCrossOriginWasmModuleSharing); + } return v8::WasmModuleObject::FromCompiledModule( isolate, serialized_script_value_->WasmModules()[id]); } diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.h b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.h index cf8af825cb8..b8e3309eda8 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.h +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.h @@ -119,7 +119,7 @@ class CORE_EXPORT V8ScriptValueDeserializer // Message ports which were transferred in. const MessagePortArray* transferred_message_ports_ = nullptr; - MessagePortArray* transferred_stream_ports_ = nullptr; + Vector<SerializedScriptValue::Stream> streams_; // Blob info for blobs stored by index. const WebBlobInfoArray* blob_info_array_ = nullptr; diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc index 25d53ad41b5..517d4f5f8ec 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc @@ -118,7 +118,7 @@ scoped_refptr<SerializedScriptValue> V8ScriptValueSerializer::Serialize( if (shared_array_buffers_.size()) { auto* execution_context = ExecutionContext::From(script_state_); - if (!execution_context->SharedArrayBufferTransferAllowed()) { + if (!execution_context->CheckSharedArrayBufferTransferAllowedAndReport()) { exception_state.ThrowDOMException( DOMExceptionCode::kDataCloneError, "SharedArrayBuffer transfer requires self.crossOriginIsolated."); @@ -304,7 +304,8 @@ bool V8ScriptValueSerializer::WriteDOMObject(ScriptWrappable* wrappable, return false; } WriteTag(kImageBitmapTag); - SerializedColorParams color_params(image_bitmap->GetCanvasColorParams()); + SkImageInfo info = image_bitmap->GetBitmapSkImageInfo(); + SerializedImageBitmapSettings color_params(info); WriteUint32Enum(ImageSerializationTag::kCanvasColorSpaceTag); WriteUint32Enum(color_params.GetSerializedColorSpace()); WriteUint32Enum(ImageSerializationTag::kCanvasPixelFormatTag); @@ -314,11 +315,11 @@ bool V8ScriptValueSerializer::WriteDOMObject(ScriptWrappable* wrappable, WriteUint32Enum(ImageSerializationTag::kOriginCleanTag); WriteUint32(image_bitmap->OriginClean()); WriteUint32Enum(ImageSerializationTag::kIsPremultipliedTag); - WriteUint32(image_bitmap->IsPremultiplied()); + WriteUint32(color_params.IsPremultiplied()); WriteUint32Enum(ImageSerializationTag::kEndTag); WriteUint32(image_bitmap->width()); WriteUint32(image_bitmap->height()); - Vector<uint8_t> pixels = image_bitmap->CopyBitmapData(); + Vector<uint8_t> pixels = image_bitmap->CopyBitmapData(info, false); // Check if we succeeded to copy the BitmapData. if (image_bitmap->width() != 0 && image_bitmap->height() != 0 && pixels.size() == 0) { @@ -334,19 +335,24 @@ bool V8ScriptValueSerializer::WriteDOMObject(ScriptWrappable* wrappable, if (wrapper_type_info == V8ImageData::GetWrapperTypeInfo()) { ImageData* image_data = wrappable->ToImpl<ImageData>(); WriteTag(kImageDataTag); - SerializedColorParams color_params(image_data->GetCanvasColorParams(), - image_data->GetImageDataStorageFormat()); + SerializedImageDataSettings settings( + image_data->GetCanvasColorSpace(), + image_data->GetImageDataStorageFormat()); WriteUint32Enum(ImageSerializationTag::kCanvasColorSpaceTag); - WriteUint32Enum(color_params.GetSerializedColorSpace()); + WriteUint32Enum(settings.GetSerializedColorSpace()); WriteUint32Enum(ImageSerializationTag::kImageDataStorageFormatTag); - WriteUint32Enum(color_params.GetSerializedImageDataStorageFormat()); + WriteUint32Enum(settings.GetSerializedImageDataStorageFormat()); WriteUint32Enum(ImageSerializationTag::kEndTag); WriteUint32(image_data->width()); WriteUint32(image_data->height()); - DOMArrayBufferBase* pixel_buffer = image_data->BufferBase(); - size_t pixel_buffer_length = pixel_buffer->ByteLength(); - WriteUint64(base::strict_cast<uint64_t>(pixel_buffer_length)); - WriteRawBytes(pixel_buffer->Data(), pixel_buffer_length); + if (image_data->IsBufferBaseDetached()) { + WriteUint64(0u); + } else { + SkPixmap image_data_pixmap = image_data->GetSkPixmap(); + size_t pixel_buffer_length = image_data_pixmap.computeByteSize(); + WriteUint64(base::strict_cast<uint64_t>(pixel_buffer_length)); + WriteRawBytes(image_data_pixmap.addr(), pixel_buffer_length); + } return true; } if (wrapper_type_info == V8DOMPoint::GetWrapperTypeInfo()) { @@ -762,6 +768,13 @@ v8::Maybe<uint32_t> V8ScriptValueSerializer::GetWasmModuleTransferId( // simple and should perform sufficiently well under these expectations. serialized_script_value_->WasmModules().push_back( module->GetCompiledModule()); + if (!serialized_script_value_->origin()) { + // Store the |SecurityOrigin| of the current |ExecutionContext| to count + // during deserialization if the WebAssembly module got transferred + // cross-origin. + serialized_script_value_->set_origin( + ExecutionContext::From(script_state_)->GetSecurityOrigin()); + } uint32_t size = static_cast<uint32_t>(serialized_script_value_->WasmModules().size()); DCHECK_GE(size, 1u); @@ -777,7 +790,7 @@ v8::Maybe<uint32_t> V8ScriptValueSerializer::GetWasmModuleTransferId( void* V8ScriptValueSerializer::ReallocateBufferMemory(void* old_buffer, size_t size, size_t* actual_size) { - *actual_size = WTF::Partitions::BufferActualSize(size); + *actual_size = WTF::Partitions::BufferPotentialCapacity(size); return WTF::Partitions::BufferTryRealloc(old_buffer, *actual_size, "SerializedScriptValue buffer"); } diff --git a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc index d7195549a41..f8e1a441fa8 100644 --- a/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc +++ b/chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc @@ -759,8 +759,11 @@ TEST(V8ScriptValueSerializerTest, DecodeDOMMatrixReadOnly) { TEST(V8ScriptValueSerializerTest, RoundTripImageData) { // ImageData objects should serialize and deserialize correctly. V8TestingScope scope; - ImageData* image_data = ImageData::Create(2, 1, ASSERT_NO_EXCEPTION); - image_data->data().GetAsUint8ClampedArray()->Data()[0] = 200; + ImageData* image_data = ImageData::ValidateAndCreate( + 2, 1, base::nullopt, nullptr, ASSERT_NO_EXCEPTION); + SkPixmap pm = image_data->GetSkPixmap(); + pm.writable_addr32(0, 0)[0] = 200u; + pm.writable_addr32(1, 0)[0] = 100u; v8::Local<v8::Value> wrapper = ToV8(image_data, scope.GetContext()->Global(), scope.GetIsolate()); v8::Local<v8::Value> result = RoundTrip(wrapper, scope); @@ -768,21 +771,40 @@ TEST(V8ScriptValueSerializerTest, RoundTripImageData) { ImageData* new_image_data = V8ImageData::ToImpl(result.As<v8::Object>()); EXPECT_NE(image_data, new_image_data); EXPECT_EQ(image_data->Size(), new_image_data->Size()); - EXPECT_EQ(image_data->data().GetAsUint8ClampedArray()->length(), - new_image_data->data().GetAsUint8ClampedArray()->length()); - EXPECT_EQ(200, new_image_data->data().GetAsUint8ClampedArray()->Data()[0]); + SkPixmap new_pm = new_image_data->GetSkPixmap(); + EXPECT_EQ(200u, new_pm.addr32(0, 0)[0]); + EXPECT_EQ(100u, new_pm.addr32(1, 0)[0]); +} + +TEST(V8ScriptValueSerializerTest, RoundTripDetachedImageData) { + // If an ImageData is detached, it can be serialized, but will fail when being + // deserialized. + V8TestingScope scope; + ImageData* image_data = ImageData::ValidateAndCreate( + 2, 1, base::nullopt, nullptr, ASSERT_NO_EXCEPTION); + SkPixmap pm = image_data->GetSkPixmap(); + pm.writable_addr32(0, 0)[0] = 200u; + image_data->data().GetAsUint8ClampedArray()->BufferBase()->Detach(); + + v8::Local<v8::Value> wrapper = + ToV8(image_data, scope.GetContext()->Global(), scope.GetIsolate()); + v8::Local<v8::Value> result = RoundTrip(wrapper, scope); + EXPECT_FALSE(V8ImageData::HasInstance(result, scope.GetIsolate())); } TEST(V8ScriptValueSerializerTest, RoundTripImageDataWithColorSpaceInfo) { // ImageData objects with color space information should serialize and // deserialize correctly. V8TestingScope scope; - ImageDataColorSettings* color_settings = ImageDataColorSettings::Create(); - color_settings->setColorSpace("p3"); - color_settings->setStorageFormat("float32"); - ImageData* image_data = - ImageData::CreateImageData(2, 1, color_settings, ASSERT_NO_EXCEPTION); - static_cast<unsigned char*>(image_data->BufferBase()->Data())[0] = 200; + ImageDataSettings* image_data_settings = ImageDataSettings::Create(); + image_data_settings->setColorSpace("display-p3"); + image_data_settings->setStorageFormat("float32"); + ImageData* image_data = ImageData::ValidateAndCreate( + 2, 1, base::nullopt, image_data_settings, ASSERT_NO_EXCEPTION); + SkPixmap pm = image_data->GetSkPixmap(); + EXPECT_EQ(kRGBA_F32_SkColorType, pm.info().colorType()); + static_cast<float*>(pm.writable_addr(0, 0))[0] = 200.f; + v8::Local<v8::Value> wrapper = ToV8(image_data, scope.GetContext()->Global(), scope.GetIsolate()); v8::Local<v8::Value> result = RoundTrip(wrapper, scope); @@ -790,14 +812,12 @@ TEST(V8ScriptValueSerializerTest, RoundTripImageDataWithColorSpaceInfo) { ImageData* new_image_data = V8ImageData::ToImpl(result.As<v8::Object>()); EXPECT_NE(image_data, new_image_data); EXPECT_EQ(image_data->Size(), new_image_data->Size()); - ImageDataColorSettings* new_color_settings = - new_image_data->getColorSettings(); - EXPECT_EQ("p3", new_color_settings->colorSpace()); - EXPECT_EQ("float32", new_color_settings->storageFormat()); - EXPECT_EQ(image_data->BufferBase()->ByteLength(), - new_image_data->BufferBase()->ByteLength()); - EXPECT_EQ(200, static_cast<unsigned char*>( - new_image_data->BufferBase()->Data())[0]); + ImageDataSettings* new_image_data_settings = new_image_data->getSettings(); + EXPECT_EQ("display-p3", new_image_data_settings->colorSpace()); + EXPECT_EQ("float32", new_image_data_settings->storageFormat()); + SkPixmap new_pm = new_image_data->GetSkPixmap(); + EXPECT_EQ(kRGBA_F32_SkColorType, new_pm.info().colorType()); + EXPECT_EQ(200.f, reinterpret_cast<const float*>(new_pm.addr(0, 0))[0]); } TEST(V8ScriptValueSerializerTest, DecodeImageDataV9) { @@ -814,8 +834,9 @@ TEST(V8ScriptValueSerializerTest, DecodeImageDataV9) { ASSERT_TRUE(V8ImageData::HasInstance(result, scope.GetIsolate())); ImageData* new_image_data = V8ImageData::ToImpl(result.As<v8::Object>()); EXPECT_EQ(IntSize(2, 1), new_image_data->Size()); - EXPECT_EQ(8u, new_image_data->data().GetAsUint8ClampedArray()->length()); - EXPECT_EQ(200, new_image_data->data().GetAsUint8ClampedArray()->Data()[0]); + SkPixmap new_pm = new_image_data->GetSkPixmap(); + EXPECT_EQ(8u, new_pm.computeByteSize()); + EXPECT_EQ(200u, new_pm.addr32()[0]); } TEST(V8ScriptValueSerializerTest, DecodeImageDataV16) { @@ -829,8 +850,10 @@ TEST(V8ScriptValueSerializerTest, DecodeImageDataV16) { ASSERT_TRUE(V8ImageData::HasInstance(result, scope.GetIsolate())); ImageData* new_image_data = V8ImageData::ToImpl(result.As<v8::Object>()); EXPECT_EQ(IntSize(2, 1), new_image_data->Size()); - EXPECT_EQ(8u, new_image_data->data().GetAsUint8ClampedArray()->length()); - EXPECT_EQ(200, new_image_data->data().GetAsUint8ClampedArray()->Data()[0]); + SkPixmap new_pm = new_image_data->GetSkPixmap(); + EXPECT_EQ(kRGBA_8888_SkColorType, new_pm.info().colorType()); + EXPECT_EQ(8u, new_pm.computeByteSize()); + EXPECT_EQ(200u, new_pm.addr32()[0]); } TEST(V8ScriptValueSerializerTest, DecodeImageDataV18) { @@ -846,13 +869,12 @@ TEST(V8ScriptValueSerializerTest, DecodeImageDataV18) { ASSERT_TRUE(V8ImageData::HasInstance(result, scope.GetIsolate())); ImageData* new_image_data = V8ImageData::ToImpl(result.As<v8::Object>()); EXPECT_EQ(IntSize(2, 1), new_image_data->Size()); - ImageDataColorSettings* new_color_settings = - new_image_data->getColorSettings(); - EXPECT_EQ("p3", new_color_settings->colorSpace()); - EXPECT_EQ("float32", new_color_settings->storageFormat()); - EXPECT_EQ(32u, new_image_data->BufferBase()->ByteLength()); - EXPECT_EQ(200, static_cast<unsigned char*>( - new_image_data->BufferBase()->Data())[0]); + ImageDataSettings* new_image_data_settings = new_image_data->getSettings(); + EXPECT_EQ("display-p3", new_image_data_settings->colorSpace()); + EXPECT_EQ("float32", new_image_data_settings->storageFormat()); + SkPixmap new_pm = new_image_data->GetSkPixmap(); + EXPECT_EQ(kRGBA_F32_SkColorType, new_pm.info().colorType()); + EXPECT_EQ(200u, static_cast<const uint8_t*>(new_pm.addr(0, 0))[0]); } TEST(V8ScriptValueSerializerTest, InvalidImageDataDecodeV18) { @@ -1037,12 +1059,12 @@ TEST(V8ScriptValueSerializerTest, RoundTripImageBitmap) { } TEST(V8ScriptValueSerializerTest, RoundTripImageBitmapWithColorSpaceInfo) { + sk_sp<SkColorSpace> p3 = + SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3); V8TestingScope scope; // Make a 10x7 red ImageBitmap in P3 color space. SkImageInfo info = - SkImageInfo::Make(10, 7, kRGBA_F16_SkColorType, kPremul_SkAlphaType, - SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, - SkNamedGamut::kDisplayP3)); + SkImageInfo::Make(10, 7, kRGBA_F16_SkColorType, kPremul_SkAlphaType, p3); sk_sp<SkSurface> surface = SkSurface::MakeRaster(info); surface->getCanvas()->clear(SK_ColorRED); auto* image_bitmap = MakeGarbageCollected<ImageBitmap>( @@ -1059,9 +1081,9 @@ TEST(V8ScriptValueSerializerTest, RoundTripImageBitmapWithColorSpaceInfo) { ASSERT_EQ(IntSize(10, 7), new_image_bitmap->Size()); // Check the color settings. - CanvasColorParams color_params = new_image_bitmap->GetCanvasColorParams(); - EXPECT_EQ(CanvasColorSpace::kP3, color_params.ColorSpace()); - EXPECT_EQ(CanvasPixelFormat::kF16, color_params.PixelFormat()); + SkImageInfo bitmap_info = new_image_bitmap->GetBitmapSkImageInfo(); + EXPECT_EQ(kRGBA_F16_SkColorType, bitmap_info.colorType()); + EXPECT_TRUE(SkColorSpace::Equals(p3.get(), bitmap_info.colorSpace())); // Check that the pixel at (3, 3) is red. We expect red in P3 to be // {0x57, 0x3B, 0x68, 0x32, 0x6E, 0x30, 0x00, 0x3C} when each color @@ -1128,6 +1150,8 @@ TEST(V8ScriptValueSerializerTest, DecodeImageBitmapV18) { {0xff, 0x12, 0xff, 0x0d, 0x5c, 0x67, 0x01, 0x03, 0x02, 0x01, 0x04, 0x01, 0x05, 0x01, 0x00, 0x02, 0x01, 0x10, 0x94, 0x3a, 0x3f, 0x28, 0x5f, 0x24, 0x00, 0x3c, 0x94, 0x3a, 0x3f, 0x28, 0x5f, 0x24, 0x00, 0x3c}); + sk_sp<SkColorSpace> p3 = + SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3); v8::Local<v8::Value> result = V8ScriptValueDeserializer(script_state, input).Deserialize(); @@ -1137,16 +1161,14 @@ TEST(V8ScriptValueSerializerTest, DecodeImageBitmapV18) { ASSERT_EQ(IntSize(2, 1), new_image_bitmap->Size()); // Check the color settings. - CanvasColorParams color_params = new_image_bitmap->GetCanvasColorParams(); - EXPECT_EQ(CanvasColorSpace::kP3, color_params.ColorSpace()); - EXPECT_EQ(CanvasPixelFormat::kF16, color_params.PixelFormat()); + SkImageInfo bitmap_info = new_image_bitmap->GetBitmapSkImageInfo(); + EXPECT_EQ(kRGBA_F16_SkColorType, bitmap_info.colorType()); + EXPECT_TRUE(SkColorSpace::Equals(p3.get(), bitmap_info.colorSpace())); // Check that the pixel at (1, 0) is red. uint8_t pixel[8] = {}; SkImageInfo info = - SkImageInfo::Make(1, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType, - SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, - SkNamedGamut::kDisplayP3)); + SkImageInfo::Make(1, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType, p3); ASSERT_TRUE( new_image_bitmap->BitmapImage()->PaintImageForCurrentFrame().readPixels( info, &pixel, 8, 1, 0)); |