diff --git a/filenames.gni b/filenames.gni index ca034c58d33e..68099d7eb524 100644 --- a/filenames.gni +++ b/filenames.gni @@ -678,8 +678,8 @@ filenames = { "shell/common/skia_util.cc", "shell/common/skia_util.h", "shell/common/thread_restrictions.h", - "shell/common/v8_value_serializer.cc", - "shell/common/v8_value_serializer.h", + "shell/common/v8_util.cc", + "shell/common/v8_util.h", "shell/common/world_ids.h", "shell/renderer/api/context_bridge/object_cache.cc", "shell/renderer/api/context_bridge/object_cache.h", diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index 556a38243da8..8e457a2a96cf 100644 --- a/shell/browser/api/electron_api_app.cc +++ b/shell/browser/api/electron_api_app.cc @@ -79,7 +79,7 @@ #include "shell/common/options_switches.h" #include "shell/common/platform_util.h" #include "shell/common/thread_restrictions.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "ui/gfx/image/image.h" #if BUILDFLAG(IS_WIN) diff --git a/shell/browser/api/electron_api_utility_process.cc b/shell/browser/api/electron_api_utility_process.cc index c1bdfdda8ca6..cb3ef43018d1 100644 --- a/shell/browser/api/electron_api_utility_process.cc +++ b/shell/browser/api/electron_api_utility_process.cc @@ -29,7 +29,7 @@ #include "shell/common/gin_helper/dictionary.h" #include "shell/common/gin_helper/object_template_builder.h" #include "shell/common/node_includes.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "third_party/blink/public/common/messaging/message_port_descriptor.h" #include "third_party/blink/public/common/messaging/transferable_message_mojom_traits.h" diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index ac276102d2ed..2252860312dc 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -128,7 +128,7 @@ #include "shell/common/options_switches.h" #include "shell/common/process_util.h" #include "shell/common/thread_restrictions.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "storage/browser/file_system/isolated_context.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/input/web_input_event.h" diff --git a/shell/browser/api/electron_api_web_frame_main.cc b/shell/browser/api/electron_api_web_frame_main.cc index b6f49a68ab89..bf998e32c997 100644 --- a/shell/browser/api/electron_api_web_frame_main.cc +++ b/shell/browser/api/electron_api_web_frame_main.cc @@ -29,7 +29,7 @@ #include "shell/common/gin_helper/object_template_builder.h" #include "shell/common/gin_helper/promise.h" #include "shell/common/node_includes.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" namespace gin { diff --git a/shell/browser/api/message_port.cc b/shell/browser/api/message_port.cc index 998376eed22e..04b52901cc1c 100644 --- a/shell/browser/api/message_port.cc +++ b/shell/browser/api/message_port.cc @@ -21,7 +21,7 @@ #include "shell/common/gin_helper/error_thrower.h" #include "shell/common/gin_helper/event_emitter_caller.h" #include "shell/common/node_includes.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "third_party/blink/public/common/messaging/transferable_message.h" #include "third_party/blink/public/common/messaging/transferable_message_mojom_traits.h" #include "third_party/blink/public/mojom/messaging/transferable_message.mojom.h" diff --git a/shell/common/gin_converters/blink_converter.cc b/shell/common/gin_converters/blink_converter.cc index 715cea33481b..1e3c2716e21d 100644 --- a/shell/common/gin_converters/blink_converter.cc +++ b/shell/common/gin_converters/blink_converter.cc @@ -21,7 +21,7 @@ #include "shell/common/gin_converters/value_converter.h" #include "shell/common/gin_helper/dictionary.h" #include "shell/common/keyboard_util.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "third_party/blink/public/common/context_menu_data/edit_flags.h" #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/common/input/web_keyboard_event.h" diff --git a/shell/common/gin_converters/net_converter.cc b/shell/common/gin_converters/net_converter.cc index 7b4c01432aec..4da799134d98 100644 --- a/shell/common/gin_converters/net_converter.cc +++ b/shell/common/gin_converters/net_converter.cc @@ -32,6 +32,7 @@ #include "shell/common/gin_converters/value_converter.h" #include "shell/common/gin_helper/promise.h" #include "shell/common/node_includes.h" +#include "shell/common/v8_util.h" namespace gin { @@ -366,10 +367,7 @@ class ChunkedDataPipeReadableStream final num_bytes = *size_ - bytes_read_; MojoResult rv = data_pipe_->ReadData( MOJO_READ_DATA_FLAG_NONE, - base::span(static_cast(buf->Buffer()->Data()), - buf->ByteLength()) - .subspan(buf->ByteOffset(), num_bytes), - num_bytes); + electron::util::as_byte_span(buf).first(num_bytes), num_bytes); if (rv == MOJO_RESULT_OK) { bytes_read_ += num_bytes; // Not needed for correctness, but this allows the consumer to send the diff --git a/shell/common/v8_value_serializer.cc b/shell/common/v8_util.cc similarity index 92% rename from shell/common/v8_value_serializer.cc rename to shell/common/v8_util.cc index 915a6779ba1e..7ed0f0034039 100644 --- a/shell/common/v8_value_serializer.cc +++ b/shell/common/v8_util.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include #include @@ -240,4 +240,23 @@ v8::Local DeserializeV8Value(v8::Isolate* isolate, return V8Deserializer(isolate, data).Deserialize(); } +namespace util { + +/** + * SAFETY: There is not yet any v8::ArrayBufferView API that passes the + * UNSAFE_BUFFER_USAGE test, so let's isolate the unsafe API here. + * + * Where possible, Electron should use spans returned here instead of + * |v8::ArrayBufferView::Buffer()->Data()|, + * |v8::ArrayBufferView::ByteOffset()|, + * |v8::ArrayBufferView::ByteLength()|. + */ +base::span as_byte_span(v8::Local val) { + uint8_t* data = + static_cast(val->Buffer()->Data()) + val->ByteOffset(); + const size_t size = val->ByteLength(); + return UNSAFE_BUFFERS(base::span{data, size}); +} + +} // namespace util } // namespace electron diff --git a/shell/common/v8_value_serializer.h b/shell/common/v8_util.h similarity index 86% rename from shell/common/v8_value_serializer.h rename to shell/common/v8_util.h index 958677581bd4..59ba4c633a34 100644 --- a/shell/common/v8_value_serializer.h +++ b/shell/common/v8_util.h @@ -9,6 +9,7 @@ #include "ui/gfx/image/image_skia_rep.h" namespace v8 { +class ArrayBufferView; class Isolate; template class Local; @@ -29,6 +30,12 @@ v8::Local DeserializeV8Value(v8::Isolate* isolate, v8::Local DeserializeV8Value(v8::Isolate* isolate, base::span data); +namespace util { + +[[nodiscard]] base::span as_byte_span( + v8::Local abv); + +} // namespace util } // namespace electron #endif // ELECTRON_SHELL_COMMON_V8_VALUE_SERIALIZER_H_ diff --git a/shell/renderer/api/electron_api_ipc_renderer.cc b/shell/renderer/api/electron_api_ipc_renderer.cc index 1e0d40b57e86..6aa766abddd1 100644 --- a/shell/renderer/api/electron_api_ipc_renderer.cc +++ b/shell/renderer/api/electron_api_ipc_renderer.cc @@ -20,7 +20,7 @@ #include "shell/common/gin_helper/promise.h" #include "shell/common/node_bindings.h" #include "shell/common/node_includes.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_message_port_converter.h" diff --git a/shell/renderer/electron_api_service_impl.cc b/shell/renderer/electron_api_service_impl.cc index a236dfe7c277..8433e5ea3b6f 100644 --- a/shell/renderer/electron_api_service_impl.cc +++ b/shell/renderer/electron_api_service_impl.cc @@ -20,7 +20,7 @@ #include "shell/common/node_includes.h" #include "shell/common/options_switches.h" #include "shell/common/thread_restrictions.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "shell/renderer/electron_render_frame_observer.h" #include "shell/renderer/renderer_client_base.h" #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-shared.h" diff --git a/shell/services/node/parent_port.cc b/shell/services/node/parent_port.cc index 13d9433f30dd..b42fbdefd421 100644 --- a/shell/services/node/parent_port.cc +++ b/shell/services/node/parent_port.cc @@ -13,7 +13,7 @@ #include "shell/common/gin_helper/dictionary.h" #include "shell/common/gin_helper/event_emitter_caller.h" #include "shell/common/node_includes.h" -#include "shell/common/v8_value_serializer.h" +#include "shell/common/v8_util.h" #include "third_party/blink/public/common/messaging/transferable_message_mojom_traits.h" namespace electron {