summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/bindings/core/v8/serialization
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-05-20 09:47:09 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-06-07 11:15:42 +0000
commit189d4fd8fad9e3c776873be51938cd31a42b6177 (patch)
tree6497caeff5e383937996768766ab3bb2081a40b2 /chromium/third_party/blink/renderer/bindings/core/v8/serialization
parent8bc75099d364490b22f43a7ce366b366c08f4164 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h19
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.cc258
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_color_params.h64
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc8
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h24
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc97
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.h2
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc39
-rw-r--r--chromium/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc106
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));