pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

electron32: update to 32.3.0



Module Name:	pkgsrc-wip
Committed By:	kikadf <kikadf.01%gmail.com@localhost>
Pushed By:	kikadf
Date:		Sat Feb 15 10:50:37 2025 +0100
Changeset:	1ba13d71cae9d4918a5c69f95a6cce82f35e35a5

Modified Files:
	electron32/Makefile
	electron32/distinfo
	electron32/options.mk
	electron32/patches/patch-.gn
	electron32/patches/patch-base_files_file__path__watcher__bsd.cc
	electron32/patches/patch-base_process_process__handle__netbsd.cc
	electron32/patches/patch-base_process_process__iterator__netbsd.cc
	electron32/patches/patch-base_process_process__metrics__netbsd.cc
	electron32/patches/patch-base_system_sys__info__netbsd.cc
	electron32/patches/patch-base_threading_platform__thread__bsd.cc
	electron32/patches/patch-build_linux_unbundle_icu.gn
	electron32/patches/patch-build_toolchain_freebsd_BUILD.gn
	electron32/patches/patch-build_toolchain_netbsd_BUILD.gn
	electron32/patches/patch-build_toolchain_openbsd_BUILD.gn
	electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.cc
	electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.h
	electron32/patches/patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc
	electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.cc
	electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.h
	electron32/patches/patch-electron_BUILD.gn
	electron32/patches/patch-electron_build_args_all.gn
	electron32/patches/patch-electron_build_args_release.gn
	electron32/patches/patch-electron_default__app_default__app.ts
	electron32/patches/patch-electron_filenames.gni
	electron32/patches/patch-electron_lib_browser_api_app.ts
	electron32/patches/patch-electron_lib_browser_api_dialog.ts
	electron32/patches/patch-electron_lib_browser_api_menu-item-roles.ts
	electron32/patches/patch-electron_lib_browser_api_power-monitor.ts
	electron32/patches/patch-electron_lib_browser_init.ts
	electron32/patches/patch-electron_lib_browser_rpc-server.ts
	electron32/patches/patch-electron_lib_renderer_api_clipboard.ts
	electron32/patches/patch-electron_script_lib_config.py
	electron32/patches/patch-electron_script_lib_utils.js
	electron32/patches/patch-electron_script_spec-runner.js
	electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
	electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.h
	electron32/patches/patch-electron_shell_app_electron__main__delegate.cc
	electron32/patches/patch-electron_shell_app_node__main.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__app.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.h
	electron32/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
	electron32/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
	electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
	electron32/patches/patch-electron_shell_browser_api_process__metric.h
	electron32/patches/patch-electron_shell_browser_browser.cc
	electron32/patches/patch-electron_shell_browser_browser.h
	electron32/patches/patch-electron_shell_browser_browser__linux.cc
	electron32/patches/patch-electron_shell_browser_browser__process__impl.cc
	electron32/patches/patch-electron_shell_browser_browser__process__impl.h
	electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
	electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.h
	electron32/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
	electron32/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
	electron32/patches/patch-electron_shell_browser_native__window.cc
	electron32/patches/patch-electron_shell_browser_native__window__views.cc
	electron32/patches/patch-electron_shell_browser_native__window__views.h
	electron32/patches/patch-electron_shell_browser_net_system__network__context__manager.cc
	electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
	electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
	electron32/patches/patch-electron_shell_browser_printing_printing__utils.cc
	electron32/patches/patch-electron_shell_browser_relauncher__linux.cc
	electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
	electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
	electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
	electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
	electron32/patches/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc
	electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
	electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.h
	electron32/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
	electron32/patches/patch-electron_shell_common_api_electron__api__clipboard.cc
	electron32/patches/patch-electron_shell_common_api_electron__api__native__image.cc
	electron32/patches/patch-electron_shell_common_api_electron__api__native__image.h
	electron32/patches/patch-electron_shell_common_api_electron__bindings.cc
	electron32/patches/patch-electron_shell_common_electron__command__line.cc
	electron32/patches/patch-electron_shell_common_electron__command__line.h
	electron32/patches/patch-electron_shell_common_electron__paths.h
	electron32/patches/patch-electron_shell_common_gin__converters_std__converter.h
	electron32/patches/patch-electron_shell_common_node__bindings.cc
	electron32/patches/patch-electron_shell_common_node__bindings__linux.cc
	electron32/patches/patch-electron_shell_common_platform__util.h
	electron32/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
	electron32/patches/patch-electron_spec_api-app-spec.ts
	electron32/patches/patch-electron_spec_api-browser-window-spec.ts
	electron32/patches/patch-electron_spec_api-clipboard-spec.ts
	electron32/patches/patch-electron_spec_api-content-tracing-spec.ts
	electron32/patches/patch-electron_spec_api-crash-reporter-spec.ts
	electron32/patches/patch-electron_spec_api-desktop-capturer-spec.ts
	electron32/patches/patch-electron_spec_api-menu-spec.ts
	electron32/patches/patch-electron_spec_api-native-image-spec.ts
	electron32/patches/patch-electron_spec_api-net-log-spec.ts
	electron32/patches/patch-electron_spec_api-notification-dbus-spec.ts
	electron32/patches/patch-electron_spec_api-power-monitor-spec.ts
	electron32/patches/patch-electron_spec_api-process-spec.ts
	electron32/patches/patch-electron_spec_api-protocol-spec.ts
	electron32/patches/patch-electron_spec_api-safe-storage-spec.ts
	electron32/patches/patch-electron_spec_api-screen-spec.ts
	electron32/patches/patch-electron_spec_api-shell-spec.ts
	electron32/patches/patch-electron_spec_api-subframe-spec.ts
	electron32/patches/patch-electron_spec_api-tray-spec.ts
	electron32/patches/patch-electron_spec_api-utility-process-spec.ts
	electron32/patches/patch-electron_spec_api-web-frame-main-spec.ts
	electron32/patches/patch-electron_spec_chromium-spec.ts
	electron32/patches/patch-electron_spec_crash-spec.ts
	electron32/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
	electron32/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
	electron32/patches/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js
	electron32/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
	electron32/patches/patch-electron_spec_node-spec.ts
	electron32/patches/patch-electron_spec_version-bump-spec.ts
	electron32/patches/patch-electron_spec_visibility-state-spec.ts
	electron32/patches/patch-electron_spec_webview-spec.ts
	electron32/patches/patch-media_audio_sndio_audio__manager__sndio.cc
	electron32/patches/patch-media_audio_sndio_audio__manager__sndio.h
	electron32/patches/patch-media_audio_sndio_sndio__input.cc
	electron32/patches/patch-media_audio_sndio_sndio__input.h
	electron32/patches/patch-media_audio_sndio_sndio__output.cc
	electron32/patches/patch-media_audio_sndio_sndio__output.h
	electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.cc
	electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.h
	electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.cc
	electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.h
	electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.cc
	electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.h
	electron32/patches/patch-services_device_hid_hid__connection__fido.cc
	electron32/patches/patch-services_device_hid_hid__connection__fido.h
	electron32/patches/patch-services_device_hid_hid__connection__freebsd.cc
	electron32/patches/patch-services_device_hid_hid__connection__freebsd.h
	electron32/patches/patch-services_device_hid_hid__service__fido.cc
	electron32/patches/patch-services_device_hid_hid__service__fido.h
	electron32/patches/patch-services_device_hid_hid__service__freebsd.cc
	electron32/patches/patch-services_device_hid_hid__service__freebsd.h
	electron32/patches/patch-services_device_usb_usb__service__fake.cc
	electron32/patches/patch-services_device_usb_usb__service__fake.h
	electron32/patches/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc
	electron32/patches/patch-third__party_blink_renderer_platform_BUILD.gn
	electron32/patches/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
	electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc
	electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm
	electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl
	electron32/patches/patch-third__party_speech-dispatcher_libspeechd__version.h
	electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc
	electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.h
	electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-366635354.js
	electron32/patches/patch-v8_test_mjsunit_wasm_regress-367818758.js
	electron32/patches/patch-v8_tools_run-paxctl.py
Added Files:
	electron32/patches/patch-base_metrics_field__trial.cc
	electron32/patches/patch-base_metrics_persistent__histogram__allocator.cc
	electron32/patches/patch-base_metrics_persistent__histogram__allocator.h
	electron32/patches/patch-base_metrics_persistent__memory__allocator.cc
	electron32/patches/patch-base_metrics_persistent__memory__allocator.h
	electron32/patches/patch-base_metrics_persistent__memory__allocator__unittest.cc
	electron32/patches/patch-cc_tiles_gpu__image__decode__cache.cc
	electron32/patches/patch-components_metrics_persistent__system__profile.cc
	electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.cc
	electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.h
	electron32/patches/patch-third__party_blink_public_platform_web__worker__fetch__context.h
	electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.cc
	electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.h
	electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.cc
	electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.h
	electron32/patches/patch-third__party_blink_renderer_platform_accept__languages__watcher.h
	electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_DEPS
	electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.cc
	electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.h
	electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__printer_ast__printer__test.cc
	electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3.cc
	electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3__test.cc
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat3x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f16_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f32_to__workgroup.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366037039.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366314931.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_bug_tint_942.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_matrix.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_structures.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_matrix.wgsl.expected.msl
	electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_vector.wgsl.expected.msl
	electron32/patches/patch-third__party_skia_src_gpu_ganesh_ops_AAHairLinePathRenderer.cpp
	electron32/patches/patch-v8_src_builtins_builtins-object-gen.cc
	electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.cc
	electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.h
	electron32/patches/patch-v8_src_interpreter_bytecode-generator.cc
	electron32/patches/patch-v8_src_maglev_maglev-phi-representation-selector.cc
	electron32/patches/patch-v8_src_wasm_baseline_arm_liftoff-assembler-arm-inl.h
	electron32/patches/patch-v8_src_wasm_baseline_x64_liftoff-assembler-x64-inl.h
	electron32/patches/patch-v8_test_mjsunit_maglev_regress-382190919.js
	electron32/patches/patch-v8_test_mjsunit_regress_regress-374627491.js
	electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-378779897.js

Log Message:
electron32: update to 32.3.0

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=1ba13d71cae9d4918a5c69f95a6cce82f35e35a5

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 electron32/Makefile                                |  32 +-
 electron32/distinfo                                | 375 +++++++++++--------
 electron32/options.mk                              |  10 +-
 electron32/patches/patch-.gn                       |   4 +-
 .../patch-base_files_file__path__watcher__bsd.cc   |   2 +-
 .../patches/patch-base_metrics_field__trial.cc     |  78 ++++
 ...ase_metrics_persistent__histogram__allocator.cc | 169 +++++++++
 ...base_metrics_persistent__histogram__allocator.h | 253 +++++++++++++
 ...h-base_metrics_persistent__memory__allocator.cc | 320 ++++++++++++++++
 ...ch-base_metrics_persistent__memory__allocator.h | 406 +++++++++++++++++++++
 ...rics_persistent__memory__allocator__unittest.cc |  55 +++
 .../patch-base_process_process__handle__netbsd.cc  |   2 +-
 ...patch-base_process_process__iterator__netbsd.cc |   2 +-
 .../patch-base_process_process__metrics__netbsd.cc |   2 +-
 .../patches/patch-base_system_sys__info__netbsd.cc |   2 +-
 .../patch-base_threading_platform__thread__bsd.cc  |   2 +-
 .../patches/patch-build_linux_unbundle_icu.gn      |  19 +
 .../patches/patch-build_toolchain_freebsd_BUILD.gn |   2 +-
 .../patches/patch-build_toolchain_netbsd_BUILD.gn  |   2 +-
 .../patches/patch-build_toolchain_openbsd_BUILD.gn |   2 +-
 .../patch-cc_tiles_gpu__image__decode__cache.cc    |  38 ++
 ...mponents_metrics_persistent__system__profile.cc |  54 +++
 ...ay__embedder_software__output__device__proxy.cc |   2 +-
 ...lay__embedder_software__output__device__proxy.h |   2 +-
 ...file__path__watcher_file__path__watcher__bsd.cc |   2 +-
 ...renderer__host_media_video__capture__manager.cc | 140 +++++++
 ..._renderer__host_media_video__capture__manager.h |  26 ++
 ...-content_common_gpu__pre__sandbox__hook__bsd.cc |   2 +-
 ...h-content_common_gpu__pre__sandbox__hook__bsd.h |   2 +-
 electron32/patches/patch-electron_BUILD.gn         |   2 +-
 .../patches/patch-electron_build_args_all.gn       |   2 +-
 .../patches/patch-electron_build_args_release.gn   |   2 +-
 .../patch-electron_default__app_default__app.ts    |   2 +-
 electron32/patches/patch-electron_filenames.gni    |   2 +-
 .../patches/patch-electron_lib_browser_api_app.ts  |   2 +-
 .../patch-electron_lib_browser_api_dialog.ts       |   2 +-
 ...tch-electron_lib_browser_api_menu-item-roles.ts |   2 +-
 ...patch-electron_lib_browser_api_power-monitor.ts |   2 +-
 .../patches/patch-electron_lib_browser_init.ts     |   2 +-
 .../patch-electron_lib_browser_rpc-server.ts       |   2 +-
 .../patch-electron_lib_renderer_api_clipboard.ts   |   2 +-
 .../patches/patch-electron_script_lib_config.py    |   2 +-
 .../patches/patch-electron_script_lib_utils.js     |   2 +-
 .../patches/patch-electron_script_spec-runner.js   |   4 +-
 ..._shell_app_electron__crash__reporter__client.cc |   2 +-
 ...n_shell_app_electron__crash__reporter__client.h |   2 +-
 ...-electron_shell_app_electron__main__delegate.cc |   2 +-
 .../patches/patch-electron_shell_app_node__main.cc |   2 +-
 ...lectron_shell_browser_api_electron__api__app.cc |   2 +-
 ...hell_browser_api_electron__api__base__window.cc |   2 +-
 ...shell_browser_api_electron__api__base__window.h |   2 +-
 ...l_browser_api_electron__api__crash__reporter.cc |   2 +-
 ...browser_api_electron__api__desktop__capturer.cc |   2 +-
 ...ll_browser_api_electron__api__power__monitor.cc |   2 +-
 ...ell_browser_api_electron__api__power__monitor.h |   2 +-
 ...ell_browser_api_electron__api__safe__storage.cc |   2 +-
 ...ell_browser_api_electron__api__web__contents.cc |   2 +-
 ...hell_browser_api_electron__api__web__contents.h |   2 +-
 ...ch-electron_shell_browser_api_process__metric.h |   2 +-
 .../patch-electron_shell_browser_browser.cc        |   2 +-
 .../patches/patch-electron_shell_browser_browser.h |   2 +-
 .../patch-electron_shell_browser_browser__linux.cc |   2 +-
 ...lectron_shell_browser_browser__process__impl.cc |   2 +-
 ...electron_shell_browser_browser__process__impl.h |   2 +-
 ...shell_browser_electron__browser__main__parts.cc |   2 +-
 ..._shell_browser_electron__browser__main__parts.h |   2 +-
 ...rowser_electron__browser__main__parts__posix.cc |   2 +-
 ...api_runtime_electron__runtime__api__delegate.cc |   2 +-
 .../patch-electron_shell_browser_native__window.cc |   2 +-
 ...electron_shell_browser_native__window__views.cc |   2 +-
 ...-electron_shell_browser_native__window__views.h |   2 +-
 ...rowser_net_system__network__context__manager.cc |   2 +-
 ...shell_browser_osr_osr__host__display__client.cc |   2 +-
 ..._shell_browser_osr_osr__host__display__client.h |   2 +-
 ...ctron_shell_browser_printing_printing__utils.cc |   2 +-
 ...tch-electron_shell_browser_relauncher__linux.cc |   2 +-
 ..._shell_browser_ui_inspectable__web__contents.cc |   2 +-
 ...ui_inspectable__web__contents__view__delegate.h |   2 +-
 ...l_browser_ui_views_electron__views__delegate.cc |   2 +-
 ...ll_browser_ui_views_electron__views__delegate.h |   2 +-
 ...iews_inspectable__web__contents__view__views.cc |   2 +-
 ...ch-electron_shell_browser_ui_views_menu__bar.cc |   2 +-
 ...tch-electron_shell_browser_ui_views_menu__bar.h |   2 +-
 ...ctron_shell_browser_ui_views_submenu__button.cc |   2 +-
 ...on_shell_common_api_electron__api__clipboard.cc |   2 +-
 ...hell_common_api_electron__api__native__image.cc |   2 +-
 ...shell_common_api_electron__api__native__image.h |   2 +-
 ...electron_shell_common_api_electron__bindings.cc |   2 +-
 ...lectron_shell_common_electron__command__line.cc |   2 +-
 ...electron_shell_common_electron__command__line.h |   2 +-
 .../patch-electron_shell_common_electron__paths.h  |   2 +-
 ...n_shell_common_gin__converters_std__converter.h |   2 +-
 .../patch-electron_shell_common_node__bindings.cc  |   2 +-
 ...-electron_shell_common_node__bindings__linux.cc |   2 +-
 .../patch-electron_shell_common_platform__util.h   |   2 +-
 ...api_electron__api__crash__reporter__renderer.cc |   2 +-
 .../patches/patch-electron_spec_api-app-spec.ts    |   2 +-
 .../patch-electron_spec_api-browser-window-spec.ts |  38 +-
 .../patch-electron_spec_api-clipboard-spec.ts      |   2 +-
 ...patch-electron_spec_api-content-tracing-spec.ts |   2 +-
 .../patch-electron_spec_api-crash-reporter-spec.ts |   2 +-
 ...atch-electron_spec_api-desktop-capturer-spec.ts |   2 +-
 .../patches/patch-electron_spec_api-menu-spec.ts   |   2 +-
 .../patch-electron_spec_api-native-image-spec.ts   |   2 +-
 .../patch-electron_spec_api-net-log-spec.ts        |   2 +-
 ...tch-electron_spec_api-notification-dbus-spec.ts |   2 +-
 .../patch-electron_spec_api-power-monitor-spec.ts  |   2 +-
 .../patch-electron_spec_api-process-spec.ts        |   2 +-
 .../patch-electron_spec_api-protocol-spec.ts       |   2 +-
 .../patch-electron_spec_api-safe-storage-spec.ts   |   2 +-
 .../patches/patch-electron_spec_api-screen-spec.ts |   2 +-
 .../patches/patch-electron_spec_api-shell-spec.ts  |   6 +-
 .../patch-electron_spec_api-subframe-spec.ts       |   2 +-
 .../patches/patch-electron_spec_api-tray-spec.ts   |   2 +-
 ...patch-electron_spec_api-utility-process-spec.ts |   2 +-
 .../patch-electron_spec_api-web-frame-main-spec.ts |   2 +-
 .../patches/patch-electron_spec_chromium-spec.ts   |   6 +-
 .../patches/patch-electron_spec_crash-spec.ts      |   2 +-
 ...c_fixtures_api_safe-storage_decrypt-app_main.js |   2 +-
 ...c_fixtures_api_safe-storage_encrypt-app_main.js |   2 +-
 ...spec_fixtures_crash-cases_safe-storage_index.js |   2 +-
 ...n_spec_fixtures_native-addon_uv-dlopen_index.js |   2 +-
 .../patches/patch-electron_spec_node-spec.ts       |   2 +-
 .../patch-electron_spec_version-bump-spec.ts       |   2 +-
 .../patch-electron_spec_visibility-state-spec.ts   |   2 +-
 .../patches/patch-electron_spec_webview-spec.ts    |   2 +-
 ...atch-media_audio_sndio_audio__manager__sndio.cc |   2 +-
 ...patch-media_audio_sndio_audio__manager__sndio.h |   2 +-
 .../patch-media_audio_sndio_sndio__input.cc        |   2 +-
 .../patches/patch-media_audio_sndio_sndio__input.h |   2 +-
 .../patch-media_audio_sndio_sndio__output.cc       |   2 +-
 .../patch-media_audio_sndio_sndio__output.h        |   2 +-
 ...atch-sandbox_policy_freebsd_sandbox__freebsd.cc |   2 +-
 ...patch-sandbox_policy_freebsd_sandbox__freebsd.h |   2 +-
 .../patch-sandbox_policy_netbsd_sandbox__netbsd.cc |   2 +-
 .../patch-sandbox_policy_netbsd_sandbox__netbsd.h  |   2 +-
 ...atch-sandbox_policy_openbsd_sandbox__openbsd.cc |   2 +-
 ...patch-sandbox_policy_openbsd_sandbox__openbsd.h |   2 +-
 ...ch-services_device_hid_hid__connection__fido.cc |   2 +-
 ...tch-services_device_hid_hid__connection__fido.h |   2 +-
 ...services_device_hid_hid__connection__freebsd.cc |   2 +-
 ...-services_device_hid_hid__connection__freebsd.h |   2 +-
 ...patch-services_device_hid_hid__service__fido.cc |   2 +-
 .../patch-services_device_hid_hid__service__fido.h |   2 +-
 ...ch-services_device_hid_hid__service__freebsd.cc |   2 +-
 ...tch-services_device_hid_hid__service__freebsd.h |   2 +-
 ...patch-services_device_usb_usb__service__fake.cc |   2 +-
 .../patch-services_device_usb_usb__service__fake.h |   2 +-
 ...cpp_memory__instrumentation_os__metrics__bsd.cc |   2 +-
 ...k_public_platform_web__worker__fetch__context.h |  29 ++
 ...link_renderer_core_workers_worker__navigator.cc |  18 +
 ...blink_renderer_core_workers_worker__navigator.h |  26 ++
 ...r_web__service__worker__fetch__context__impl.cc |  32 ++
 ...er_web__service__worker__fetch__context__impl.h |  36 ++
 ...h-third__party_blink_renderer_platform_BUILD.gn |  10 +-
 ..._renderer_platform_accept__languages__watcher.h |  31 ++
 ...renderer_platform_loader_fetch_url__loader_DEPS |  16 +
 ...ed__or__shared__worker__fetch__context__impl.cc |  33 ++
 ...ted__or__shared__worker__fetch__context__impl.h |  25 ++
 ...hpad_crashpad_client_crashpad__client__posix.cc |   2 +-
 ...g_msl_writer_ast__printer_ast__printer__test.cc | 182 +++++++++
 ...tint_lang_msl_writer_ast__raise_packed__vec3.cc |  77 ++++
 ...ang_msl_writer_ast__raise_packed__vec3__test.cc |  50 +++
 ...ver_address__space__layout__validation__test.cc |  75 +++-
 ...y_dawn_src_tint_lang_wgsl_resolver_validator.cc |  13 +-
 ...ray_mat2x3__f16_to__workgroup.wgsl.expected.msl |  67 ++++
 ...ray_mat2x3__f32_to__workgroup.wgsl.expected.msl |  65 ++++
 ...ray_mat3x3__f32_to__workgroup.wgsl.expected.msl |  65 ++++
 ...ray_mat4x3__f16_to__workgroup.wgsl.expected.msl |  65 ++++
 ...ray_mat4x3__f32_to__workgroup.wgsl.expected.msl |  65 ++++
 ...uct_mat2x3__f16_to__workgroup.wgsl.expected.msl |  85 +++++
 ...uct_mat2x3__f32_to__workgroup.wgsl.expected.msl |  91 +++++
 ...uct_mat3x3__f16_to__workgroup.wgsl.expected.msl |  91 +++++
 ...uct_mat3x3__f32_to__workgroup.wgsl.expected.msl |  91 +++++
 ...uct_mat4x3__f16_to__workgroup.wgsl.expected.msl |  91 +++++
 ...uct_mat4x3__f32_to__workgroup.wgsl.expected.msl |  91 +++++
 ...ted_mat2x3__f16_to__workgroup.wgsl.expected.msl |  59 +++
 ...ted_mat2x3__f32_to__workgroup.wgsl.expected.msl |  59 +++
 ...ted_mat3x3__f16_to__workgroup.wgsl.expected.msl |  59 +++
 ...ted_mat3x3__f32_to__workgroup.wgsl.expected.msl |  59 +++
 ...ted_mat4x3__f16_to__workgroup.wgsl.expected.msl |  59 +++
 ...ted_mat4x3__f32_to__workgroup.wgsl.expected.msl |  59 +++
 ...arty_dawn_test_tint_bug_chromium_378541479.wgsl |   2 +-
 ...t_bug_chromium_378541479.wgsl.expected.dxc.hlsl |   2 +-
 ...t_bug_chromium_378541479.wgsl.expected.fxc.hlsl |   2 +-
 ..._tint_bug_chromium_378541479.wgsl.expected.glsl |   2 +-
 ...ug_chromium_378541479.wgsl.expected.ir.dxc.hlsl |   2 +-
 ...ug_chromium_378541479.wgsl.expected.ir.fxc.hlsl |   2 +-
 ...int_bug_chromium_378541479.wgsl.expected.ir.msl |   2 +-
 ...t_tint_bug_chromium_378541479.wgsl.expected.msl |   2 +-
 ...int_bug_chromium_378541479.wgsl.expected.spvasm |   2 +-
 ..._tint_bug_chromium_378541479.wgsl.expected.wgsl |   2 +-
 ..._test_tint_bug_tint_366037039.wgsl.expected.msl |  94 +++++
 ..._test_tint_bug_tint_366314931.wgsl.expected.msl |  42 +++
 ...y_dawn_test_tint_bug_tint_942.wgsl.expected.msl |  62 ++++
 ...s_workgroupUniformLoad_matrix.wgsl.expected.msl |  48 +++
 ...rkgroupUniformLoad_structures.wgsl.expected.msl |  74 ++++
 ...itialization_workgroup_matrix.wgsl.expected.msl |  59 +++
 ...itialization_workgroup_vector.wgsl.expected.msl |  32 ++
 ...a_src_gpu_ganesh_ops_AAHairLinePathRenderer.cpp |  50 +++
 ...__party_speech-dispatcher_libspeechd__version.h |   2 +-
 ..._dialogs_select__file__dialog__linux__portal.cc | 105 +++++-
 ...__dialogs_select__file__dialog__linux__portal.h |  32 +-
 .../patch-v8_src_builtins_builtins-object-gen.cc   |  22 ++
 ...urboshaft_wasm-gc-typed-optimization-reducer.cc |  76 ++++
 ...turboshaft_wasm-gc-typed-optimization-reducer.h |  17 +
 .../patch-v8_src_interpreter_bytecode-generator.cc |  60 +++
 ...rc_maglev_maglev-phi-representation-selector.cc |  18 +
 ...c_wasm_baseline_arm_liftoff-assembler-arm-inl.h |  46 +++
 ...c_wasm_baseline_x64_liftoff-assembler-x64-inl.h |  26 ++
 ...tch-v8_test_mjsunit_maglev_regress-382190919.js |  48 +++
 ...ch-v8_test_mjsunit_regress_regress-374627491.js |  35 ++
 ..._test_mjsunit_regress_wasm_regress-366635354.js |   2 +-
 ..._test_mjsunit_regress_wasm_regress-378779897.js |  31 ++
 ...patch-v8_test_mjsunit_wasm_regress-367818758.js |   2 +-
 electron32/patches/patch-v8_tools_run-paxctl.py    |   2 +-
 216 files changed, 4798 insertions(+), 376 deletions(-)

diffs:
diff --git a/electron32/Makefile b/electron32/Makefile
index 5109901b13..3afc78076f 100644
--- a/electron32/Makefile
+++ b/electron32/Makefile
@@ -2,7 +2,7 @@
 
 DISTNAME=			electron32-${VERSION}
 # See ${WRKSRC}/electron/DEPS for versions
-VERSION=			32.2.7
+VERSION=			32.3.0
 CHROMIUM_VERSION=		128.0.6613.186
 AUDIOIO_VERSION=		130.0
 NODE_VERSION=			20.18.1
@@ -11,6 +11,7 @@ SQUIRREL_VERSION=		0e5d146ba13101a1302d59ea6e6e0b3cace4ae38
 REACTIVEOBJC_VERSION=		74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76
 MANTLE_VERSION=			78d3966b3c331292ea29ec38661b25df0a245948
 ENGFLOW_VERSION=		955335c30a752e9ef7bff375baab5e0819b6c00d
+LLVM_MV=			18
 CATEGORIES=			devel
 MASTER_SITES=			${MASTER_SITE_GITHUB:=electron/}
 GITHUB_PROJECT=			electron
@@ -67,7 +68,7 @@ TOOL_DEPENDS+=			ninja-build-[0-9]*:../../devel/ninja-build
 TOOL_DEPENDS+=			${PYPKGPREFIX}-html5lib-[0-9]*:../../textproc/py-html5lib
 TOOL_DEPENDS+=			${PYPKGPREFIX}-beautifulsoup4-[0-9]*:../../www/py-beautifulsoup4
 TOOL_DEPENDS+=			${PYPKGPREFIX}-ply-[0-9]*:../../devel/py-ply
-TOOL_DEPENDS+=			nodejs-[0-9]*:../../lang/nodejs
+TOOL_DEPENDS+=			nodejs-20*:../../lang/nodejs20
 #TOOL_DEPENDS+=			clang-[0-9]*:../../lang/clang # clang-format
 TOOL_DEPENDS+=			rust-bindgen-[0-9]*:../../devel/rust-bindgen
 TOOL_DEPENDS+=			yarn-[0-9]*:../../devel/yarn
@@ -77,10 +78,12 @@ DEPENDS+=			xdg-utils-[0-9]*:../../misc/xdg-utils
 .include "../../mk/bsd.prefs.mk"
 .include "../../mk/compiler.mk"
 
-#ONLY_FOR_PLATFORM+=		*-*-arm # not yet
-#ONLY_FOR_PLATFORM+=		*-*-aarch64 # not yet
-#ONLY_FOR_PLATFORM+=		*-*-i386 # not yet
-ONLY_FOR_PLATFORM+=		*-*-x86_64
+.for c_arch in x86_64 aarch64
+ONLY_FOR_PLATFORM+=		NetBSD-1[0-9].*-${c_arch}
+ONLY_FOR_PLATFORM+=		Linux-*-${c_arch}
+ONLY_FOR_PLATFORM+=		Darwin-*-${c_arch}
+ONLY_FOR_PLATFORM+=		FreeBSD-*-${c_arch}
+.endfor
 
 # Workaround for brotli and other commands.
 #BUILDLINK_TRANSFORM.NetBSD+=	rm:-ldl
@@ -163,6 +166,7 @@ GN_ARGS+=	use_kerberos=false
 GN_ARGS+=	use_lld=false
 GN_ARGS+=	use_partition_alloc=true
 GN_ARGS+=	use_partition_alloc_as_malloc=false
+GN_ARGS+=	use_sndio=false
 GN_ARGS+=	use_sysroot=false
 GN_ARGS+=	use_system_freetype=true
 GN_ARGS+=	use_system_harfbuzz=true
@@ -175,7 +179,7 @@ GN_ARGS+=	v8_enable_cet_ibt=true
 
 # flags
 CFLAGS+=	-fno-stack-protector
-CFLAGS+=	-isystem${PREFIX}/lib/clang/17/include # third_party/zlib with clang
+CFLAGS+=	-isystem${PREFIX}/lib/clang/${LLVM_MV}/include # third_party/zlib with clang
 CFLAGS+=	-Wno-error=unused-command-line-argument
 CFLAGS+=	-Wno-unknown-warning-option
 
@@ -195,8 +199,8 @@ EXTRA_CXXFLAGS=	-Wno-unknown-warning-option \
 RUSTC_VERSION=	rustc -V
 MAKE_ENV+=	RUSTC_BOOTSTRAP=1
 GN_ARGS+=	enable_rust=true \
-		rust_sysroot_absolute=\"${PREFIX}\" \
-		rustc_version=\"${RUSTC_VERSION:sh}\"
+		rust_sysroot_absolute="${PREFIX}" \
+		rustc_version="${RUSTC_VERSION:sh}"
 
 PLIST_VARS+=		swiftshader
 .if ${MACHINE_ARCH} == "aarch64"
@@ -204,14 +208,10 @@ FFMPEG_TARGET=		arm64
 .elif ${MACHINE_ARCH} == "x86_64"
 PLIST.swiftshader=	yes
 FFMPEG_TARGET=		x64
-.elif ${MACHINE_ARCH} == "i386"
-EXTRA_LDFLAGS+=		-Wl,--no-keep-memory
-PLIST.swiftshader=	yes
-FFMPEG_TARGET=		ia32
 .endif
 
-GN_ARGS+=	extra_cxxflags=\"${EXTRA_CXXFLAGS}\" \
-		extra_ldflags=\"${EXTRA_LDFLAGS}\"
+GN_ARGS+=	extra_cxxflags="${EXTRA_CXXFLAGS}" \
+		extra_ldflags="${EXTRA_LDFLAGS}"
 
 # Proprietary codecs are enabled.
 FFMPEG_BRAND=	Chrome
@@ -219,7 +219,7 @@ FFMPEG_BDIR=	${WRKSRC}/third_party/ffmpeg/build.${FFMPEG_TARGET}.${LOWER_OPSYS}/
 FFMPEG_CDIR=	${WRKSRC}/third_party/ffmpeg/chromium/config/${FFMPEG_BRAND}/${LOWER_OPSYS}/${FFMPEG_TARGET}
 
 GN_ARGS+=	proprietary_codecs=true \
-		ffmpeg_branding=\"${FFMPEG_BRAND}\"
+		ffmpeg_branding="${FFMPEG_BRAND}"
 
 GN_BOOTSTRAP_FLAGS+=	--no-clean --no-rebuild
 GN_BOOTSTRAP_FLAGS+=	--skip-generate-buildfiles
diff --git a/electron32/distinfo b/electron32/distinfo
index 3fe17837a2..685beb0e2d 100644
--- a/electron32/distinfo
+++ b/electron32/distinfo
@@ -21,9 +21,9 @@ Size (chromium-128.0.6613.186.tar.xz.1) = 2000000000 bytes
 BLAKE2s (chromium-128.0.6613.186.tar.xz.2) = 81efd6f5c70b9ac1e28b0cb6def0f2d917493668c8d44a223f2192ec16053d3d
 SHA512 (chromium-128.0.6613.186.tar.xz.2) = d0042da4a2ffc329c732973e72cb6a0ab6625e3b933dd8e2f48c8036cd1c62e8ae06c65be5104926237d227e8a0988be44949ce193f773dd953d2e9f9e619f85
 Size (chromium-128.0.6613.186.tar.xz.2) = 766712880 bytes
-BLAKE2s (electron32-32.2.7.tar.gz) = a508e3a934992c0ea066c4c8d9af423fc09571c81155e560e971724113a05a25
-SHA512 (electron32-32.2.7.tar.gz) = d61dd5491409740f5318b8b1cce9aeaf9d93ab132311fff56077e804d7c8395edb1eb61049cc9f700b44f83b5a590af45b42666fd0079fcad2acba798be47382
-Size (electron32-32.2.7.tar.gz) = 14667125 bytes
+BLAKE2s (electron32-32.3.0.tar.gz) = b3bacc4b9ee896e505cb32cff371c6121a84c5c0e9509a4210f544d3c1297da1
+SHA512 (electron32-32.3.0.tar.gz) = 0838efff6c47904c088409be68ddb54c2e81a8d3a4eaf1059bae9c4a72ab1083475f710452f7ba52169b622a517ccc0e4c6de0dea767adef79393b52e88753ce
+Size (electron32-32.3.0.tar.gz) = 14717213 bytes
 BLAKE2s (kikadf-chromium-audioio-v130.0.tar.gz) = 45fe07cb8280f81b8ef490059002da426b59fe69b5ebd53951fe1dc3e9495a10
 SHA512 (kikadf-chromium-audioio-v130.0.tar.gz) = 840aed119dc69982f14fd5f4767e144bfc8a66672b660f0f05f5459070d7f6a36b8719ae7c0de049f7345dec39266759aedcdd5ee37aa4e98bcd2b44d06a3a4c
 Size (kikadf-chromium-audioio-v130.0.tar.gz) = 7824 bytes
@@ -34,7 +34,7 @@ BLAKE2s (nodejs-node-v20.18.1.tar.gz) = 6e6d743c5f2c0856fa3583d08cb7038dbfecc3ea
 SHA512 (nodejs-node-v20.18.1.tar.gz) = 631431abf99065de2529de155d54eb26d146142ab41ff94a1a838ca609d71e548ca456ecfea591d3bb76209132407095c2b63b509247d6d27d7e5d73dfcdc949
 Size (nodejs-node-v20.18.1.tar.gz) = 115585611 bytes
 SHA1 (patch-.gitignore) = ff6cd20aa0738a336d1cbc9cd74ce8a7035802cf
-SHA1 (patch-.gn) = a37a736638dd4dacb4c85fdeff6b55b4b1e8d648
+SHA1 (patch-.gn) = efc53e3041ca30548c5bacac44c0ad4a8984c2c9
 SHA1 (patch-BUILD.gn) = c3b3e955259dbf18c1f3a41a8bab367c9aabb612
 SHA1 (patch-apps_ui_views_app__window__frame__view.cc) = fb75ba24ef0da06180784605ebb865c89adfe0a6
 SHA1 (patch-ash_display_mirror__window__controller.cc) = 2b4415353f810a7a17142c35ccfdc1c1de1b44d3
@@ -74,7 +74,7 @@ SHA1 (patch-base_features.cc) = dd34f6fdfb65d83b0eee640366253cfeeacff0ae
 SHA1 (patch-base_files_dir__reader__linux.h) = 65bdc31d77131ce4f40e772c1eab6772c5de28a5
 SHA1 (patch-base_files_dir__reader__posix.h) = 134ff825ab4f8ea73b6d9fe15e4d349c68790e26
 SHA1 (patch-base_files_file__path__watcher.h) = fe3d74e7f3e4138c1b57d34071730ca2f0c1019e
-SHA1 (patch-base_files_file__path__watcher__bsd.cc) = 1cf5f31455285aecbf5f442c2815facc010d49aa
+SHA1 (patch-base_files_file__path__watcher__bsd.cc) = c2ed34c27a9f601da13fdecb547a57325186fbec
 SHA1 (patch-base_files_file__path__watcher__kqueue.cc) = 787fa43dcb0b595ee86afb9637508edeebe303cc
 SHA1 (patch-base_files_file__path__watcher__kqueue.h) = b27685c96b300cc74a4506c9b1debe83899a7b0a
 SHA1 (patch-base_files_file__path__watcher__unittest.cc) = ff195702853254dcff75fe9bb316e04715fc65a5
@@ -93,6 +93,12 @@ SHA1 (patch-base_memory_madv__free__discardable__memory__posix.cc) = 4b61c9a768e
 SHA1 (patch-base_memory_platform__shared__memory__region.h) = c0594314de50cec0f9a0d39a908a436047d62d33
 SHA1 (patch-base_memory_platform__shared__memory__region__posix.cc) = 3dce7230618a9828b2bebd15a76accffe232e9a4
 SHA1 (patch-base_message__loop_message__pump__glib.cc) = 699125bead2718f08cbcd21fb16d52afa2f12b2b
+SHA1 (patch-base_metrics_field__trial.cc) = 0cb65c5c8cb2ca6c8661f952f32d77bd976a591e
+SHA1 (patch-base_metrics_persistent__histogram__allocator.cc) = 01e4b72ea5a3b2bc3eea4aa03c64161539bf495f
+SHA1 (patch-base_metrics_persistent__histogram__allocator.h) = 37c2e2ef1256808fc7acd4017c8e5a23d146bf99
+SHA1 (patch-base_metrics_persistent__memory__allocator.cc) = 2e0a40ff53cab5a9a2a527a9d1260b995eccf27e
+SHA1 (patch-base_metrics_persistent__memory__allocator.h) = b6f91c1b820797fd012cc8c06b4fe1e8872d0181
+SHA1 (patch-base_metrics_persistent__memory__allocator__unittest.cc) = a405910e40e530da08d57091ff566947e3ad6602
 SHA1 (patch-base_native__library__posix.cc) = bf64b03872a2965cfb5e4858370dfe4045bcc58a
 SHA1 (patch-base_native__library__unittest.cc) = 6b88a18a0088d8e2550a2758ce6a6f66d94eb8d3
 SHA1 (patch-base_posix_can__lower__nice__to.cc) = 2247d688ecdba2b0db310e4fdc568d5a7f6a385c
@@ -109,17 +115,17 @@ SHA1 (patch-base_process_memory__linux.cc) = 02d1dbc034832857500fb74031b600cae21
 SHA1 (patch-base_process_process__handle.cc) = 12993483b867e107599fc68d9e408081d3a4ff74
 SHA1 (patch-base_process_process__handle.h) = 938fa0548a4c073bcd5dde61597fcdad8217b504
 SHA1 (patch-base_process_process__handle__freebsd.cc) = 7beadd9bacf3c193f8abd506e27cea5e4ee67391
-SHA1 (patch-base_process_process__handle__netbsd.cc) = 1e8a135bc3c5490b91c47691bf39c26fa9882ed1
+SHA1 (patch-base_process_process__handle__netbsd.cc) = a4554be02815e8459641325d607ffb672864a05a
 SHA1 (patch-base_process_process__handle__openbsd.cc) = 4d41557b9691d23ad3bb0e94db7930ae0553ff13
 SHA1 (patch-base_process_process__info__mac.cc) = b3143603edc88facab41ad8bbcf7dfeacdc8d226
 SHA1 (patch-base_process_process__iterator.h) = 0efd71c056a5b0c3a839a8423d6b958aed7fb839
 SHA1 (patch-base_process_process__iterator__freebsd.cc) = f45f4cb763d490a1b7225a73a1470d303f3f2f51
-SHA1 (patch-base_process_process__iterator__netbsd.cc) = 5aef8c00c6fc6dc241c5f9df32b5f65e662be583
+SHA1 (patch-base_process_process__iterator__netbsd.cc) = f687af5e6075f6722233de310709bf1753ebaa42
 SHA1 (patch-base_process_process__iterator__openbsd.cc) = a8645dc80bbf09b183662fb1550a50045b3756e4
 SHA1 (patch-base_process_process__metrics.cc) = 9058fd84ebf87ea3e88a9cfcb521225a6681fdbe
 SHA1 (patch-base_process_process__metrics.h) = 7ef4841b11e58fe1d6f83656e1cd19fb2ae1461c
 SHA1 (patch-base_process_process__metrics__freebsd.cc) = 733cbd706a624aae5d8c3a35c2e93b8411727570
-SHA1 (patch-base_process_process__metrics__netbsd.cc) = 86051af81e03d1f2eef0813cf68cec11c977d0b3
+SHA1 (patch-base_process_process__metrics__netbsd.cc) = 1aeba2a704cd5a2186521e141e33552a0b0f3d3f
 SHA1 (patch-base_process_process__metrics__openbsd.cc) = 436895b046eac074f159593712194d336522cda6
 SHA1 (patch-base_process_process__metrics__posix.cc) = c971c29012de32d26b4f7c3c1b64eff8a82bb06b
 SHA1 (patch-base_process_process__metrics__unittest.cc) = 7b86090ec5c1459068429922a85314f6c6d9b413
@@ -140,7 +146,7 @@ SHA1 (patch-base_syslog__logging.cc) = 3de4d20477e8841af61c7d9ec12990b029c302bf
 SHA1 (patch-base_system_sys__info.cc) = cb7c69a0f0b0bc785f2dac6c37f351e586f56ca2
 SHA1 (patch-base_system_sys__info.h) = d6109de6f6f1e8c3e9fd5dc53fd7ba27da8fdc0c
 SHA1 (patch-base_system_sys__info__freebsd.cc) = d740b46b61dbc614bd56ff86657a7ba64d8b793c
-SHA1 (patch-base_system_sys__info__netbsd.cc) = 29bcad257401f82786b35cfa5fcb3d3d310e5d98
+SHA1 (patch-base_system_sys__info__netbsd.cc) = a4102ff22d65e3c1dcff7fc1465acff4daaa54bc
 SHA1 (patch-base_system_sys__info__openbsd.cc) = 6fe6f6574aebacb583a7c4a5e278f7bb9db7ff0e
 SHA1 (patch-base_system_sys__info__posix.cc) = 383316fc83eb3de0ce958e2bf2d94e561662eaa4
 SHA1 (patch-base_system_sys__info__unittest.cc) = f3a59a3698aed9477190692a707f55c25a1ec1c7
@@ -150,7 +156,7 @@ SHA1 (patch-base_test_test__file__util__linux.cc) = 6bfb6716096675b3bf331c61e1b0
 SHA1 (patch-base_test_test__file__util__posix.cc) = 77e6e562a2751bfb1a1bd5b84984114caa4cdadc
 SHA1 (patch-base_threading_hang__watcher.cc) = 087275ee8155d625d52d3a0481c79c2fcf1b6b5f
 SHA1 (patch-base_threading_platform__thread.h) = e4e5a239ffbafe64ce4c4ce49f99e4e6f86c8789
-SHA1 (patch-base_threading_platform__thread__bsd.cc) = 80c71227fd3b1f113392a5fd5dba6b1af63d51b0
+SHA1 (patch-base_threading_platform__thread__bsd.cc) = 473fefa95ac901f5c61642487d5ad0fc02949d0f
 SHA1 (patch-base_threading_platform__thread__internal__posix.cc) = 1ee8d0d913d36ea93c3bb88bb5f5880d424eed0c
 SHA1 (patch-base_threading_platform__thread__posix.cc) = b56a70aadf0fd75fe23031f12f4ce295e0c89b24
 SHA1 (patch-base_threading_platform__thread__unittest.cc) = 61db87bec1b133414746313433b03bff01b99cb0
@@ -178,16 +184,16 @@ SHA1 (patch-build_detect__host__arch.py) = 570cf5393dd9e8e8513e276aa539374327dd6
 SHA1 (patch-build_gn__run__binary.py) = 1db6935223c0d84a8d759eb4e1dd91269ce6d54b
 SHA1 (patch-build_linux_chrome.map) = 4e6717709212d7d70f72532b452f7fcfbfc950d7
 SHA1 (patch-build_linux_strip__binary.py) = 614e3216fc266c09cc6b74b2e928dd550f8a483b
-SHA1 (patch-build_linux_unbundle_icu.gn) = a17f45eb381ab7b542370d470162adc7d5c4c32d
+SHA1 (patch-build_linux_unbundle_icu.gn) = 45685d403252a34d31d7b5136cf859db98befaff
 SHA1 (patch-build_linux_unbundle_libevent.gn) = c1848b1374b6d2b4f288f1c7933642cb3c97606a
 SHA1 (patch-build_linux_unbundle_libusb.gn) = 9350cb247aab5ebd055a70b1f9242a27c42507bc
 SHA1 (patch-build_rust_rust__bindgen.gni) = cf7b05069ef162b7f934bda20a1b2ac28db4d2a2
 SHA1 (patch-build_rust_std_BUILD.gn) = f4ea1810e3942a121e8d5d9a49a3c603af0e55fc
-SHA1 (patch-build_toolchain_freebsd_BUILD.gn) = ee037f3d251e523aa893e56e049148eef58fea3a
+SHA1 (patch-build_toolchain_freebsd_BUILD.gn) = c75ec22a9c33daca889c3d4b58b79b0106fe7187
 SHA1 (patch-build_toolchain_gcc__solink__wrapper.py) = 4db751dcd6c3b9f75f4dbbd3a9de54981c858639
 SHA1 (patch-build_toolchain_gcc__toolchain.gni) = 467e24ee42f1a6b5a0227ff44719fdc9a7048561
-SHA1 (patch-build_toolchain_netbsd_BUILD.gn) = d7c5e76bbd7e5b01dc8b469f89a76e63bad173e8
-SHA1 (patch-build_toolchain_openbsd_BUILD.gn) = 8818dcf99461b31e67a2edaeb6afbf91ede4f876
+SHA1 (patch-build_toolchain_netbsd_BUILD.gn) = 0c0fb74208288246afb92b8083e808496a0a8a98
+SHA1 (patch-build_toolchain_openbsd_BUILD.gn) = 498ac86c77e29edb842de366df53b19d6c469ab3
 SHA1 (patch-build_toolchain_toolchain.gni) = a28e50de5f7d6f9aef6247210e29184cbf35c91c
 SHA1 (patch-build_toolchain_win_rc_rc.py) = 825bf2e83c66bd606b2453111199b7f025b8a762
 SHA1 (patch-buildtools_reclient__cfgs_.gitignore) = bab57cd1945137ce1b290ca8eb22887770fa55d6
@@ -198,6 +204,7 @@ SHA1 (patch-buildtools_third__party_libc++_____config__site) = 3e9a69f457ec26487
 SHA1 (patch-buildtools_third__party_libc++abi_BUILD.gn) = 57ed4223d8ef5d84f6a365a6cab4698fed79759e
 SHA1 (patch-cc_BUILD.gn) = dddd71d0bf5c38d98405e817c64215c75b3f4f55
 SHA1 (patch-cc_base_features.cc) = f7fdff41487125de647754aed751568444fb00f1
+SHA1 (patch-cc_tiles_gpu__image__decode__cache.cc) = bb61998beeb3608847d2bfe38a930b0c7b468186
 SHA1 (patch-chrome_BUILD.gn) = fce5fe7628ab23d625f922b1841ce6b40f4cdb55
 SHA1 (patch-chrome_app_chrome__command__ids.h) = 5dadfce01760d5fd4976885cc5112271567ca3e6
 SHA1 (patch-chrome_app_chrome__main.cc) = a9caaf72ef553471e7de0f26a7f97e1f133de1ce
@@ -626,6 +633,7 @@ SHA1 (patch-components_media__router_common_providers_cast_channel_cast__message
 SHA1 (patch-components_metrics_drive__metrics__provider__linux.cc) = b776c38c39b9b47faaa3eafc3b7980fdb7720c9a
 SHA1 (patch-components_metrics_metrics__log.cc) = 0578b212acd889c48631320a205fe8258c7e8a7f
 SHA1 (patch-components_metrics_motherboard.cc) = ce7bfa3e9b78504bcc5f667bbf49136bca928a29
+SHA1 (patch-components_metrics_persistent__system__profile.cc) = ba2be25ac59e531089f76c7d5f0986470ecfae8b
 SHA1 (patch-components_named__mojo__ipc__server_connection__info.h) = dbad47fc623f693a359bb066df1f74f08cfc2057
 SHA1 (patch-components_named__mojo__ipc__server_named__mojo__ipc__server__client__util.cc) = 436c700985b41ac4ec77ff9460254159fb1c1a79
 SHA1 (patch-components_named__system__lock_lock.h) = d0d482c2d5f32b5ac524448f2f1b6968264c3ce0
@@ -731,8 +739,8 @@ SHA1 (patch-components_viz_service_display__embedder_skia__output__device__buffe
 SHA1 (patch-components_viz_service_display__embedder_skia__output__surface__impl.cc) = f0c16bc9697ca1869db4735e6ed9b9644665200e
 SHA1 (patch-components_viz_service_display__embedder_software__output__device__mac.cc) = d7c603561ff4a8ffc9d82024a04cbb95ddeedd5d
 SHA1 (patch-components_viz_service_display__embedder_software__output__device__mac.h) = d950a491f420d9e4b85a56d5725d5c11a0e4453a
-SHA1 (patch-components_viz_service_display__embedder_software__output__device__proxy.cc) = e700c71ffab9c420b4786919fde2d3bb8cf3a49c
-SHA1 (patch-components_viz_service_display__embedder_software__output__device__proxy.h) = 664cc5d1616ff1669669450be3f286b1f13c74a4
+SHA1 (patch-components_viz_service_display__embedder_software__output__device__proxy.cc) = fe0d3ceba6754c35452031f2abcae0dc64b70874
+SHA1 (patch-components_viz_service_display__embedder_software__output__device__proxy.h) = 529e06e79b3170651e58580f3325cca592e87dbe
 SHA1 (patch-components_viz_service_display__embedder_software__output__device__win.cc) = bb8b725bb5f08379be6d6dd6056cd12f85358eac
 SHA1 (patch-components_viz_service_display__embedder_software__output__surface.cc) = 67e3c62527085409300dbbb52f3d4584d5d6bc4a
 SHA1 (patch-components_viz_service_display__embedder_software__output__surface.h) = a9a6448a2890ecdf5edf946d79f9ac15c324c119
@@ -772,7 +780,7 @@ SHA1 (patch-content_browser_devtools_devtools__frontend__host__impl.cc) = 06bd07
 SHA1 (patch-content_browser_devtools_devtools__frontend__host__impl.h) = d14b88e0c17913346b93fa07c7ca3890f1288da2
 SHA1 (patch-content_browser_devtools_protocol_system__info__handler.cc) = 76e109248f5d85f19b1aedba9fde3278cbe5789d
 SHA1 (patch-content_browser_file__system__access_file__path__watcher_file__path__watcher.h) = 1d09e3829d61de6cc81e160263a3559e377dca8c
-SHA1 (patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc) = 85f95f2aec491b498f56dff2287554a4bfdaa273
+SHA1 (patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc) = 84c5117d23cabf980a69df2e83677939ec4d32e8
 SHA1 (patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__kqueue.h) = be2f9bdb35e18d0afccbe0b16cadf1e8f69d4aac
 SHA1 (patch-content_browser_file__system__access_file__system__access__local__path__watcher.cc) = efcdffecb1393f81e04988aa7c33312d6fe818a0
 SHA1 (patch-content_browser_font__access_font__enumeration__data__source.cc) = 2cdae6e5fceaf9e77b0e77ec30e606016cca07fc
@@ -805,6 +813,8 @@ SHA1 (patch-content_browser_renderer__host_legacy__render__widget__host__win.cc)
 SHA1 (patch-content_browser_renderer__host_legacy__render__widget__host__win.h) = a8da8eca5559b2930bacffdf099c6f588c7f3462
 SHA1 (patch-content_browser_renderer__host_media_in__process__video__capture__device__launcher.cc) = d1b5dc4422f4140addc7cb85f3734a310e5f77b9
 SHA1 (patch-content_browser_renderer__host_media_service__video__capture__device__launcher.cc) = 46afb8b3e082b5dcd8b0d2cd3ebb57f36fe824d5
+SHA1 (patch-content_browser_renderer__host_media_video__capture__manager.cc) = 15fcff9b43ac04fd574e1d7923ecc38b7bd9a964
+SHA1 (patch-content_browser_renderer__host_media_video__capture__manager.h) = f66b1c60dad353cdec170519542ce41bd505df7a
 SHA1 (patch-content_browser_renderer__host_navigation__controller__impl__unittest.cc) = 4503248dacda854e0296ece52d2b429de2f0bc28
 SHA1 (patch-content_browser_renderer__host_navigation__request.cc) = 265ea91da9df1b0654dd7dd123928865854367f7
 SHA1 (patch-content_browser_renderer__host_navigator.cc) = 891ed2b5dbc1a2d6e3bdad4056cc2083bb59fe33
@@ -860,8 +870,8 @@ SHA1 (patch-content_common_features.cc) = 55de966ce4468aa366d330b1dc40d977e11bb5
 SHA1 (patch-content_common_features.h) = 7c3a50a8aec76e29bdf7d04f844671a6fda239a5
 SHA1 (patch-content_common_font__list__unittest.cc) = 39a1210d33e99d95d2ca65f5151b49171e438a96
 SHA1 (patch-content_common_frame.mojom) = 96072dd0aaf7ad3947cdccafd9f1ac00141baaa2
-SHA1 (patch-content_common_gpu__pre__sandbox__hook__bsd.cc) = d48bf27784efed89a4a40b6898b1b51b0ae13b3a
-SHA1 (patch-content_common_gpu__pre__sandbox__hook__bsd.h) = 7be7e64a6f9f6c86a146bc60d74474b9a3434865
+SHA1 (patch-content_common_gpu__pre__sandbox__hook__bsd.cc) = 687d0d0a90dc4bb224d9f5711309455ce58fbe1d
+SHA1 (patch-content_common_gpu__pre__sandbox__hook__bsd.h) = 474c36594cdc84d897e8c4126d5ea9b9b23bfb04
 SHA1 (patch-content_common_gpu__pre__sandbox__hook__linux.h) = 8a15c171fe3183f9be1df5e340df774c7a5e82b6
 SHA1 (patch-content_common_mojo__core__library__support.cc) = 807f9cf6feb0fb61b0c99a193f215c128469d41f
 SHA1 (patch-content_common_sandbox__init__win.cc) = 7a9ca804d70373aa817c70f784ef094253a677b6
@@ -939,103 +949,103 @@ SHA1 (patch-device_fido_fido__discovery__factory.cc) = f424fd88a0f05b8fda7dd0f1d
 SHA1 (patch-device_gamepad_BUILD.gn) = c04c16e767a770b959f5e8d5da7df64f6428c48c
 SHA1 (patch-device_gamepad_gamepad__provider.cc) = bda34e8690a652bfea2f5a67af303014f7007df2
 SHA1 (patch-device_gamepad_hid__writer__linux.cc) = 4223bd0c8f2c95969ac3c7b9a295639cadae1e6e
-SHA1 (patch-electron_BUILD.gn) = 3e5b5417104e552a5ecc833ab3e7b72b7fe51df5
-SHA1 (patch-electron_build_args_all.gn) = af145f58cd6780aae7576cf23b0fb8eca021f131
-SHA1 (patch-electron_build_args_release.gn) = 7a007404fe2344c74c211909f52a545450338ab9
-SHA1 (patch-electron_default__app_default__app.ts) = 5e19efcdd48a5fa2ebbbaa5180c3b3d048c6139b
-SHA1 (patch-electron_filenames.gni) = fd70ea325a38d0b8f97d4b130616c594c992e11e
-SHA1 (patch-electron_lib_browser_api_app.ts) = 5dc2346aaa9b3444d881a959b8c419ae2ef376fe
-SHA1 (patch-electron_lib_browser_api_dialog.ts) = 28085d44b9051a26a5a16942685563cf152ebf71
-SHA1 (patch-electron_lib_browser_api_menu-item-roles.ts) = 2c88fdb403c071cfa5ca5148ce1d649590792d86
-SHA1 (patch-electron_lib_browser_api_power-monitor.ts) = fda45223e79843fe85682577cdaf5a6c454d8858
-SHA1 (patch-electron_lib_browser_init.ts) = d04d1f6cd806c69dfc6a263824a03125939a203f
-SHA1 (patch-electron_lib_browser_rpc-server.ts) = 5a1b2e291bbabffb0b2f22333d11d5dee36939f2
-SHA1 (patch-electron_lib_renderer_api_clipboard.ts) = b613fa0d2f9d916df5efe17bca87f195c1053b35
-SHA1 (patch-electron_script_lib_config.py) = dc1f870b243fdbb90f22219c740a3ae41d13f4bd
-SHA1 (patch-electron_script_lib_utils.js) = 595e2d2486cd0008254c4c1efc76c000885f5fee
-SHA1 (patch-electron_script_spec-runner.js) = a72e883c07650e4add15630c729ce137638fb4df
-SHA1 (patch-electron_shell_app_electron__crash__reporter__client.cc) = cc4ac9cc95def983e9d17c82f06b790f7e79316c
-SHA1 (patch-electron_shell_app_electron__crash__reporter__client.h) = fc8595fba6edd2bf5673c7b47d2a3ba49e0f47e0
-SHA1 (patch-electron_shell_app_electron__main__delegate.cc) = 797c8dcd31b97920f9f83f74154491f4fe33b170
-SHA1 (patch-electron_shell_app_node__main.cc) = 876dd0e83c448a063f23616ba2d850329a4c16d1
-SHA1 (patch-electron_shell_browser_api_electron__api__app.cc) = 196f556be6cf0cd5ab51dfb58473a4f78cf284f1
-SHA1 (patch-electron_shell_browser_api_electron__api__base__window.cc) = 1ad6fb2e2ac95e0781079060dbfaec469038e4ab
-SHA1 (patch-electron_shell_browser_api_electron__api__base__window.h) = f5db5c5635c8c61a18c93e03ba681e2483de6188
-SHA1 (patch-electron_shell_browser_api_electron__api__crash__reporter.cc) = 6824d03d1ac845ba2d69caab65fa1134c77abb2b
-SHA1 (patch-electron_shell_browser_api_electron__api__desktop__capturer.cc) = 9ee7fa9d0797d46c01eef4db2269b4d87af56ad0
-SHA1 (patch-electron_shell_browser_api_electron__api__power__monitor.cc) = 37954d61818b7030cd832c37dafdd16fe70ee98d
-SHA1 (patch-electron_shell_browser_api_electron__api__power__monitor.h) = d5622afb6937e457e90b4d6522405a1971b49f5c
-SHA1 (patch-electron_shell_browser_api_electron__api__safe__storage.cc) = a9a8c81a7324386f30ed3262d5e5540e3f71d8ca
-SHA1 (patch-electron_shell_browser_api_electron__api__web__contents.cc) = ef108e659457dfb5e5681f1046ad7ee5e09714bc
-SHA1 (patch-electron_shell_browser_api_electron__api__web__contents.h) = 0934b231abbfc96034c7105e4be1e98cda6e7802
-SHA1 (patch-electron_shell_browser_api_process__metric.h) = 4a8142e7d4586ccb451e2fa1d4276bd00f05993f
-SHA1 (patch-electron_shell_browser_browser.cc) = d1adfeeeeaf513578a01837fceb0b5c4eb028dfb
-SHA1 (patch-electron_shell_browser_browser.h) = f71e11c38ff394b292832042b76fb0fca89a2202
-SHA1 (patch-electron_shell_browser_browser__linux.cc) = 4441a7860878c4215d93bfe63c06e50ed16a4bc4
-SHA1 (patch-electron_shell_browser_browser__process__impl.cc) = 1cefd32aad73fc35b869c1dd2517e49cc99d2a66
-SHA1 (patch-electron_shell_browser_browser__process__impl.h) = 04c3baa74484a4acd7b43495445626040c120869
-SHA1 (patch-electron_shell_browser_electron__browser__main__parts.cc) = 9cd9b4d1a850ebe665fbd033ff8b09e638c18cbf
-SHA1 (patch-electron_shell_browser_electron__browser__main__parts.h) = acb77d13df78ad11aaab29a32977bde1368bb1eb
-SHA1 (patch-electron_shell_browser_electron__browser__main__parts__posix.cc) = cbbfc18f5d9af31509e909bd84b852e3f913f5a6
-SHA1 (patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc) = 87ee0afb07aa743e03736583bee9bcf1eb691a25
-SHA1 (patch-electron_shell_browser_native__window.cc) = 5d7511c4b32a988534d7ad6450810f7d5c2e1dca
-SHA1 (patch-electron_shell_browser_native__window__views.cc) = e0e54ae782d5aabd1231db822cc61bffdef07629
-SHA1 (patch-electron_shell_browser_native__window__views.h) = dfe03b1330d6cd07eb5aa9dee102bd12e5394a04
-SHA1 (patch-electron_shell_browser_net_system__network__context__manager.cc) = c4c72a33773aec47d09206376b751f9bfd4f420f
-SHA1 (patch-electron_shell_browser_osr_osr__host__display__client.cc) = f90a5c58c67f178015f090ed68b7bbb19bca1d58
-SHA1 (patch-electron_shell_browser_osr_osr__host__display__client.h) = a842f10a5bfc4571e94860856bd9a251a7d73221
-SHA1 (patch-electron_shell_browser_printing_printing__utils.cc) = 34b8871a4ad9897b8ccb8ea1ac9459d88889ee16
-SHA1 (patch-electron_shell_browser_relauncher__linux.cc) = 8837e4dcc2eb52dfa9b591c65db4ecb42d87d34b
-SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents.cc) = 5771f0ff5ad7c93375412f1489440e7157b2ca9a
-SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h) = 331b214f81d4faf871b47eb1430bb1a278291ddf
-SHA1 (patch-electron_shell_browser_ui_views_electron__views__delegate.cc) = 3d10a4315211369f918b530e0a0433c6c7110ba5
-SHA1 (patch-electron_shell_browser_ui_views_electron__views__delegate.h) = 6fb98b879620656538822acf6d16d5ff139e6514
-SHA1 (patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc) = c51827a6240d35195bf874014855f796ede69504
-SHA1 (patch-electron_shell_browser_ui_views_menu__bar.cc) = 8c3528dea12316d72a7f7f9375638cb48bfbf0f3
-SHA1 (patch-electron_shell_browser_ui_views_menu__bar.h) = 1e5cddd7b3e779744c9a3dd3118ae2d135ed4213
-SHA1 (patch-electron_shell_browser_ui_views_submenu__button.cc) = acc7b89a01d7e9133e221509fc8b94de6c264089
-SHA1 (patch-electron_shell_common_api_electron__api__clipboard.cc) = 93d468eb45bfde22f9c21e8428e5cd0c0fbe3fe8
-SHA1 (patch-electron_shell_common_api_electron__api__native__image.cc) = 8169509c3f36656e48c809996c36f58b7235c479
-SHA1 (patch-electron_shell_common_api_electron__api__native__image.h) = ac37de194a1962462a00a683cd303afb7311800b
-SHA1 (patch-electron_shell_common_api_electron__bindings.cc) = 0455182a54ee062d6a13f6500128788a10d13613
-SHA1 (patch-electron_shell_common_electron__command__line.cc) = 95207adf9138e7ec6e9b6d8fd4855b68e61e3241
-SHA1 (patch-electron_shell_common_electron__command__line.h) = 176b7c5ade4bee3258de1414f5c96482d03b52c9
-SHA1 (patch-electron_shell_common_electron__paths.h) = c0dc5d07655c7ad64835eaa0993a2fb047118ee8
-SHA1 (patch-electron_shell_common_gin__converters_std__converter.h) = 0f4d9e3f6c7d292b2ff13ca7698a591f00feb489
-SHA1 (patch-electron_shell_common_node__bindings.cc) = ddc196b2957ad420f291b6c3e154d3eff467595f
-SHA1 (patch-electron_shell_common_node__bindings__linux.cc) = ce1b7b11b8d70e5c95ee9710f9c4ef399e0bef28
-SHA1 (patch-electron_shell_common_platform__util.h) = 6820c8554d6f90dba3c6b45724c8f52aba3931f0
-SHA1 (patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc) = a66b602e7bb779f08a5ee644fe6862388e7400a8
-SHA1 (patch-electron_spec_api-app-spec.ts) = cb999c0566f36744cf28fc9034559cc71a61dcb4
-SHA1 (patch-electron_spec_api-browser-window-spec.ts) = baed0edb096d4bcedddda003529b35717789221b
-SHA1 (patch-electron_spec_api-clipboard-spec.ts) = 95b554171ab0a959e4cb27eb5b2fab2051f0a696
-SHA1 (patch-electron_spec_api-content-tracing-spec.ts) = e3242bbeea595935b3b16c5f02cc8be111987b73
-SHA1 (patch-electron_spec_api-crash-reporter-spec.ts) = 8de00525f8784ef90bc1db58895d1dfdc5185146
-SHA1 (patch-electron_spec_api-desktop-capturer-spec.ts) = ffd67e2d0d30e727406bd428cef9360d08689651
-SHA1 (patch-electron_spec_api-menu-spec.ts) = f7a3e7f1ed005c38aa8572933421f2c7f0e26a1d
-SHA1 (patch-electron_spec_api-native-image-spec.ts) = 8d50fe2ef33134416435618104401b7c53ec5233
-SHA1 (patch-electron_spec_api-net-log-spec.ts) = bd668caf7df29b04d299df7db06b587c8fa00ad9
-SHA1 (patch-electron_spec_api-notification-dbus-spec.ts) = 0b395900883464f47af1d1786a81cad127d07b39
-SHA1 (patch-electron_spec_api-power-monitor-spec.ts) = 3af019e043088769d2ba82cab0e8e27077c6b7a1
-SHA1 (patch-electron_spec_api-process-spec.ts) = 11e0094693d0783bdb48fa366dc08cf13ff4bbbc
-SHA1 (patch-electron_spec_api-protocol-spec.ts) = cdb46bac3c25554ec1bb7d19c59f5ac54cf0e9a3
-SHA1 (patch-electron_spec_api-safe-storage-spec.ts) = 2eb577da48e8f75ea90e1ec4d72b665f1eb360b9
-SHA1 (patch-electron_spec_api-screen-spec.ts) = 034ae09f2beda09e73e2ee1d0761c8fde132359a
-SHA1 (patch-electron_spec_api-shell-spec.ts) = 142a171c692b4d43ddfecbc5754928372372066e
-SHA1 (patch-electron_spec_api-subframe-spec.ts) = f3cad6dea856d93d274a961d054ea6f3c5eeb706
-SHA1 (patch-electron_spec_api-tray-spec.ts) = 4eddb5cfe0d8f65e891c6d67a279fb974a7f93c6
-SHA1 (patch-electron_spec_api-utility-process-spec.ts) = 15894f0183d7e1406bb6d58c356f34e7a69cc58f
-SHA1 (patch-electron_spec_api-web-frame-main-spec.ts) = ce2cf24879d7cdb29be1a8bbf250b0ff585c2834
-SHA1 (patch-electron_spec_chromium-spec.ts) = 5c787ab2208ea3b6f40270779d6c5633c050829d
-SHA1 (patch-electron_spec_crash-spec.ts) = 999ec8810095c873fd4d02346346059deb2d6c58
-SHA1 (patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js) = 1f166da1fae535bf7aac2b3127c6fb0e3d9493e6
-SHA1 (patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js) = f6d93e812bcf575bfc6ba279059f111f5183860c
-SHA1 (patch-electron_spec_fixtures_crash-cases_safe-storage_index.js) = f7d1f851a673409bcb21da6364396ca296bf788d
-SHA1 (patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js) = c55aca178f98e8add458b6697dab60bf22cc2faf
-SHA1 (patch-electron_spec_node-spec.ts) = 4ce4db8f743d00637944c864a63a048186d61876
-SHA1 (patch-electron_spec_version-bump-spec.ts) = ca45260a24f664dc1c4c86a6078a3cc0d1272076
-SHA1 (patch-electron_spec_visibility-state-spec.ts) = 1b3de9e6ae86d4eaa0ff185ddac0677c28381d0a
-SHA1 (patch-electron_spec_webview-spec.ts) = 4b583f55f08b0eea94f64f00ba961f2b75cf581a
+SHA1 (patch-electron_BUILD.gn) = 7e02c97dd0281143f9d19ae780b6d287815813c7
+SHA1 (patch-electron_build_args_all.gn) = f40db6b98d251ca1b54414e7e13069b78cd61861
+SHA1 (patch-electron_build_args_release.gn) = 54861844bdf3c4f3cc05bac0ecba73374e9170ab
+SHA1 (patch-electron_default__app_default__app.ts) = 9fd7c1e1b4eb72b3f4eae45a6a6b2e44ce31a222
+SHA1 (patch-electron_filenames.gni) = b90649c6342408319aee7b60c941be8434afb0a5
+SHA1 (patch-electron_lib_browser_api_app.ts) = 536270f0a9f9d3a9762bc5cd1d7be5bbb5b4046d
+SHA1 (patch-electron_lib_browser_api_dialog.ts) = 60b6f2763f7a82f693f64dbc1804e3bf455a5986
+SHA1 (patch-electron_lib_browser_api_menu-item-roles.ts) = fac8ceb9117baa1e382668a2353e891d1fa7cb04
+SHA1 (patch-electron_lib_browser_api_power-monitor.ts) = 9afa645fed546971042233c3c0b30f44aa7aa2ce
+SHA1 (patch-electron_lib_browser_init.ts) = ecefa03869abb7f90c900463e94589d08b2bf76b
+SHA1 (patch-electron_lib_browser_rpc-server.ts) = 871603d2cd7bf6e082ac1511ce6f041c8077462c
+SHA1 (patch-electron_lib_renderer_api_clipboard.ts) = 56cb17366df7676c8a25a3fa771c9913f942e1cc
+SHA1 (patch-electron_script_lib_config.py) = 29eb5a21a7d8b990cce59586caa4f3703c29c634
+SHA1 (patch-electron_script_lib_utils.js) = bc2773ce9a7edab60e91a50afe905be77dbb13de
+SHA1 (patch-electron_script_spec-runner.js) = f87fe5f0a6a1d67d33b3bbc2e3b4533302ea6e7e
+SHA1 (patch-electron_shell_app_electron__crash__reporter__client.cc) = 89594e895d6728587a6e8578571c8169c12f1a43
+SHA1 (patch-electron_shell_app_electron__crash__reporter__client.h) = 2d7923ab463808a87d2970c47952c191b08c1236
+SHA1 (patch-electron_shell_app_electron__main__delegate.cc) = bfe1f8ce804741aa85ab259bfb0741a7ac2e0922
+SHA1 (patch-electron_shell_app_node__main.cc) = d1989bc60a65c62a7666616db3560c660df78211
+SHA1 (patch-electron_shell_browser_api_electron__api__app.cc) = 1ba0ff7721bc3394e155ad4ad18aa791eac79439
+SHA1 (patch-electron_shell_browser_api_electron__api__base__window.cc) = 462f35985aab506a14808e39f00921cddef3975a
+SHA1 (patch-electron_shell_browser_api_electron__api__base__window.h) = ea867423a99eecea155f6ad5f204143111648501
+SHA1 (patch-electron_shell_browser_api_electron__api__crash__reporter.cc) = 9c8c1be203042e5107ce3fd58a1eaf1b9a208723
+SHA1 (patch-electron_shell_browser_api_electron__api__desktop__capturer.cc) = eb336e40c3058398090e8b46e3c7bcdadaf2e4fc
+SHA1 (patch-electron_shell_browser_api_electron__api__power__monitor.cc) = 6e9076eaca2174acbf8765590e2b933ca0b8943a
+SHA1 (patch-electron_shell_browser_api_electron__api__power__monitor.h) = 1bb3945b2687afcca6b435c226e7e972416a09fd
+SHA1 (patch-electron_shell_browser_api_electron__api__safe__storage.cc) = 38a4067ef35cbeccb10f0e2a20f570fbc8f6c7a3
+SHA1 (patch-electron_shell_browser_api_electron__api__web__contents.cc) = aa575e01c47a7ba812f47dac86cc429a9f408af6
+SHA1 (patch-electron_shell_browser_api_electron__api__web__contents.h) = 69b4f00dfb59275bbb8febb54eca976701d64677
+SHA1 (patch-electron_shell_browser_api_process__metric.h) = 107d3bec85096fba4d026d5a19b129aaaab8020a
+SHA1 (patch-electron_shell_browser_browser.cc) = 9d2e46949c563c3c20dfea051e8d459940a2ba90
+SHA1 (patch-electron_shell_browser_browser.h) = b935f47769ef8401c615f276f0a524f7b9986874
+SHA1 (patch-electron_shell_browser_browser__linux.cc) = aeab43f1c45e30fbe8f584c7121df4b3571ad0fd
+SHA1 (patch-electron_shell_browser_browser__process__impl.cc) = 179b8b9b9791ce743b90b999a251cbdddeb50d35
+SHA1 (patch-electron_shell_browser_browser__process__impl.h) = 8559e5bd1e6db6f4f5845dda7bbc3092504403f2
+SHA1 (patch-electron_shell_browser_electron__browser__main__parts.cc) = 2f445dfeb082457badf977bb02f55173c2c69aaf
+SHA1 (patch-electron_shell_browser_electron__browser__main__parts.h) = f5bf60480a0b799d14d8fde91c9e86d1ea506d95
+SHA1 (patch-electron_shell_browser_electron__browser__main__parts__posix.cc) = f399daa181bbcadf4edaba1a6070706f6b3da0d4
+SHA1 (patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc) = 2a81a1c2eeb8a523988ca6ddd5c37a2640f6ecf7
+SHA1 (patch-electron_shell_browser_native__window.cc) = d99304cb8932d78f48fee52161a76777c520e4fc
+SHA1 (patch-electron_shell_browser_native__window__views.cc) = 3f2e39df820c338bdfd0a65d0b150538c8ed4b8d
+SHA1 (patch-electron_shell_browser_native__window__views.h) = a8d314073c3d3a2e48093e85bf0f43ff36340276
+SHA1 (patch-electron_shell_browser_net_system__network__context__manager.cc) = 19986cd0d323435bd5e382950445e190d792d8cf
+SHA1 (patch-electron_shell_browser_osr_osr__host__display__client.cc) = d624bdfd6b77360cdca304216345703e531f30d9
+SHA1 (patch-electron_shell_browser_osr_osr__host__display__client.h) = 6a44fe3f6f84c689ae5a6ab6bf1060bcae1be07a
+SHA1 (patch-electron_shell_browser_printing_printing__utils.cc) = 46530a55431cbd4947697879eda048993eff3b27
+SHA1 (patch-electron_shell_browser_relauncher__linux.cc) = b04b7cfbd29e9b702f07eb836d451a4a3bce0e79
+SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents.cc) = 1059d4bfc2ceeb9cfe81cc1d6aa03163694cb740
+SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h) = 62db51ad5e0c585813624d13231d0b974cc4c326
+SHA1 (patch-electron_shell_browser_ui_views_electron__views__delegate.cc) = b2583a42e5df486f2bddf2d521238a98d1495e0f
+SHA1 (patch-electron_shell_browser_ui_views_electron__views__delegate.h) = 64762bba6c120d168fc08969ff2e3661f79c4df5
+SHA1 (patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc) = a65db4c7b58e170e69fb094239278a4522fbbcec
+SHA1 (patch-electron_shell_browser_ui_views_menu__bar.cc) = 97949c625bba0d3b9b21b0fb71b807feaf9e3e84
+SHA1 (patch-electron_shell_browser_ui_views_menu__bar.h) = a31906d2ff56375125c6683e9c9a32e992acd0c6
+SHA1 (patch-electron_shell_browser_ui_views_submenu__button.cc) = 5c3ffb4c2e3568ce02097cab01666b2b92bafcf7
+SHA1 (patch-electron_shell_common_api_electron__api__clipboard.cc) = 70bd226e31badd897180172f8545210416a37e08
+SHA1 (patch-electron_shell_common_api_electron__api__native__image.cc) = 8744c62319fee42ce842d9e423637cfaeff18ea0
+SHA1 (patch-electron_shell_common_api_electron__api__native__image.h) = 241a6eb38bc54bd4cc9bdf70ce2e8dd8e808bc20
+SHA1 (patch-electron_shell_common_api_electron__bindings.cc) = 77a1d6b267133d402244aa5a0756f940db847edc
+SHA1 (patch-electron_shell_common_electron__command__line.cc) = e0a3ee7aa8952129ecdfefa3f2f7363bf4dd98a2
+SHA1 (patch-electron_shell_common_electron__command__line.h) = 376245e4a9190f6a24895fc464153ee0634a3d3b
+SHA1 (patch-electron_shell_common_electron__paths.h) = 68b9dff3757260a7169bf2d57ddb7aa74f43fc41
+SHA1 (patch-electron_shell_common_gin__converters_std__converter.h) = 9fa69e05dffbb739a14ab942b235308477c8c203
+SHA1 (patch-electron_shell_common_node__bindings.cc) = 4697f7af6e06fadf72c347c8bab15a89efcfe7eb
+SHA1 (patch-electron_shell_common_node__bindings__linux.cc) = aa3647f41686847ba6eb0f56e0cbbc3e7f3f95d1
+SHA1 (patch-electron_shell_common_platform__util.h) = dae51bba703174054a6162f03fac2ff17b95e0b5
+SHA1 (patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc) = 01f47033347e3d05c7aa511d2782f663130dc73e
+SHA1 (patch-electron_spec_api-app-spec.ts) = a73cb497de768e2040fd728c3347a8f3967cb27f
+SHA1 (patch-electron_spec_api-browser-window-spec.ts) = f56196c198ffdb6d1884cdb2a9a5ae115323665e
+SHA1 (patch-electron_spec_api-clipboard-spec.ts) = bb961857e4745ee61d33f876a59088d025067319
+SHA1 (patch-electron_spec_api-content-tracing-spec.ts) = 6040304632eebd3d997103c5b782d33125765507
+SHA1 (patch-electron_spec_api-crash-reporter-spec.ts) = a53efa4897029a2d34ed1be5c8d424873e526a64
+SHA1 (patch-electron_spec_api-desktop-capturer-spec.ts) = 937fdc13dc110b8d919bb10d30e018e5cb4253d7
+SHA1 (patch-electron_spec_api-menu-spec.ts) = 8121532970fa3973e7d8b548ad9d6f4d63603d0f
+SHA1 (patch-electron_spec_api-native-image-spec.ts) = eecfae375823d777a9c8bd9876920b9b138f9bbe
+SHA1 (patch-electron_spec_api-net-log-spec.ts) = d454ae8d622ad79c5ca62b5d36afb594ad1bb6ac
+SHA1 (patch-electron_spec_api-notification-dbus-spec.ts) = af1efc8e2d10a1b9894de812e5ac858eb24d1615
+SHA1 (patch-electron_spec_api-power-monitor-spec.ts) = 96c0dfe42883a0f495b812b8a09a9f5070eabd97
+SHA1 (patch-electron_spec_api-process-spec.ts) = 7ea92ad5aa85faeac87726beababebd16f2a164d
+SHA1 (patch-electron_spec_api-protocol-spec.ts) = 2bdf15708508aac760ef2e6c085f4d67ff7f0f62
+SHA1 (patch-electron_spec_api-safe-storage-spec.ts) = b7b7d233169fcd63017a12090b31a06b45dc2c93
+SHA1 (patch-electron_spec_api-screen-spec.ts) = 3e5fd5a1c19cfaf20344719b88ae6764feeaaf17
+SHA1 (patch-electron_spec_api-shell-spec.ts) = ab5a0a711b3bdab6bfbf1f70efab67f3549114a7
+SHA1 (patch-electron_spec_api-subframe-spec.ts) = 73c4b4f89d86cd601c65e3a2f47ef7cd99b988ad
+SHA1 (patch-electron_spec_api-tray-spec.ts) = c1409b647b5f9bf2bf73f57bb51abdc9ceffe079
+SHA1 (patch-electron_spec_api-utility-process-spec.ts) = d4884d78fad18a9eb45c74c817cb65004358e7ff
+SHA1 (patch-electron_spec_api-web-frame-main-spec.ts) = 5d2b8fa372238b856be20685fbea51ed6ae95c7e
+SHA1 (patch-electron_spec_chromium-spec.ts) = 22b9117f235a6d8343fb0f25cf81be5e848b17c8
+SHA1 (patch-electron_spec_crash-spec.ts) = 8918368d714297a0332f1fedd4a04c6534ab7347
+SHA1 (patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js) = bd96fdc43fdb7018b5e9a13e4ef388e963bba562
+SHA1 (patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js) = 932584b9eb71e5bb856a711c38fb42ac5874473e
+SHA1 (patch-electron_spec_fixtures_crash-cases_safe-storage_index.js) = 1b100e0990456f5b8398c3b868dbfa63a1bbe3b0
+SHA1 (patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js) = d319fce19ae2c16d98ac199bc63d572dcc47eca2
+SHA1 (patch-electron_spec_node-spec.ts) = add344eabc09af93d7827e6d47cafa8a6726da6d
+SHA1 (patch-electron_spec_version-bump-spec.ts) = 86a4972d51cb343678626d6c4ed78321750c2904
+SHA1 (patch-electron_spec_visibility-state-spec.ts) = 6f646a84768f95336a16f0e4d68561b8dea4d2d7
+SHA1 (patch-electron_spec_webview-spec.ts) = af8981bff80ed8a1e7d43fcfd84010b0e7707f23
 SHA1 (patch-extensions_browser_api_api__browser__context__keyed__service__factories.cc) = 981cb4b26d13fe705d24035460a2316093b52795
 SHA1 (patch-extensions_browser_api_management_management__api.cc) = 66e0fe787b27feb285f41c63639775ba6dae716e
 SHA1 (patch-extensions_browser_api_messaging_message__service.cc) = 22322447a629841645853af1611d400475be5a36
@@ -1118,12 +1128,12 @@ SHA1 (patch-media_audio_audio__input__device.cc) = 45e70373697d0fd1af9d7becca347
 SHA1 (patch-media_audio_audio__output__proxy__unittest.cc) = 8d6bcc0177ff4cd200f34a55cc50710236c3ae36
 SHA1 (patch-media_audio_mac_audio__manager__mac.cc) = f96d8d4ed9e854bc25924f83e90726caeaefd193
 SHA1 (patch-media_audio_pulse_pulse__util.cc) = ca7c701e5aa8c068f43e178f824e74c8c0985076
-SHA1 (patch-media_audio_sndio_audio__manager__sndio.cc) = 7134a08c94658b4d4496a8760e8989390c734f70
-SHA1 (patch-media_audio_sndio_audio__manager__sndio.h) = ab47230f65eda763260ff6914a163bb1039d506a
-SHA1 (patch-media_audio_sndio_sndio__input.cc) = 972a310887dfcaccf03c893fd9e004efa27f1737
-SHA1 (patch-media_audio_sndio_sndio__input.h) = a3ac905cfe9490496031621d4ad97fb926b2d42e
-SHA1 (patch-media_audio_sndio_sndio__output.cc) = d16282ded4f5138dd6f2bd3b7db17eb47c567bb3
-SHA1 (patch-media_audio_sndio_sndio__output.h) = 710c315b1c7749bc11f2e73ff5a375e9678a6b6b
+SHA1 (patch-media_audio_sndio_audio__manager__sndio.cc) = acafa05c310ca3de84de9d0dda58b74cf4d128e2
+SHA1 (patch-media_audio_sndio_audio__manager__sndio.h) = dfa68e2d7ef1ad738ef18494245663b05342b064
+SHA1 (patch-media_audio_sndio_sndio__input.cc) = a3487e7e7ecc22eab368d02f8eeb516871502fcf
+SHA1 (patch-media_audio_sndio_sndio__input.h) = 8f55dafdced47b955bdd2dd006f9e62749f87c0d
+SHA1 (patch-media_audio_sndio_sndio__output.cc) = 90304353e7e9f95000866bdbb7df9498df5dc505
+SHA1 (patch-media_audio_sndio_sndio__output.h) = d6e7586f245aba6f71d6cea3bc4675a1e2f8980a
 SHA1 (patch-media_base_audio__latency.cc) = 7b544006bc4c3343261f864c1a83ae56a44a24d8
 SHA1 (patch-media_base_libaom__thread__wrapper.cc) = 233d1d9cda1caad238c99a4172345e25eab77c56
 SHA1 (patch-media_base_libvpx__thread__wrapper.cc) = 5bbdfc2c97ebe3c3728b743f1b50d2b1a3b05279
@@ -1299,14 +1309,14 @@ SHA1 (patch-sandbox_mac_system__services.cc) = 7e830999a024e9487a6bfc4d0a3c72ed6
 SHA1 (patch-sandbox_policy_BUILD.gn) = 39bbbf63bdbd2ea2ce431bc416bb2249539db674
 SHA1 (patch-sandbox_policy_features.cc) = 6949af8feec57e1cb8632f422411dc3212bacea5
 SHA1 (patch-sandbox_policy_features.h) = 8ed89b22d6079de8492e38182be5b7d08871bd90
-SHA1 (patch-sandbox_policy_freebsd_sandbox__freebsd.cc) = 73a2aa2befbb014ad2a4c850659e71c071f8f0e1
-SHA1 (patch-sandbox_policy_freebsd_sandbox__freebsd.h) = 384fcfca5e7acfee78c9b38e4c4a9286c37fa26e
+SHA1 (patch-sandbox_policy_freebsd_sandbox__freebsd.cc) = 1959be7e93faf8d7347f88165e82ccd6b8076a62
+SHA1 (patch-sandbox_policy_freebsd_sandbox__freebsd.h) = 8fa179c692ef4ce32a93a66b0d565bd7bd9cdb86
 SHA1 (patch-sandbox_policy_mac_sandbox__mac.mm) = 96e9fdc382ae01c11e3047bdc733d750c8320451
 SHA1 (patch-sandbox_policy_mojom_sandbox.mojom) = 8b2ae8d7f7ab7e736b88a9b6a1d9c004a03cfa60
-SHA1 (patch-sandbox_policy_netbsd_sandbox__netbsd.cc) = 68e58093395a93f18ed25d17ad680a9b3b9c370d
-SHA1 (patch-sandbox_policy_netbsd_sandbox__netbsd.h) = 283dd196ba32e350f72f0a3699723e2c5764d687
-SHA1 (patch-sandbox_policy_openbsd_sandbox__openbsd.cc) = cbda5bb217de8a4a447fe6ffbdb3c0f5052a8de6
-SHA1 (patch-sandbox_policy_openbsd_sandbox__openbsd.h) = d3160a67874d1458190bee5dfbf58ce134d4e60f
+SHA1 (patch-sandbox_policy_netbsd_sandbox__netbsd.cc) = f1b4b6e724fcdcdbe91f3642115410182f2d1357
+SHA1 (patch-sandbox_policy_netbsd_sandbox__netbsd.h) = 6a2522faaa269f473013376d5a9adf842d6ab0cf
+SHA1 (patch-sandbox_policy_openbsd_sandbox__openbsd.cc) = 73982afc255bb280e019cb526903dce34c32494e
+SHA1 (patch-sandbox_policy_openbsd_sandbox__openbsd.h) = 1c9dcaa9ffc1c089a6c08f732b082b954ec3f6df
 SHA1 (patch-sandbox_policy_sandbox.cc) = c2dfc86bf3db15775475849be8d8d5547ea76656
 SHA1 (patch-sandbox_policy_sandbox.h) = 56f93ec2a863ab269268e0d8f56a36133191a92f
 SHA1 (patch-sandbox_policy_sandbox__type.cc) = b383680214263958b7207f6315a2d3173795f6b0
@@ -1319,15 +1329,15 @@ SHA1 (patch-services_audio_audio__sandbox__hook__linux.h) = e6e86db956f44b8c64c0
 SHA1 (patch-services_device_BUILD.gn) = 25ed2beb1b9988eb28b623f30de957dbc7aaebeb
 SHA1 (patch-services_device_geolocation_location__provider__manager.cc) = 4a1c4a03c6f524112c1e1188cd59c2e352c9fc0a
 SHA1 (patch-services_device_hid_BUILD.gn) = 71a1b5ac30601eebce7dbbcc70a8ba4c80b94a19
-SHA1 (patch-services_device_hid_hid__connection__fido.cc) = 8557631380d2c11bb7ff5d72116fe91856adbe36
-SHA1 (patch-services_device_hid_hid__connection__fido.h) = b5ef54ee61894ac8e2028995ad6036415170c649
-SHA1 (patch-services_device_hid_hid__connection__freebsd.cc) = 6f1da8ba78d02ace60404f8230914bcbf780601e
-SHA1 (patch-services_device_hid_hid__connection__freebsd.h) = 7dd67eb88da3635830f2ee31f96f9425fc8e454c
+SHA1 (patch-services_device_hid_hid__connection__fido.cc) = fdc794608640af385a179ee4c51d44b1cf27fdbb
+SHA1 (patch-services_device_hid_hid__connection__fido.h) = df44feb830050bc0febf13eb3b857d082b9b601d
+SHA1 (patch-services_device_hid_hid__connection__freebsd.cc) = 12c155e9eb971ed4cefb75ad062c674a21bd0fb9
+SHA1 (patch-services_device_hid_hid__connection__freebsd.h) = 9a899c1e8abf4433bdac7327bbd7245511fe3bb1
 SHA1 (patch-services_device_hid_hid__service.cc) = 9e12273b45eb933129544bd16df401f0ed5592b3
-SHA1 (patch-services_device_hid_hid__service__fido.cc) = 97d36c87be6d40ba1322773ef44c4a39e3a0f8ae
-SHA1 (patch-services_device_hid_hid__service__fido.h) = c619494fffd445fa04ba629bb44b2209a9c66d86
-SHA1 (patch-services_device_hid_hid__service__freebsd.cc) = 37fe79d3183dc57c4199e8bf5f20b42c1c0796f3
-SHA1 (patch-services_device_hid_hid__service__freebsd.h) = 8f419ff15ebb26fb3fb2c0e815d56c072cce66ec
+SHA1 (patch-services_device_hid_hid__service__fido.cc) = d24ffdc62f577a9e0664c6fb072b1ff4fb550fe3
+SHA1 (patch-services_device_hid_hid__service__fido.h) = c55186c5c498a961d8ea874abe05a799c895d810
+SHA1 (patch-services_device_hid_hid__service__freebsd.cc) = 49457e412a72acbb113231d960b096f447f84fdf
+SHA1 (patch-services_device_hid_hid__service__freebsd.h) = 01b50c8929e5f3fe194ac84777794e56de05b24f
 SHA1 (patch-services_device_public_cpp_generic__sensor_sensor__reading.h) = ac4d96b2538bb13cceb0c6f46124c69d6736f1b7
 SHA1 (patch-services_device_public_mojom_BUILD.gn) = 3d43e4d78eb82f9304447bb92eb338d186409511
 SHA1 (patch-services_device_serial_BUILD.gn) = 476da861408c36b899ae67909eeeac879f91fdf0
@@ -1336,8 +1346,8 @@ SHA1 (patch-services_device_serial_serial__io__handler__posix.cc) = a7b1513d9030
 SHA1 (patch-services_device_time__zone__monitor_time__zone__monitor__linux.cc) = e34e9d0b855cb4afc3cc0457f265b848ab5c85f4
 SHA1 (patch-services_device_usb_BUILD.gn) = 683e7454f47f3dd7571f0baff8a267f1c21b1ae8
 SHA1 (patch-services_device_usb_usb__service.cc) = 92b7a209e07c4877311f98a8208eda3f2cb5531a
-SHA1 (patch-services_device_usb_usb__service__fake.cc) = ae33871664e5144910e95a79513fcb67ae95ce00
-SHA1 (patch-services_device_usb_usb__service__fake.h) = 116b84b07a7fcd60b69637b66aa33907ca018094
+SHA1 (patch-services_device_usb_usb__service__fake.cc) = 31e009ee6ebac07b03f6276bc8e9ff72cd34ac58
+SHA1 (patch-services_device_usb_usb__service__fake.h) = 56378de449e58a04b13c5ef287bccff69441d800
 SHA1 (patch-services_device_usb_usb__service__impl.cc) = a7ba10a72251c5a237111cee4b307ffc7302665d
 SHA1 (patch-services_network_BUILD.gn) = a70f1f8b068d96797630b40a7bca785bc9e03eda
 SHA1 (patch-services_network_network__context.cc) = 4802950171d752d0d4f2d5a5e48024458ad8422d
@@ -1365,7 +1375,7 @@ SHA1 (patch-services_on__device__model_pre__sandbox__init.cc) = b3d8fe71488dd98b
 SHA1 (patch-services_resource__coordinator_memory__instrumentation_queued__request__dispatcher.cc) = bde2937373223282923ee297bf72656d059fdaa5
 SHA1 (patch-services_resource__coordinator_public_cpp_memory__instrumentation_BUILD.gn) = 8953bd4aff1547626b033f1729dc68082b28c756
 SHA1 (patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics.h) = 23a5d8eea30eeaaa6e6885621711088ab2762e91
-SHA1 (patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc) = e05b856e2ac1cbfb7415f215df4b31c12e161e5c
+SHA1 (patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc) = 6037163b3120e8cf40965a39e57599fe3bc29a2c
 SHA1 (patch-services_screen__ai_public_cpp_utilities.cc) = 36218f2c6429aa833f6b872a24063d1723ad856d
 SHA1 (patch-services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.cc) = f5bee8fb8637f006212a425006fa6f31cbe188f1
 SHA1 (patch-services_screen__ai_sandbox_screen__ai__sandbox__hook__linux.h) = eff576ce9617098e14bcc3358bc1295cc7fee1bc
@@ -1414,6 +1424,7 @@ SHA1 (patch-third__party_blink_public_mojom_page_page.mojom) = 264741a373dc50272
 SHA1 (patch-third__party_blink_public_mojom_webpreferences_web__preferences.mojom) = 90bb54a9019b3f915ec759a95ae1e0e2f35dab8c
 SHA1 (patch-third__party_blink_public_platform_platform.h) = faa1fa5e5c05bac10c67ca71361a9d03ebc203a7
 SHA1 (patch-third__party_blink_public_platform_web__vector.h) = 1a5eb6d3deee28dc577f88ace4594ef0c4fcbcda
+SHA1 (patch-third__party_blink_public_platform_web__worker__fetch__context.h) = 3f747a430e2edee551351f4831e318f22e4a62a0
 SHA1 (patch-third__party_blink_public_web_web__blob.h) = 217c3659748e98b1460f5e82a9b13c4c1f7f0598
 SHA1 (patch-third__party_blink_public_web_web__document__loader.h) = df0190ac5cc7ced481f32c6d092bcb18ea34681a
 SHA1 (patch-third__party_blink_public_web_web__local__frame.h) = 863edc192451ad477ec5fecf8d816150875151af
@@ -1471,6 +1482,8 @@ SHA1 (patch-third__party_blink_renderer_core_paint_paint__layer.cc) = 9a075692ca
 SHA1 (patch-third__party_blink_renderer_core_scheduler__integration__tests_virtual__time__test.cc) = 29a06ca325a981a3016ae616933c3a1293a70e04
 SHA1 (patch-third__party_blink_renderer_core_scroll_scrollbar__theme__aura.cc) = e0ec27687e5598a872b9ea4519860643256e1c56
 SHA1 (patch-third__party_blink_renderer_core_testing_internals.cc) = 0eba58956137490f755c25d67c5fdc5e46f204a9
+SHA1 (patch-third__party_blink_renderer_core_workers_worker__navigator.cc) = 6f42fbec9e275c64dcb63c5d0b04790050380d8a
+SHA1 (patch-third__party_blink_renderer_core_workers_worker__navigator.h) = f61ac67a4e686d88481fcc669d5eb9dfa26054cd
 SHA1 (patch-third__party_blink_renderer_core_workers_worker__thread.cc) = c41497f9cbdda56e204cc004757a5edba3f190f0
 SHA1 (patch-third__party_blink_renderer_core_xml_xslt__processor.h) = fbbc9cb4ee20501fd03c4825da242d65fab537e7
 SHA1 (patch-third__party_blink_renderer_core_xml_xslt__processor__libxslt.cc) = 8b212ab0aacb5953e2df519b84a85d53ce54881e
@@ -1481,11 +1494,14 @@ SHA1 (patch-third__party_blink_renderer_modules_serial_serial__port__underlying_
 SHA1 (patch-third__party_blink_renderer_modules_serial_serial__port__underlying__sink.h) = 06d49cdbeb33dd4fb6ffe28c96bdeef49b1900e2
 SHA1 (patch-third__party_blink_renderer_modules_serial_serial__port__underlying__source.cc) = 33112c564012f91832dcef8e9753f9efbf3414b9
 SHA1 (patch-third__party_blink_renderer_modules_serial_serial__port__underlying__source.h) = 08795a686c3c9f1919016756c2061f4d4815a372
+SHA1 (patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.cc) = bab78826123e389c47688ecd892cee5acd0ab61e
+SHA1 (patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.h) = 06d7f10cacffec85dd809e821ba242040cbf3353
 SHA1 (patch-third__party_blink_renderer_modules_webaudio_audio__worklet__thread__test.cc) = 74d5dca91325d3b8a1bae2c6eabf37198d09c926
 SHA1 (patch-third__party_blink_renderer_modules_webgl_webgl__rendering__context__base.cc) = 15a4175f25d0a3e170ac50eab145821cf9cecfe5
 SHA1 (patch-third__party_blink_renderer_modules_webgpu_gpu__queue.cc) = d481536b06490652a3e6f25c176460e32ecc7919
 SHA1 (patch-third__party_blink_renderer_modules_websockets_websocket__channel__impl.cc) = 793c4789f3b49e01f255fcdc461a26b24b9c7870
-SHA1 (patch-third__party_blink_renderer_platform_BUILD.gn) = 78bfd68c38a3c5c45de95f8563f9c64271b66de1
+SHA1 (patch-third__party_blink_renderer_platform_BUILD.gn) = e9a8470db0af92fca7eccddfd8df71a540479916
+SHA1 (patch-third__party_blink_renderer_platform_accept__languages__watcher.h) = 5eb44a7586abf11e8097deb3888fb385fd284d6c
 SHA1 (patch-third__party_blink_renderer_platform_bindings_script__state.cc) = 80c2e0d14f12e8a40b36d0cf717c7915d22478ab
 SHA1 (patch-third__party_blink_renderer_platform_bindings_script__state.h) = 4ae022636cc0df8172b7968ed2f43c51c96cd6e4
 SHA1 (patch-third__party_blink_renderer_platform_fonts_font__cache.cc) = cd345238b0496d894fc9c0f77b49fb999217475a
@@ -1500,6 +1516,9 @@ SHA1 (patch-third__party_blink_renderer_platform_graphics_video__frame__submitte
 SHA1 (patch-third__party_blink_renderer_platform_instrumentation_partition__alloc__memory__dump__provider.cc) = a3c1270355726918aaa31b5d869e20c9276ed05c
 SHA1 (patch-third__party_blink_renderer_platform_loader_fetch_resource__fetcher.cc) = c8dc6e216bdab454e172c706625b44b4baecb6da
 SHA1 (patch-third__party_blink_renderer_platform_loader_fetch_resource__fetcher.h) = c2d0557de1be4ddeef0fa1a91f1463b6200ebb33
+SHA1 (patch-third__party_blink_renderer_platform_loader_fetch_url__loader_DEPS) = 40985eb4dfe9484887b05e584a072ce1f1f8526d
+SHA1 (patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.cc) = 837583fdbd4ab898c3a5f24ead65fe8c28c28e77
+SHA1 (patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.h) = 9f032ab128b3ca7ab012b18390eb103bdd05fddb
 SHA1 (patch-third__party_blink_renderer_platform_media_multi__buffer__data__source.cc) = c144d0711c7b8adf31c1db48aa31b744af84521b
 SHA1 (patch-third__party_blink_renderer_platform_media_multi__buffer__data__source.h) = ac657bbbd38d467372fb688946394600280fd895
 SHA1 (patch-third__party_blink_renderer_platform_peerconnection_rtc__video__encoder__factory.cc) = dc62dc423f6bd3fe852e4026dce8f1e91fb77df3
@@ -1524,7 +1543,7 @@ SHA1 (patch-third__party_brotli_common_platform.h) = e598ddc41b9a037f651df2c530c
 SHA1 (patch-third__party_cpuinfo_cpuinfo.gni) = 9b9239ac0910b7489446c2b5273183747410807f
 SHA1 (patch-third__party_crashpad_crashpad_build_crashpad__buildconfig.gni) = d56599c034256dcfbe5f70332686948221a1bab5
 SHA1 (patch-third__party_crashpad_crashpad_client_BUILD.gn) = 653baf600611d34172b1f42256c3c887bc47e654
-SHA1 (patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc) = 8e95facb610ff0e265b9193548a17ebd3ccdfde2
+SHA1 (patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc) = 5f42758318c3987a8f73281257dc7954a2ba3ea3
 SHA1 (patch-third__party_crashpad_crashpad_minidump_minidump__misc__info__writer.cc) = 15d7b241e24cef7577209816aa68cc683109bf12
 SHA1 (patch-third__party_crashpad_crashpad_util_misc_address__types.h) = 757fd14a200b7203a16b2c3502e7d3247bf8dff7
 SHA1 (patch-third__party_crashpad_crashpad_util_misc_capture__context.h) = fb1a7488af5a8b7e4af47679bc037f0e32db39e1
@@ -1541,19 +1560,46 @@ SHA1 (patch-third__party_dawn_src_dawn_common_Platform.h) = 94dc112146274eda0708
 SHA1 (patch-third__party_dawn_src_dawn_native_vulkan_BackendVk.cpp) = dd9d4cb154c78948d1dbc7aea87f3aca2d47481e
 SHA1 (patch-third__party_dawn_src_tint_lang_core_ir_transform_robustness.cc) = f658c0fe13a0a7912224adc0dc56ee69bb36a8a7
 SHA1 (patch-third__party_dawn_src_tint_lang_core_ir_transform_robustness__test.cc) = aaa2a1dd49a78009986aa8233f78089fc119243f
+SHA1 (patch-third__party_dawn_src_tint_lang_msl_writer_ast__printer_ast__printer__test.cc) = 6e18854f9e140a91213c119ad4d0a03ad32d977d
+SHA1 (patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3.cc) = 9a6055dda0ad96b86c708b3ffd343d63912cdfcd
+SHA1 (patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3__test.cc) = 09bc39a07612b43aece744b53a68ac493d94b0da
 SHA1 (patch-third__party_dawn_src_tint_lang_spirv_writer_texture__builtin__test.cc) = ade9b018b939dc278e01a1d511f80784033c4dd9
-SHA1 (patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc) = 2177fa9b0483ce05e8d8a0a9a558079e24bd3d89
-SHA1 (patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc) = 65f540819d0cf329d59fd62427a73c0ace01f168
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl) = cf23d77e599afc2c32b75e03af3035e92ffda83a
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl) = fbe649f686be101ae9e3eb3e89560183f4398c55
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl) = 11de5ebfcab59a2f5cb5ab200554d8b3a12b1e0e
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl) = 3f05cc2a09106140fd4fbe511536ae7f66033bca
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl) = 1378d0e085e78567e8d173cfdd3c20b0e2f70347
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl) = 848118ade646e0df78c966b37593fead93a29f7f
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl) = 2fa113e08edf4c75588b448e7ea100664f14fbbe
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl) = 62cd856eb1a59636e660b78906eec6454c5f3a57
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm) = 4b530b6427f85353d4ab1267a0638540620e2d53
-SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl) = 6d0903f0a52a3da6339abcd0b5b58c4c46a9b4c1
+SHA1 (patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc) = e372695430a836d101a43ca17371a56cca5b470a
+SHA1 (patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc) = 4bc9448619db69abd343d2854b402359b7703377
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f16_to__workgroup.wgsl.expected.msl) = 9f3a08ce46515e8eb874b58e655ff8fbd09a71be
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f32_to__workgroup.wgsl.expected.msl) = ad33187144e5b0916c94737d7f2c04e57cec9a6f
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat3x3__f32_to__workgroup.wgsl.expected.msl) = cd8d6f73748e9b67ae83a0428f93d62b9c14c3f6
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f16_to__workgroup.wgsl.expected.msl) = 01110ef952b00915cb0d035d1fd5c77fc08c6133
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f32_to__workgroup.wgsl.expected.msl) = 598fd41751c926db653f68725f27611cad131cad
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f16_to__workgroup.wgsl.expected.msl) = f80cf4904f6b3f8db256b55e8f1f5f30549dd322
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f32_to__workgroup.wgsl.expected.msl) = f589f931a0d389316118d035186884b2238b8668
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f16_to__workgroup.wgsl.expected.msl) = 9a9a19f3812a0c54a1c9157f7473b9b153d7f688
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f32_to__workgroup.wgsl.expected.msl) = 900adbdf8332524b08a3e97f8d464eee4b39e08c
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f16_to__workgroup.wgsl.expected.msl) = 652c0bb83cf73d8f1d532480e6b2f3941cb50443
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f32_to__workgroup.wgsl.expected.msl) = f39c3cf44c1ffe8051c807f230015d02afa7310e
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f16_to__workgroup.wgsl.expected.msl) = 85f1cc1ccd661e2142b9a4367fb084eb124b2cfc
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f32_to__workgroup.wgsl.expected.msl) = 399609a1995ab5681787f7a4d9221fb0c2ae9fe2
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f16_to__workgroup.wgsl.expected.msl) = a6ad5a2e06b03e39f8ccd850e7307372f07711e5
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f32_to__workgroup.wgsl.expected.msl) = 3f4bc5ffdfe64468cf8d028e6ecc9a385c9b4758
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f16_to__workgroup.wgsl.expected.msl) = 7887998822e5e5a9f7286d18c7ae74961a843ecb
+SHA1 (patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f32_to__workgroup.wgsl.expected.msl) = 4c2b093d657648d1dc1e8f8214c284905d01e6cb
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl) = 1b1af2eebd510dc78456500765a45a64a2eb5318
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl) = feaee634c79dc171c9ea6a427d7d27c6e61462e8
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl) = 36826c29f30ac2a5aa066988c2ac2623eb4d4d78
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl) = b841bbfb3a0474d435bb7d8783a6f1cf94754b9d
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl) = 1423e898655329437a09f108905578acffc0d856
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl) = a93f150905998f9c1b8b3c1f5e5e8d83f276f68f
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl) = 4221819e2599ebccc90a01e9d61419baafe6b70d
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl) = 57f3c39f7b75f05a065f66d350d86116f99498de
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm) = 7544c237e14b2db336535b58d37aef22561687ce
+SHA1 (patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl) = ad5af842753c436191300280fdb3c122df281760
+SHA1 (patch-third__party_dawn_test_tint_bug_tint_366037039.wgsl.expected.msl) = ccb157c625e53273a1b50b5245ccb915c94852eb
+SHA1 (patch-third__party_dawn_test_tint_bug_tint_366314931.wgsl.expected.msl) = cbf63d3db009a94e586d07b228c6fa03541f42a7
+SHA1 (patch-third__party_dawn_test_tint_bug_tint_942.wgsl.expected.msl) = 5834e6e1883e9102772acfebf0e8a12e48b893cb
+SHA1 (patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_matrix.wgsl.expected.msl) = 42c8cc4a14cba2a845ccba4525686333b65876fa
+SHA1 (patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_structures.wgsl.expected.msl) = ba4b88ff861866c7fb88d0402c65182139d27566
+SHA1 (patch-third__party_dawn_test_tint_var_initialization_workgroup_matrix.wgsl.expected.msl) = 7ffcfc9128a05d08607c92f56357a9c48cd15d6f
+SHA1 (patch-third__party_dawn_test_tint_var_initialization_workgroup_vector.wgsl.expected.msl) = 55be5fac46db59a28a894ac63d870916c5242a2a
 SHA1 (patch-third__party_dawn_webgpu-cts_compat-expectations.txt) = 80a20bc6f8b3c54c145cb6fa58160267da6bbd78
 SHA1 (patch-third__party_dawn_webgpu-cts_expectations.txt) = 912bcd679c7837f4d6e017cf16fddef274535fc1
 SHA1 (patch-third__party_devtools-frontend_src_front__end_entrypoints_main_MainImpl.ts) = b1ef2668fb578770b926333f01bca31f94bc6440
@@ -1789,12 +1835,13 @@ SHA1 (patch-third__party_perfetto_src_tracing_ipc_memfd.cc) = 6d34618a285e47b176
 SHA1 (patch-third__party_perfetto_src_tracing_track.cc) = 6650b7ef23e263b3b60089040ec3d137a8b3b84f
 SHA1 (patch-third__party_protobuf_src_google_protobuf_stubs_platform__macros.h) = 2bf1f054a551b5a8993d143dac9cd7b23111873a
 SHA1 (patch-third__party_skia_src_gpu_ganesh_GrAutoLocaleSetter.h) = 182bb2595e662b485897a9bebb4e638b2b92f85d
+SHA1 (patch-third__party_skia_src_gpu_ganesh_ops_AAHairLinePathRenderer.cpp) = 7822f76c0301918f3623cc1d425b66ece5f0c4cc
 SHA1 (patch-third__party_skia_src_ports_SkMemory__malloc.cpp) = e910086c0f5183e7f0b744e55160929aa4d541a7
 SHA1 (patch-third__party_skia_src_ports_SkOSFile__posix.cpp) = 63b0a29686e72779f3e29261126839a15ad7dc7c
 SHA1 (patch-third__party_skia_src_sksl_codegen_SkSLRasterPipelineBuilder.cpp) = 050757efeaaceda81015b56ccd61f90acabf3f4e
 SHA1 (patch-third__party_skia_src_sksl_codegen_SkSLRasterPipelineBuilder.h) = 5f1faf7e8d84a0f1991161ffc11c035629183df4
 SHA1 (patch-third__party_skia_tests_RasterPipelineCodeGeneratorTest.cpp) = f4ec1389ae307f98bb32ca74c55ae5c67d4210f5
-SHA1 (patch-third__party_speech-dispatcher_libspeechd__version.h) = 9ee90337d2c6b23e779975882665feef4af58b09
+SHA1 (patch-third__party_speech-dispatcher_libspeechd__version.h) = be762c5a8e66f421e60fd67bafa8a903937b4896
 SHA1 (patch-third__party_speech-dispatcher_speechd__types.h) = 8dcb09bff2fd495c522c475346b99bcc6e73442a
 SHA1 (patch-third__party_sqlite_BUILD.gn) = 113ae241a3db0642212390c074a138b2051e627b
 SHA1 (patch-third__party_sqlite_src_amalgamation__dev_sqlite3.c) = 264fe0c876fdb387a2416ec24c6b42843fe0417d
@@ -2071,8 +2118,8 @@ SHA1 (patch-ui_shell__dialogs_select__file__dialog.h) = e93aa0883d696b005928ff8f
 SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux.cc) = 6453ec94e1902c587257211fe83724720ce53d87
 SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux.h) = ceed5d2451b0602a8f27aea15f63a9808a84ab0d
 SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux__kde.cc) = d21b6ed1cf7d23810a79c626ae9bdbd305423017
-SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc) = 6c7c05f8e234527d2112027916e59fc7831d77d9
-SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux__portal.h) = cd97209f41656e94e8532344f291a9be929fbef7
+SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc) = 84c90933cf7c441e217a16a9284f846894dfc251
+SHA1 (patch-ui_shell__dialogs_select__file__dialog__linux__portal.h) = d1df4d3464e6a044226d5c96068bfaf986b15fea
 SHA1 (patch-ui_strings_translations_app__locale__settings__bn.xtb) = 2ad59e40710695addb5fb73d2cc2469b0f35b4a2
 SHA1 (patch-ui_strings_translations_app__locale__settings__ja.xtb) = e62d0723eab456aef241bc7cd3d5e1b0c8916134
 SHA1 (patch-ui_strings_translations_app__locale__settings__ko.xtb) = 9d56bb46ead5ae3a810ba8c1bd7617c3cb4a6526
@@ -2144,16 +2191,21 @@ SHA1 (patch-v8_src_base_small-vector.h) = 096169fa21aa8db7a4a5f22a80e3c8cdd191ea
 SHA1 (patch-v8_src_base_strings.h) = a56c73a4ec7d26ae28a2d375306f97af0f00ae3b
 SHA1 (patch-v8_src_base_sys-info.cc) = 73fc7e787533b5ff79737c1aa5e6a4ab5442b284
 SHA1 (patch-v8_src_base_utils_random-number-generator.cc) = 1acb5c582e7780aa99a86dbdac793de9a3028b23
+SHA1 (patch-v8_src_builtins_builtins-object-gen.cc) = b0d35faa0829a7d18c7cae5cb2abac3e28d4f9bd
 SHA1 (patch-v8_src_compiler_access-info.cc) = 80e64eccb799575d88c9f9ccf18bb83443012803
 SHA1 (patch-v8_src_compiler_heap-refs.cc) = 802694c5d1bdfdd59b176989b3eb3c23f9c8d0cb
 SHA1 (patch-v8_src_compiler_js-call-reducer.cc) = ac121a30d33e323d18a3570e7e31c8c1635d5f97
 SHA1 (patch-v8_src_compiler_js-native-context-specialization.cc) = 8a39c0043e77a369a7fbd7f33222525f80be3e09
+SHA1 (patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.cc) = 2148d923b333de3d6dc21ee10dd7c36e9ffd031d
+SHA1 (patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.h) = d0b981b38426472f75fdb1909a0f765331a49afb
 SHA1 (patch-v8_src_diagnostics_perf-jit.cc) = b0c397aa1b9394117f6f712ce8d5f765779a01f9
 SHA1 (patch-v8_src_diagnostics_perf-jit.h) = ac0140a909dbaec64a6fd850e3ffdca3a054047b
 SHA1 (patch-v8_src_execution_isolate.cc) = 556a85ddf10d7668c1a56cb4139c62bcedb5bb20
 SHA1 (patch-v8_src_execution_microtask-queue.h) = 57da8cbbd7db8b469ad07d863a01db3e8d401f34
 SHA1 (patch-v8_src_flags_flags.cc) = e7020fc69dfd25a9868841a550955b9e5dd59e0c
+SHA1 (patch-v8_src_interpreter_bytecode-generator.cc) = 270504da0c5b303e677b1f7da89453bac23fb4cd
 SHA1 (patch-v8_src_maglev_maglev-graph-builder.cc) = 80b92e04b590702a67b32a3492b8ba0b660231f1
+SHA1 (patch-v8_src_maglev_maglev-phi-representation-selector.cc) = 95f9d5cdc03a38f0e9994186b702bf30e167f913
 SHA1 (patch-v8_src_runtime_runtime-wasm.cc) = 1051bd4741006ed340209a2d6cf66ae5b6de65f0
 SHA1 (patch-v8_src_sandbox_sandbox.cc) = 42c46e1fcbb712f8a628bb3c345295d4e928afd4
 SHA1 (patch-v8_src_snapshot_embedded_platform-embedded-file-writer-base.cc) = 7574451c194f2d512b2e2e2ee14b407cd16f1661
@@ -2162,9 +2214,14 @@ SHA1 (patch-v8_src_snapshot_embedded_platform-embedded-file-writer-generic.cc) =
 SHA1 (patch-v8_src_trap-handler_handler-inside-posix.cc) = cae956ce9c30b987d424ced366f65dd3d3b1bab8
 SHA1 (patch-v8_src_trap-handler_handler-inside-posix.h) = c92e27c6f3e9d02e56c6a780daaee1d6c654bcee
 SHA1 (patch-v8_src_trap-handler_trap-handler.h) = 4ac80edc8276f5f43023b2799eacfa1759d2b9f4
+SHA1 (patch-v8_src_wasm_baseline_arm_liftoff-assembler-arm-inl.h) = acea9b59261de4d7ccf900ba3431e9c1534d2c9a
 SHA1 (patch-v8_src_wasm_baseline_ia32_liftoff-assembler-ia32-inl.h) = a1efc0606166e60f30ce32a791c74cb0f544e35a
+SHA1 (patch-v8_src_wasm_baseline_x64_liftoff-assembler-x64-inl.h) = 4d3652b517037b3c550f6bf748f467b7817bab80
 SHA1 (patch-v8_src_wasm_wasm-js.cc) = d790e09fb671896e7b1f599b1e6e208e391dbbc6
-SHA1 (patch-v8_test_mjsunit_regress_wasm_regress-366635354.js) = b0c9f33383a645d649ce63febaa1cf912ade02b2
-SHA1 (patch-v8_test_mjsunit_wasm_regress-367818758.js) = b40dd1c21a4fcea2de358685ec206026690c4ebd
-SHA1 (patch-v8_tools_run-paxctl.py) = cf115b755b7e0aac8df28ae8ada41699fa0a3e4a
+SHA1 (patch-v8_test_mjsunit_maglev_regress-382190919.js) = 2f13434aac069f8b0176c3dd49c668d317a28b53
+SHA1 (patch-v8_test_mjsunit_regress_regress-374627491.js) = d8be83904025e5f73b88249f768f99d2edde7366
+SHA1 (patch-v8_test_mjsunit_regress_wasm_regress-366635354.js) = 90dcdf97caef8562cda7d25d914d2c2f4708a5e2
+SHA1 (patch-v8_test_mjsunit_regress_wasm_regress-378779897.js) = 91bba35eedb1382e82c66dbf4be13fb56bfece72
+SHA1 (patch-v8_test_mjsunit_wasm_regress-367818758.js) = ec293f1a1889ddb882bd6e23e8b2da122355e45d
+SHA1 (patch-v8_tools_run-paxctl.py) = bcddfdc781862fc14d81009c10eee42798d89acb
 SHA1 (patch-v8_tools_run.py) = 166f784b2f27ad66a3b4e951b13cb3f9dee6da85
diff --git a/electron32/options.mk b/electron32/options.mk
index 1b3345d3a9..9375a18f7a 100644
--- a/electron32/options.mk
+++ b/electron32/options.mk
@@ -2,13 +2,11 @@
 
 PKG_OPTIONS_VAR=		PKG_OPTIONS.electron
 PKG_OPTIONS_REQUIRED_GROUPS=	audio
-PKG_OPTIONS_GROUP.audio=	alsa pulseaudio sndio sunaudio
+PKG_OPTIONS_GROUP.audio=	alsa pulseaudio sunaudio
 PKG_SUPPORTED_OPTIONS+=		debug
 
 .if ${OPSYS} == "NetBSD"
 PKG_SUGGESTED_OPTIONS+=		sunaudio
-.elif ${OPSYS} == "OpenBSD"
-PKG_SUGGESTED_OPTIONS+=		sndio
 .else
 PKG_SUGGESTED_OPTIONS+=		pulseaudio
 .endif
@@ -37,12 +35,6 @@ GN_ARGS+=	use_pulseaudio=true
 GN_ARGS+=	use_pulseaudio=false
 .endif
 
-.if !empty(PKG_OPTIONS:Msndio)
-GN_ARGS+=	use_sndio=true
-.else
-GN_ARGS+=	use_sndio=false
-.endif
-
 .if !empty(PKG_OPTIONS:Mdebug)
 BUILDTYPE=		Debug
 GN_FILE=		testing.gn
diff --git a/electron32/patches/patch-.gn b/electron32/patches/patch-.gn
index 74a8bedced..c73f28018f 100644
--- a/electron32/patches/patch-.gn
+++ b/electron32/patches/patch-.gn
@@ -6,11 +6,13 @@ $NetBSD$
 
 --- .gn.orig	2024-10-18 12:33:59.054677000 +0000
 +++ .gn
-@@ -172,4 +172,8 @@ exec_script_whitelist =
+@@ -172,4 +172,10 @@ exec_script_whitelist =
  
        "//tools/grit/grit_rule.gni",
        "//tools/gritsettings/BUILD.gn",
 +
++      "//third_party/icu/BUILD.gn",
++
 +      "//electron/BUILD.gn",
 +      "//third_party/electron_node/deps/base64/BUILD.gn",
 +      "//third_party/electron_node/deps/base64/unofficial.gni",
diff --git a/electron32/patches/patch-base_files_file__path__watcher__bsd.cc b/electron32/patches/patch-base_files_file__path__watcher__bsd.cc
index cd695ea67d..5ce3195f64 100644
--- a/electron32/patches/patch-base_files_file__path__watcher__bsd.cc
+++ b/electron32/patches/patch-base_files_file__path__watcher__bsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- base/files/file_path_watcher_bsd.cc.orig	2025-01-19 14:12:03.856169259 +0000
+--- base/files/file_path_watcher_bsd.cc.orig	2025-02-15 09:43:46.215519587 +0000
 +++ base/files/file_path_watcher_bsd.cc
 @@ -0,0 +1,54 @@
 +// Copyright 2021 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-base_metrics_field__trial.cc b/electron32/patches/patch-base_metrics_field__trial.cc
new file mode 100644
index 0000000000..13c8f12cfd
--- /dev/null
+++ b/electron32/patches/patch-base_metrics_field__trial.cc
@@ -0,0 +1,78 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- base/metrics/field_trial.cc.orig	2024-10-18 12:33:59.782265400 +0000
++++ base/metrics/field_trial.cc
+@@ -124,7 +124,7 @@ void PickleFieldTrial(const FieldTrial::
+ }
+ 
+ // Returns the boundary value for comparing against the FieldTrial's added
+-// groups for a given |divisor| (total probability) and |entropy_value|.
++// groups for a given `divisor` (total probability) and `entropy_value`.
+ FieldTrial::Probability GetGroupBoundaryValue(
+     FieldTrial::Probability divisor,
+     double entropy_value) {
+@@ -138,7 +138,7 @@ FieldTrial::Probability GetGroupBoundary
+   const double kEpsilon = 1e-8;
+   const FieldTrial::Probability result =
+       static_cast<FieldTrial::Probability>(divisor * entropy_value + kEpsilon);
+-  // Ensure that adding the epsilon still results in a value < |divisor|.
++  // Ensure that adding the epsilon still results in a value < `divisor`.
+   return std::min(result, divisor - 1);
+ }
+ 
+@@ -259,7 +259,7 @@ void FieldTrial::AppendGroup(const std::
+   if (forced_) {
+     DCHECK(!group_name_.empty());
+     if (name == group_name_) {
+-      // Note that while |group_| may be equal to |kDefaultGroupNumber| on the
++      // Note that while `group_` may be equal to `kDefaultGroupNumber` on the
+       // forced trial, it will not have the same value as the default group
+       // number returned from the non-forced |FactoryGetFieldTrial()| call,
+       // which takes care to ensure that this does not happen.
+@@ -326,7 +326,7 @@ bool FieldTrial::IsOverridden() const {
+ void FieldTrial::EnableBenchmarking() {
+   // We don't need to see field trials created via CreateFieldTrial() for
+   // benchmarking, because such field trials have only a single group and are
+-  // not affected by randomization that |enable_benchmarking_| would disable.
++  // not affected by randomization that `enable_benchmarking_` would disable.
+   DCHECK_EQ(0u, FieldTrialList::GetRandomizedFieldTrialCount());
+   enable_benchmarking_ = true;
+ }
+@@ -453,7 +453,7 @@ void FieldTrial::FinalizeGroupChoice() {
+   if (group_ != kNotFinalized)
+     return;
+   accumulated_group_probability_ = divisor_;
+-  // Here it's OK to use |kDefaultGroupNumber| since we can't be forced and not
++  // Here it's OK to use `kDefaultGroupNumber` since we can't be forced and not
+   // finalized.
+   DCHECK(!forced_);
+   SetGroupChoice(default_group_name_, kDefaultGroupNumber);
+@@ -807,7 +807,7 @@ FieldTrial* FieldTrialList::CreateFieldT
+   field_trial = new FieldTrial(name, kTotalProbability, group_name, 0,
+                                is_low_anonymity, is_overridden);
+   // The group choice will be finalized in this method. So
+-  // |is_randomized_trial| should be false.
++  // `is_randomized_trial` should be false.
+   FieldTrialList::Register(field_trial, /*is_randomized_trial=*/false);
+   // Force the trial, which will also finalize the group choice.
+   field_trial->SetForced();
+@@ -910,12 +910,12 @@ bool FieldTrialList::GetParamsFromShared
+   if (!field_trial->ref_)
+     return false;
+ 
++  size_t allocated_size = 0;
+   const FieldTrial::FieldTrialEntry* entry =
+       global_->field_trial_allocator_->GetAsObject<FieldTrial::FieldTrialEntry>(
+-          field_trial->ref_);
++          field_trial->ref_, &allocated_size);
++  CHECK(entry);
+ 
+-  size_t allocated_size =
+-      global_->field_trial_allocator_->GetAllocSize(field_trial->ref_);
+   uint64_t actual_size =
+       sizeof(FieldTrial::FieldTrialEntry) + entry->pickle_size;
+   if (allocated_size < actual_size)
diff --git a/electron32/patches/patch-base_metrics_persistent__histogram__allocator.cc b/electron32/patches/patch-base_metrics_persistent__histogram__allocator.cc
new file mode 100644
index 0000000000..8fd69349db
--- /dev/null
+++ b/electron32/patches/patch-base_metrics_persistent__histogram__allocator.cc
@@ -0,0 +1,169 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- base/metrics/persistent_histogram_allocator.cc.orig	2024-10-18 12:33:59.786263200 +0000
++++ base/metrics/persistent_histogram_allocator.cc
+@@ -89,13 +89,13 @@ std::unique_ptr<BucketRanges> CreateRang
+ }
+ 
+ // Calculate the number of bytes required to store all of a histogram's
+-// "counts". This will return zero (0) if |bucket_count| is not valid.
++// "counts". This will return zero (0) if `bucket_count` is not valid.
+ size_t CalculateRequiredCountsBytes(size_t bucket_count) {
+   // 2 because each "sample count" also requires a backup "logged count"
+   // used for calculating the delta during snapshot operations.
+   const size_t kBytesPerBucket = 2 * sizeof(HistogramBase::AtomicCount);
+ 
+-  // If the |bucket_count| is such that it would overflow the return type,
++  // If the `bucket_count` is such that it would overflow the return type,
+   // perhaps as the result of a malicious actor, then return zero to
+   // indicate the problem to the caller.
+   if (bucket_count > std::numeric_limits<size_t>::max() / kBytesPerBucket)
+@@ -190,7 +190,7 @@ std::vector<PersistentMemoryAllocator::R
+ PersistentSparseHistogramDataManager::LoadRecords(
+     PersistentSampleMapRecords* sample_map_records,
+     std::optional<HistogramBase::Sample> until_value) {
+-  // DataManager must be locked in order to access the |sample_records_|
++  // DataManager must be locked in order to access the `sample_records_`
+   // vectors.
+   base::AutoLock auto_lock(lock_);
+ 
+@@ -236,7 +236,7 @@ PersistentSparseHistogramDataManager::Lo
+   }
+ 
+   // Return all references found that have not yet been seen by
+-  // |sample_map_records|, up until |until_value| (if applicable).
++  // `sample_map_records`, up until `until_value` (if applicable).
+   std::vector<PersistentMemoryAllocator::Reference> new_references;
+   CHECK_GE(found_records.size(), sample_map_records->seen_);
+   auto new_found_records = base::make_span(found_records)
+@@ -244,9 +244,9 @@ PersistentSparseHistogramDataManager::Lo
+   new_references.reserve(new_found_records.size());
+   for (const auto& new_record : new_found_records) {
+     new_references.push_back(new_record.reference);
+-    // Maybe references after |until_value| were found. Stop here immediately in
++    // Maybe references after `until_value` were found. Stop here immediately in
+     // such a case, since the caller will not expect any more samples after
+-    // |until_value|.
++    // `until_value`.
+     if (until_value.has_value() && new_record.value == until_value.value()) {
+       break;
+     }
+@@ -335,9 +335,9 @@ std::unique_ptr<HistogramBase> Persisten
+   // count data (while these must reference the persistent counts) and always
+   // add it to the local list of known histograms (while these may be simple
+   // references to histograms in other processes).
++  size_t length = 0;
+   PersistentHistogramData* data =
+-      memory_allocator_->GetAsObject<PersistentHistogramData>(ref);
+-  const size_t length = memory_allocator_->GetAllocSize(ref);
++      memory_allocator_->GetAsObject<PersistentHistogramData>(ref, &length);
+ 
+   // Check that metadata is reasonable: name is null-terminated and non-empty,
+   // ID fields have been loaded with a hash of the name (0 is considered
+@@ -345,7 +345,7 @@ std::unique_ptr<HistogramBase> Persisten
+   if (!data || data->name[0] == '\0' ||
+       reinterpret_cast<char*>(data)[length - 1] != '\0' ||
+       data->samples_metadata.id == 0 || data->logged_metadata.id == 0 ||
+-      // Note: Sparse histograms use |id + 1| in |logged_metadata|.
++      // Note: Sparse histograms use `id + 1` in `logged_metadata`.
+       (data->logged_metadata.id != data->samples_metadata.id &&
+        data->logged_metadata.id != data->samples_metadata.id + 1) ||
+       // Most non-matching values happen due to truncated names. Ideally, we
+@@ -388,7 +388,7 @@ std::unique_ptr<HistogramBase> Persisten
+     histogram_data->histogram_type = histogram_type;
+     histogram_data->flags = flags | HistogramBase::kIsPersistent;
+ 
+-    // |counts_ref| relies on being zero'd out initially. Even though this
++    // `counts_ref` relies on being zero'd out initially. Even though this
+     // should always be the case, manually zero it out again here in case there
+     // was memory corruption (e.g. if the memory was mapped from a corrupted
+     // spare file).
+@@ -402,7 +402,7 @@ std::unique_ptr<HistogramBase> Persisten
+     size_t bucket_count = bucket_ranges->bucket_count();
+     size_t counts_bytes = CalculateRequiredCountsBytes(bucket_count);
+     if (counts_bytes == 0) {
+-      // |bucket_count| was out-of-range.
++      // `bucket_count` was out-of-range.
+       return nullptr;
+     }
+ 
+@@ -410,8 +410,8 @@ std::unique_ptr<HistogramBase> Persisten
+     // objects for re-use, it would be dangerous for one to hold a reference
+     // from a persistent allocator that is not the global one (which is
+     // permanent once set). If this stops being the case, this check can
+-    // become an "if" condition beside "!ranges_ref" below and before
+-    // set_persistent_reference() farther down.
++    // become an `if` condition beside `!ranges_ref` below and before
++    // `set_persistent_reference()` farther down.
+     DCHECK_EQ(this, GlobalHistogramAllocator::Get());
+ 
+     // Re-use an existing BucketRanges persistent allocation if one is known;
+@@ -448,7 +448,7 @@ std::unique_ptr<HistogramBase> Persisten
+     if (ranges_ref && histogram_data) {
+       histogram_data->minimum = minimum;
+       histogram_data->maximum = maximum;
+-      // |bucket_count| must fit within 32-bits or the allocation of the counts
++      // `bucket_count` must fit within 32-bits or the allocation of the counts
+       // array would have failed for being too large; the allocator supports
+       // less than 4GB total size.
+       histogram_data->bucket_count = static_cast<uint32_t>(bucket_count);
+@@ -461,7 +461,7 @@ std::unique_ptr<HistogramBase> Persisten
+ 
+   if (histogram_data) {
+     // Create the histogram using resources in persistent memory. This ends up
+-    // resolving the "ref" values stored in histogram_data instad of just
++    // resolving the `ref` values stored in histogram_data instead of just
+     // using what is already known above but avoids duplicating the switch
+     // statement here and serves as a double-check that everything is
+     // correct before commiting the new histogram to persistent space.
+@@ -600,17 +600,16 @@ std::unique_ptr<HistogramBase> Persisten
+   uint32_t histogram_ranges_ref = histogram_data_ptr->ranges_ref;
+   uint32_t histogram_ranges_checksum = histogram_data_ptr->ranges_checksum;
+ 
++  size_t allocated_bytes = 0;
+   HistogramBase::Sample* ranges_data =
+       memory_allocator_->GetAsArray<HistogramBase::Sample>(
+           histogram_ranges_ref, kTypeIdRangesArray,
+-          PersistentMemoryAllocator::kSizeAny);
++          PersistentMemoryAllocator::kSizeAny, &allocated_bytes);
+ 
+   const uint32_t max_buckets =
+       std::numeric_limits<uint32_t>::max() / sizeof(HistogramBase::Sample);
+   size_t required_bytes =
+       (histogram_bucket_count + 1) * sizeof(HistogramBase::Sample);
+-  size_t allocated_bytes =
+-      memory_allocator_->GetAllocSize(histogram_ranges_ref);
+   if (!ranges_data || histogram_bucket_count < 2 ||
+       histogram_bucket_count >= max_buckets ||
+       allocated_bytes < required_bytes) {
+@@ -638,11 +637,14 @@ std::unique_ptr<HistogramBase> Persisten
+   }
+ 
+   size_t counts_bytes = CalculateRequiredCountsBytes(histogram_bucket_count);
++  if (counts_bytes == 0) {
++    return nullptr;
++  }
++
+   PersistentMemoryAllocator::Reference counts_ref =
+       histogram_data_ptr->counts_ref.load(std::memory_order_acquire);
+-  if (counts_bytes == 0 ||
+-      (counts_ref != 0 &&
+-       memory_allocator_->GetAllocSize(counts_ref) < counts_bytes)) {
++  if (counts_ref != 0 && !memory_allocator_->GetAsArray<uint8_t>(
++                             counts_ref, kTypeIdCountsArray, counts_bytes)) {
+     return nullptr;
+   }
+ 
+@@ -970,7 +972,7 @@ void GlobalHistogramAllocator::Set(Globa
+   // histogram allocator was initialized.
+   //
+   // TODO(crbug.com/40945497): CHECK(histogram_count == 0) and remove emit of
+-  // early histogram count once |histogram_count| is reliably zero (0) for all
++  // early histogram count once `histogram_count` is reliably zero (0) for all
+   // process types.
+   size_t histogram_count = StatisticsRecorder::GetHistogramCount();
+   if (histogram_count != 0) {
diff --git a/electron32/patches/patch-base_metrics_persistent__histogram__allocator.h b/electron32/patches/patch-base_metrics_persistent__histogram__allocator.h
new file mode 100644
index 0000000000..5c0e1f91f1
--- /dev/null
+++ b/electron32/patches/patch-base_metrics_persistent__histogram__allocator.h
@@ -0,0 +1,253 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- base/metrics/persistent_histogram_allocator.h.orig	2024-10-18 12:33:59.786263200 +0000
++++ base/metrics/persistent_histogram_allocator.h
+@@ -47,8 +47,8 @@ class BASE_EXPORT PersistentSparseHistog
+   ~PersistentSparseHistogramDataManager();
+ 
+   // Returns an object that manages persistent-sample-map records for a given
+-  // |id|. The returned object queries |this| for records. Hence, the returned
+-  // object must not outlive |this|.
++  // `id`. The returned object queries `this` for records. Hence, the returned
++  // object must not outlive `this`.
+   std::unique_ptr<PersistentSampleMapRecords> CreateSampleMapRecords(
+       uint64_t id);
+ 
+@@ -71,19 +71,19 @@ class BASE_EXPORT PersistentSparseHistog
+   std::vector<ReferenceAndSample>* GetSampleMapRecordsWhileLocked(uint64_t id)
+       EXCLUSIVE_LOCKS_REQUIRED(lock_);
+ 
+-  // Returns sample-map records belonging to the specified |sample_map_records|.
+-  // Only records found that were not yet seen by |sample_map_records| will be
+-  // returned, determined by its |seen_| field. Records found for other
++  // Returns sample-map records belonging to the specified `sample_map_records`.
++  // Only records found that were not yet seen by `sample_map_records` will be
++  // returned, determined by its `seen_` field. Records found for other
+   // sample-maps are held for later use without having to iterate again. This
+   // should be called only from a PersistentSampleMapRecords object because
+   // those objects have a contract that there are no other threads accessing the
+-  // internal records_ field of the object that is passed in. If |until_value|
++  // internal records_ field of the object that is passed in. If `until_value`
+   // is set and a sample is found with said value, the search will stop early
+   // and the last entry in the returned vector will be that sample.
+   // Note: The returned vector is not guaranteed to contain all unseen records
+-  // for |sample_map_records|. If this is needed, then repeatedly call this
++  // for `sample_map_records`. If this is needed, then repeatedly call this
+   // until an empty vector is returned, which definitely means that
+-  // |sample_map_records| has seen all its records.
++  // `sample_map_records` has seen all its records.
+   std::vector<PersistentMemoryAllocator::Reference> LoadRecords(
+       PersistentSampleMapRecords* sample_map_records,
+       std::optional<HistogramBase::Sample> until_value);
+@@ -112,7 +112,7 @@ class BASE_EXPORT PersistentSampleMapRec
+   // Constructs an instance of this class. The manager object must live longer
+   // than all instances of this class that reference it, which is not usually
+   // a problem since these objects are generally managed from within that
+-  // manager instance. The same caveats apply for for the |records| vector.
++  // manager instance. The same caveats apply for for the `records` vector.
+   PersistentSampleMapRecords(
+       PersistentSparseHistogramDataManager* data_manager,
+       uint64_t sample_map_id,
+@@ -125,18 +125,18 @@ class BASE_EXPORT PersistentSampleMapRec
+ 
+   ~PersistentSampleMapRecords();
+ 
+-  // Gets next references to persistent sample-map records. If |until_value| is
++  // Gets next references to persistent sample-map records. If `until_value` is
+   // passed, and said value is found, then it will be the last element in the
+   // returned vector. The type and layout of the data being referenced is
+   // defined entirely within the PersistentSampleMap class.
+   // Note: The returned vector is not guaranteed to contain all unseen records
+-  // for |this|. If this is needed, then repeatedly call this until an empty
+-  // vector is returned, which definitely means that |this| has seen all its
++  // for `this`. If this is needed, then repeatedly call this until an empty
++  // vector is returned, which definitely means that `this` has seen all its
+   // records.
+   std::vector<PersistentMemoryAllocator::Reference> GetNextRecords(
+       std::optional<HistogramBase::Sample> until_value);
+ 
+-  // Creates a new persistent sample-map record for sample |value| and returns
++  // Creates a new persistent sample-map record for sample `value` and returns
+   // a reference to it.
+   PersistentMemoryAllocator::Reference CreateNew(HistogramBase::Sample value);
+ 
+@@ -160,7 +160,7 @@ class BASE_EXPORT PersistentSampleMapRec
+   // ID of PersistentSampleMap to which these records apply.
+   const uint64_t sample_map_id_;
+ 
+-  // This is the count of how many "records" have already been read by |this|.
++  // This is the count of how many "records" have already been read by `this`.
+   size_t seen_ = 0;
+ 
+   // This is the set of records found during iteration through memory, owned by
+@@ -185,7 +185,7 @@ class BASE_EXPORT PersistentHistogramAll
+   // See PersistentMemoryAllocator::Iterator for more information.
+   class BASE_EXPORT Iterator {
+    public:
+-    // Constructs an iterator on a given |allocator|, starting at the beginning.
++    // Constructs an iterator on a given `allocator`, starting at the beginning.
+     // The allocator must live beyond the lifetime of the iterator.
+     explicit Iterator(PersistentHistogramAllocator* allocator);
+ 
+@@ -198,7 +198,7 @@ class BASE_EXPORT PersistentHistogramAll
+     std::unique_ptr<HistogramBase> GetNext() { return GetNextWithIgnore(0); }
+ 
+     // Gets the next histogram from persistent memory, ignoring one particular
+-    // reference in the process. Pass |ignore| of zero (0) to ignore nothing.
++    // reference in the process. Pass `ignore` of zero (0) to ignore nothing.
+     std::unique_ptr<HistogramBase> GetNextWithIgnore(Reference ignore);
+ 
+    private:
+@@ -239,7 +239,7 @@ class BASE_EXPORT PersistentHistogramAll
+ 
+   // Recreate a Histogram from data held in persistent memory. Though this
+   // object will be local to the current process, the sample data will be
+-  // shared with all other threads referencing it. This method takes a |ref|
++  // shared with all other threads referencing it. This method takes a `ref`
+   // to where the top-level histogram data may be found in this allocator.
+   // This method will return null if any problem is detected with the data.
+   std::unique_ptr<HistogramBase> GetHistogram(Reference ref);
+@@ -256,7 +256,7 @@ class BASE_EXPORT PersistentHistogramAll
+       Reference* ref_ptr);
+ 
+   // Finalize the creation of the histogram, making it available to other
+-  // processes if |registered| (as in: added to the StatisticsRecorder) is
++  // processes if `registered` (as in: added to the StatisticsRecorder) is
+   // True, forgetting it otherwise.
+   void FinalizeHistogram(Reference ref, bool registered);
+ 
+@@ -274,36 +274,36 @@ class BASE_EXPORT PersistentHistogramAll
+       const HistogramBase* histogram);
+ 
+   // Returns an object that manages persistent-sample-map records for a given
+-  // |id|. The returned object queries |sparse_histogram_data_manager_| for
++  // `id`. The returned object queries `sparse_histogram_data_manager_` for
+   // records. Hence, the returned object must not outlive
+-  // |sparse_histogram_data_manager_| (and hence |this|).
++  // `sparse_histogram_data_manager_` (and hence `this`).
+   std::unique_ptr<PersistentSampleMapRecords> CreateSampleMapRecords(
+       uint64_t id);
+ 
+   // Creates internal histograms for tracking memory use and allocation sizes
+-  // for allocator of |name| (which can simply be the result of Name()). This
+-  // is done seperately from construction for situations such as when the
++  // for allocator of `name` (which can simply be the result of Name()). This
++  // is done separately from construction for situations such as when the
+   // histograms will be backed by memory provided by this very allocator.
+   //
+   // IMPORTANT: tools/metrics/histograms/metadata/uma/histograms.xml must
+-  // be updated with the following histograms for each |name| param:
++  // be updated with the following histograms for each `name` param:
+   //    UMA.PersistentAllocator.name.Errors
+   //    UMA.PersistentAllocator.name.UsedPct
+   void CreateTrackingHistograms(std::string_view name);
+   void UpdateTrackingHistograms();
+ 
+-  // Sets the internal |ranges_manager_|, which will be used by the allocator to
+-  // register BucketRanges. Takes ownership of the passed |ranges_manager|.
++  // Sets the internal `ranges_manager_`, which will be used by the allocator to
++  // register BucketRanges. Takes ownership of the passed `ranges_manager`.
+   //
+-  // WARNING: Since histograms may be created from |this| from multiple threads,
++  // WARNING: Since histograms may be created from `this` from multiple threads,
+   // for example through a direct call to CreateHistogram(), or while iterating
+-  // through |this|, then the passed manager may also be accessed concurrently.
++  // through `this`, then the passed manager may also be accessed concurrently.
+   // Hence, care must be taken to ensure that either:
+   //   1) The passed manager is threadsafe (see ThreadSafeRangesManager), or
+-  //   2) |this| is not used concurrently.
++  //   2) `this` is not used concurrently.
+   void SetRangesManager(RangesManager* ranges_manager);
+ 
+-  // Clears the internal |last_created_| reference so testing can validate
++  // Clears the internal `last_created_` reference so testing can validate
+   // operation without that optimization.
+   void ClearLastCreatedReferenceForTesting();
+ 
+@@ -329,7 +329,7 @@ class BASE_EXPORT PersistentHistogramAll
+       PersistentHistogramData* histogram_data_ptr);
+ 
+   // Gets or creates an object in the global StatisticsRecorder matching
+-  // the |histogram| passed. Null is returned if one was not found and
++  // the `histogram` passed. Null is returned if one was not found and
+   // one could not be created.
+   HistogramBase* GetOrCreateStatisticsRecorderHistogram(
+       const HistogramBase* histogram);
+@@ -365,7 +365,7 @@ class BASE_EXPORT GlobalHistogramAllocat
+ 
+   ~GlobalHistogramAllocator() override;
+ 
+-  // Create a global allocator using the passed-in memory |base|, |size|, and
++  // Create a global allocator using the passed-in memory `base`, `size`, and
+   // other parameters. Ownership of the memory segment remains with the caller.
+   static void CreateWithPersistentMemory(void* base,
+                                          size_t size,
+@@ -374,17 +374,17 @@ class BASE_EXPORT GlobalHistogramAllocat
+                                          std::string_view name);
+ 
+   // Create a global allocator using an internal block of memory of the
+-  // specified |size| taken from the heap.
++  // specified `size` taken from the heap.
+   static void CreateWithLocalMemory(size_t size,
+                                     uint64_t id,
+                                     std::string_view name);
+ 
+ #if !BUILDFLAG(IS_NACL)
+-  // Create a global allocator by memory-mapping a |file|. If the file does
+-  // not exist, it will be created with the specified |size|. If the file does
++  // Create a global allocator by memory-mapping a `file`. If the file does
++  // not exist, it will be created with the specified `size`. If the file does
+   // exist, the allocator will use and add to its contents, ignoring the passed
+   // size in favor of the existing size. Returns whether the global allocator
+-  // was set. If |exclusive_write| is true, the file will be opened in a mode
++  // was set. If `exclusive_write` is true, the file will be opened in a mode
+   // that disallows multiple concurrent writers (no effect on non-Windows).
+   static bool CreateWithFile(const FilePath& file_path,
+                              size_t size,
+@@ -392,9 +392,9 @@ class BASE_EXPORT GlobalHistogramAllocat
+                              std::string_view name,
+                              bool exclusive_write = false);
+ 
+-  // Creates a new file at |active_path|. If it already exists, it will first be
+-  // moved to |base_path|. In all cases, any old file at |base_path| will be
+-  // removed. If |spare_path| is non-empty and exists, that will be renamed and
++  // Creates a new file at `active_path`. If it already exists, it will first be
++  // moved to `base_path`. In all cases, any old file at `base_path` will be
++  // removed. If `spare_path` is non-empty and exists, that will be renamed and
+   // used as the active file. Otherwise, the file will be created using the
+   // given size, id, and name. Returns whether the global allocator was set.
+   static bool CreateWithActiveFile(const FilePath& base_path,
+@@ -405,9 +405,9 @@ class BASE_EXPORT GlobalHistogramAllocat
+                                    std::string_view name);
+ 
+   // Uses ConstructBaseActivePairFilePaths() to build a pair of file names which
+-  // are then used for CreateWithActiveFile(). |name| is used for both the
++  // are then used for CreateWithActiveFile(). `name` is used for both the
+   // internal name for the allocator and also for the name of the file inside
+-  // |dir|.
++  // `dir`.
+   static bool CreateWithActiveFileInDir(const FilePath& dir,
+                                         size_t size,
+                                         uint64_t id,
+@@ -442,7 +442,7 @@ class BASE_EXPORT GlobalHistogramAllocat
+ #endif
+ 
+   // Create a global allocator using a block of shared memory accessed
+-  // through the given |region|. The allocator maps the shared memory into
++  // through the given `region`. The allocator maps the shared memory into
+   // current process's virtual address space and frees it upon destruction.
+   // The memory will continue to live if other processes have access to it.
+   static void CreateWithSharedMemoryRegion(
+@@ -481,7 +481,7 @@ class BASE_EXPORT GlobalHistogramAllocat
+   bool HasPersistentLocation() const;
+ 
+   // Moves the file being used to persist this allocator's data to the directory
+-  // specified by |dir|. Returns whether the operation was successful.
++  // specified by `dir`. Returns whether the operation was successful.
+   bool MovePersistentFile(const FilePath& dir);
+ 
+   // Writes the internal data to a previously set location. This is generally
diff --git a/electron32/patches/patch-base_metrics_persistent__memory__allocator.cc b/electron32/patches/patch-base_metrics_persistent__memory__allocator.cc
new file mode 100644
index 0000000000..8bae568cc8
--- /dev/null
+++ b/electron32/patches/patch-base_metrics_persistent__memory__allocator.cc
@@ -0,0 +1,320 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- base/metrics/persistent_memory_allocator.cc.orig	2024-10-18 12:33:59.786263200 +0000
++++ base/metrics/persistent_memory_allocator.cc
+@@ -59,7 +59,7 @@ constexpr uint32_t kGlobalCookie = 0x408
+ // the metadata, the version number can be queried to operate in a backward-
+ // compatible manner until the memory segment is completely re-initalized.
+ // Note: If you update the metadata in a non-backwards compatible way, reset
+-// |kCompatibleVersions|. Otherwise, add the previous version.
++// `kCompatibleVersions`. Otherwise, add the previous version.
+ constexpr uint32_t kGlobalVersion = 3;
+ static constexpr uint32_t kOldCompatibleVersions[] = {2};
+ 
+@@ -146,12 +146,12 @@ struct PersistentMemoryAllocator::Shared
+ 
+   // The "iterable" queue is an M&S Queue as described here, append-only:
+   // https://www.research.ibm.com/people/m/michael/podc-1996.pdf
+-  // |queue| needs to be 64-bit aligned and is itself a multiple of 64 bits.
++  // `queue` needs to be 64-bit aligned and is itself a multiple of 64 bits.
+   volatile std::atomic<uint32_t> tailptr;  // Last block of iteration queue.
+   volatile BlockHeader queue;   // Empty block for linked-list head/tail.
+ };
+ 
+-// The "queue" block header is used to detect "last node" so that zero/null
++// The `queue` block header is used to detect the "last node" so that zero/null
+ // can be used to indicate that it hasn't been added at all. It is part of
+ // the SharedMetadata structure which itself is always located at offset zero.
+ const PersistentMemoryAllocator::Reference
+@@ -208,7 +208,8 @@ PersistentMemoryAllocator::Iterator::Get
+ }
+ 
+ PersistentMemoryAllocator::Reference
+-PersistentMemoryAllocator::Iterator::GetNext(uint32_t* type_return) {
++PersistentMemoryAllocator::Iterator::GetNext(uint32_t* type_return,
++                                             size_t* alloc_size) {
+   // Make a copy of the existing count of found-records, acquiring all changes
+   // made to the allocator, notably "freeptr" (see comment in loop for why
+   // the load of that value cannot be moved above here) that occurred during
+@@ -219,12 +220,13 @@ PersistentMemoryAllocator::Iterator::Get
+   // "count" was fetched _after_ "freeptr" then it would be possible for
+   // this thread to be interrupted between them and other threads perform
+   // multiple allocations, make-iterables, and iterations (with the included
+-  // increment of |record_count_|) culminating in the check at the bottom
++  // increment of `record_count_`) culminating in the check at the bottom
+   // mistakenly determining that a loop exists. Isn't this stuff fun?
+   uint32_t count = record_count_.load(std::memory_order_acquire);
+ 
+   Reference last = last_record_.load(std::memory_order_acquire);
+-  Reference next;
++  Reference next = 0;
++  size_t next_size = 0;
+   while (true) {
+     const volatile BlockHeader* block =
+         allocator_->GetBlock(last, 0, 0, true, false);
+@@ -245,7 +247,7 @@ PersistentMemoryAllocator::Iterator::Get
+     next = block->next.load(std::memory_order_acquire);
+     if (next == kReferenceQueue)  // No next allocation in queue.
+       return kReferenceNull;
+-    block = allocator_->GetBlock(next, 0, 0, false, false);
++    block = allocator_->GetBlock(next, 0, 0, false, false, &next_size);
+     if (!block) {  // Memory is corrupt.
+       allocator_->SetCorrupt();
+       return kReferenceNull;
+@@ -286,21 +288,29 @@ PersistentMemoryAllocator::Iterator::Get
+   // It does not matter if it falls behind temporarily so long as it never
+   // gets ahead.
+   record_count_.fetch_add(1, std::memory_order_release);
++  if (alloc_size) {
++    *alloc_size = next_size;
++  }
+   return next;
+ }
+ 
+ PersistentMemoryAllocator::Reference
+-PersistentMemoryAllocator::Iterator::GetNextOfType(uint32_t type_match) {
++PersistentMemoryAllocator::Iterator::GetNextOfType(uint32_t type_match,
++                                                   size_t* alloc_size) {
+   Reference ref;
++  size_t size;
+   uint32_t type_found;
+-  while ((ref = GetNext(&type_found)) != 0) {
+-    if (type_found == type_match)
++  while ((ref = GetNext(&type_found, &size)) != 0) {
++    if (type_found == type_match) {
++      if (alloc_size) {
++        *alloc_size = size;
++      }
+       return ref;
++    }
+   }
+   return kReferenceNull;
+ }
+ 
+-
+ // static
+ bool PersistentMemoryAllocator::IsMemoryAcceptable(const void* base,
+                                                    size_t size,
+@@ -475,12 +485,12 @@ uint64_t PersistentMemoryAllocator::Id()
+ 
+ const char* PersistentMemoryAllocator::Name() const {
+   Reference name_ref = shared_meta()->name;
+-  const char* name_cstr =
+-      GetAsArray<char>(name_ref, 0, PersistentMemoryAllocator::kSizeAny);
++  size_t name_length = 0;
++  const char* name_cstr = GetAsArray<char>(
++      name_ref, 0, PersistentMemoryAllocator::kSizeAny, &name_length);
+   if (!name_cstr)
+     return "";
+ 
+-  size_t name_length = GetAllocSize(name_ref);
+   if (name_cstr[name_length - 1] != '\0') {
+     NOTREACHED_IN_MIGRATION();
+     SetCorrupt();
+@@ -555,23 +565,6 @@ PersistentMemoryAllocator::Reference Per
+   return ref;
+ }
+ 
+-size_t PersistentMemoryAllocator::GetAllocSize(Reference ref) const {
+-  const volatile BlockHeader* const block = GetBlock(ref, 0, 0, false, false);
+-  if (!block)
+-    return 0;
+-  uint32_t size = block->size;
+-  // Header was verified by GetBlock() but a malicious actor could change
+-  // the value between there and here. Check it again.
+-  uint32_t total_size;
+-  if (size <= sizeof(BlockHeader) ||
+-      !base::CheckAdd(ref, size).AssignIfValid(&total_size) ||
+-      total_size > mem_size_) {
+-    SetCorrupt();
+-    return 0;
+-  }
+-  return size - sizeof(BlockHeader);
+-}
+-
+ uint32_t PersistentMemoryAllocator::GetType(Reference ref) const {
+   const volatile BlockHeader* const block = GetBlock(ref, 0, 0, false, false);
+   if (!block)
+@@ -641,8 +634,9 @@ bool PersistentMemoryAllocator::ChangeTy
+ 
+ PersistentMemoryAllocator::Reference PersistentMemoryAllocator::Allocate(
+     size_t req_size,
+-    uint32_t type_id) {
+-  Reference ref = AllocateImpl(req_size, type_id);
++    uint32_t type_id,
++    size_t* alloc_size) {
++  Reference ref = AllocateImpl(req_size, type_id, alloc_size);
+   if (ref) {
+     // Success: Record this allocation in usage stats (if active).
+     if (allocs_histogram_)
+@@ -657,7 +651,8 @@ PersistentMemoryAllocator::Reference Per
+ 
+ PersistentMemoryAllocator::Reference PersistentMemoryAllocator::AllocateImpl(
+     size_t req_size,
+-    uint32_t type_id) {
++    uint32_t type_id,
++    size_t* alloc_size) {
+   DCHECK_NE(access_mode_, kReadOnly);
+ 
+   // Validate req_size to ensure it won't overflow when used as 32-bit value.
+@@ -820,6 +815,11 @@ PersistentMemoryAllocator::Reference Per
+     block->size = static_cast<uint32_t>(size);
+     block->cookie = kBlockCookieAllocated;
+     block->type_id.store(type_id, std::memory_order_relaxed);
++
++    // Return the allocation size if requested.
++    if (alloc_size) {
++      *alloc_size = size - sizeof(BlockHeader);
++    }
+     return freeptr;
+   }
+ }
+@@ -932,17 +932,16 @@ bool PersistentMemoryAllocator::IsFull()
+   return CheckFlag(&shared_meta()->flags, kFlagFull);
+ }
+ 
+-// Dereference a block |ref| and ensure that it's valid for the desired
+-// |type_id| and |size|. |special| indicates that we may try to access block
+-// headers not available to callers but still accessed by this module. By
+-// having internal dereferences go through this same function, the allocator
+-// is hardened against corruption.
+ const volatile PersistentMemoryAllocator::BlockHeader*
+ PersistentMemoryAllocator::GetBlock(Reference ref,
+                                     uint32_t type_id,
+                                     size_t size,
+                                     bool queue_ok,
+-                                    bool free_ok) const {
++                                    bool free_ok,
++                                    size_t* alloc_size) const {
++  // The caller cannot request `alloc_size` if `queue_ok` or `free_ok`.
++  CHECK(!(alloc_size && (queue_ok || free_ok)));
++
+   // Handle special cases.
+   if (ref == kReferenceQueue && queue_ok)
+     return reinterpret_cast<const volatile BlockHeader*>(mem_base_ + ref);
+@@ -961,29 +960,39 @@ PersistentMemoryAllocator::GetBlock(Refe
+     return nullptr;
+   }
+ 
++  const volatile BlockHeader* const block =
++      reinterpret_cast<volatile BlockHeader*>(mem_base_ + ref);
++
+   // Validation of referenced block-header.
+   if (!free_ok) {
+-    const volatile BlockHeader* const block =
+-        reinterpret_cast<volatile BlockHeader*>(mem_base_ + ref);
+     if (block->cookie != kBlockCookieAllocated)
+       return nullptr;
+-    if (block->size < size)
++    const uint32_t block_size = block->size;
++    if (block_size < size) {
+       return nullptr;
+-    uint32_t block_size;
+-    if (!base::CheckAdd(ref, block->size).AssignIfValid(&block_size)) {
++    }
++    // Find a validate the end of the block.
++    uint32_t block_end_ref;
++    if (!base::CheckAdd(ref, block_size).AssignIfValid(&block_end_ref)) {
+       return nullptr;
+     }
+-    if (block_size > mem_size_) {
++    if (block_end_ref > mem_size_) {
++      // The end of the alloc extends beyond the allocator's bounds.
++      SetCorrupt();
+       return nullptr;
+     }
+     if (type_id != 0 &&
+         block->type_id.load(std::memory_order_relaxed) != type_id) {
+       return nullptr;
+     }
++    // Return `alloc_size` if requested by the caller.
++    if (alloc_size) {
++      *alloc_size = block_size - sizeof(BlockHeader);
++    }
+   }
+ 
+   // Return pointer to block data.
+-  return reinterpret_cast<const volatile BlockHeader*>(mem_base_ + ref);
++  return block;
+ }
+ 
+ void PersistentMemoryAllocator::FlushPartial(size_t length, bool sync) {
+@@ -1009,10 +1018,11 @@ uint32_t PersistentMemoryAllocator::vers
+ const volatile void* PersistentMemoryAllocator::GetBlockData(
+     Reference ref,
+     uint32_t type_id,
+-    size_t size) const {
++    size_t size,
++    size_t* alloc_size) const {
+   DCHECK(size > 0);
+   const volatile BlockHeader* block =
+-      GetBlock(ref, type_id, size, false, false);
++      GetBlock(ref, type_id, size, false, false, alloc_size);
+   if (!block)
+     return nullptr;
+   return reinterpret_cast<const volatile char*>(block) + sizeof(BlockHeader);
+@@ -1191,14 +1201,14 @@ void FilePersistentMemoryAllocator::Cach
+                                                 base::BlockingType::MAY_BLOCK);
+ 
+   // Calculate begin/end addresses so that the first byte of every page
+-  // in that range can be read. Keep within the used space. The |volatile|
++  // in that range can be read. Keep within the used space. The `volatile`
+   // keyword makes it so the compiler can't make assumptions about what is
+   // in a given memory location and thus possibly avoid the read.
+   const volatile char* mem_end = mem_base_ + used();
+   const volatile char* mem_begin = mem_base_;
+ 
+   // Iterate over the memory a page at a time, reading the first byte of
+-  // every page. The values are added to a |total| so that the compiler
++  // every page. The values are added to a `total` so that the compiler
+   // can't omit the read.
+   int total = 0;
+   for (const volatile char* memory = mem_begin; memory < mem_end;
+@@ -1206,7 +1216,7 @@ void FilePersistentMemoryAllocator::Cach
+     total += *memory;
+   }
+ 
+-  // Tell the compiler that |total| is used so that it can't optimize away
++  // Tell the compiler that `total` is used so that it can't optimize away
+   // the memory accesses above.
+   debug::Alias(&total);
+ }
+@@ -1276,7 +1286,8 @@ span<uint8_t> DelayedPersistentAllocatio
+ #endif  // !BUILDFLAG(IS_NACL)
+ 
+   if (!ref) {
+-    ref = allocator_->Allocate(size_, type_);
++    [[maybe_unused]] size_t alloc_size = 0;
++    ref = allocator_->Allocate(size_, type_, &alloc_size);
+     if (!ref) {
+       return span<uint8_t>();
+     }
+@@ -1292,7 +1303,7 @@ span<uint8_t> DelayedPersistentAllocatio
+       // allocation, and stored its reference. Purge the allocation that was
+       // just done and use the other one instead.
+       DCHECK_EQ(type_, allocator_->GetType(existing));
+-      DCHECK_LE(size_, allocator_->GetAllocSize(existing));
++      DCHECK_LE(size_, alloc_size);
+       allocator_->ChangeType(ref, 0, type_, /*clear=*/false);
+       ref = existing;
+ #if !BUILDFLAG(IS_NACL)
+@@ -1328,13 +1339,13 @@ span<uint8_t> DelayedPersistentAllocatio
+     SCOPED_CRASH_KEY_NUMBER("PersistentMemoryAllocator", "size_", size_);
+     if (ref == 0xC8799269) {
+       // There are many crash reports containing the corrupted "0xC8799269"
+-      // value in |ref|. This value is actually a "magic" number to indicate
++      // value in `ref`. This value is actually a "magic" number to indicate
+       // that a certain block in persistent memory was successfully allocated,
+       // so it should not appear there. Include some extra crash keys to see if
+       // the surrounding values were also corrupted. If so, the value before
+       // would be the size of the allocated object, and the value after would be
+       // the type id of the allocated object. If they are not corrupted, these
+-      // would contain |ranges_checksum| and the start of |samples_metadata|
++      // would contain `ranges_checksum` and the start of `samples_metadata`
+       // respectively (see PersistentHistogramData struct). We do some pointer
+       // arithmetic here -- it should theoretically be safe, unless something
+       // went terribly wrong...
diff --git a/electron32/patches/patch-base_metrics_persistent__memory__allocator.h b/electron32/patches/patch-base_metrics_persistent__memory__allocator.h
new file mode 100644
index 0000000000..f9ea3f6855
--- /dev/null
+++ b/electron32/patches/patch-base_metrics_persistent__memory__allocator.h
@@ -0,0 +1,406 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- base/metrics/persistent_memory_allocator.h.orig	2024-10-18 12:33:59.786263200 +0000
++++ base/metrics/persistent_memory_allocator.h
+@@ -171,13 +171,13 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // eventually quit.
+   class BASE_EXPORT Iterator {
+    public:
+-    // Constructs an iterator on a given |allocator|, starting at the beginning.
++    // Constructs an iterator on a given `allocator`, starting at the beginning.
+     // The allocator must live beyond the lifetime of the iterator. This class
+     // has read-only access to the allocator (hence "const") but the returned
+     // references can be used on a read/write version, too.
+     explicit Iterator(const PersistentMemoryAllocator* allocator);
+ 
+-    // As above but resuming from the |starting_after| reference. The first call
++    // As above but resuming from the `starting_after` reference. The first call
+     // to GetNext() will return the next object found after that reference. The
+     // reference must be to an "iterable" object; references to non-iterable
+     // objects (those that never had MakeIterable() called for them) will cause
+@@ -193,7 +193,7 @@ class BASE_EXPORT PersistentMemoryAlloca
+     // Resets the iterator back to the beginning.
+     void Reset();
+ 
+-    // Resets the iterator, resuming from the |starting_after| reference.
++    // Resets the iterator, resuming from the `starting_after` reference.
+     void Reset(Reference starting_after);
+ 
+     // Returns the previously retrieved reference, or kReferenceNull if none.
+@@ -201,17 +201,17 @@ class BASE_EXPORT PersistentMemoryAlloca
+     // that value.
+     Reference GetLast();
+ 
+-    // Gets the next iterable, storing that type in |type_return|. The actual
++    // Gets the next iterable, storing that type in `type_return`. The actual
+     // return value is a reference to the allocation inside the allocator or
+     // zero if there are no more. GetNext() may still be called again at a
+     // later time to retrieve any new allocations that have been added.
+-    Reference GetNext(uint32_t* type_return);
++    Reference GetNext(uint32_t* type_return, size_t* alloc_size = nullptr);
+ 
+-    // Similar to above but gets the next iterable of a specific |type_match|.
++    // Similar to above but gets the next iterable of a specific `type_match`.
+     // This should not be mixed with calls to GetNext() because any allocations
+     // skipped here due to a type mis-match will never be returned by later
+     // calls to GetNext() meaning it's possible to completely miss entries.
+-    Reference GetNextOfType(uint32_t type_match);
++    Reference GetNextOfType(uint32_t type_match, size_t* alloc_size = nullptr);
+ 
+     // As above but works using object type.
+     template <typename T>
+@@ -244,8 +244,8 @@ class BASE_EXPORT PersistentMemoryAlloca
+     }
+ 
+     // Convert a generic pointer back into a reference. A null reference will
+-    // be returned if |memory| is not inside the persistent segment or does not
+-    // point to an object of the specified |type_id|.
++    // be returned if `memory` is not inside the persistent segment or does not
++    // point to an object of the specified `type_id`.
+     Reference GetAsReference(const void* memory, uint32_t type_id) const {
+       return allocator_->GetAsReference(memory, type_id);
+     }
+@@ -308,12 +308,12 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // The allocator operates on any arbitrary block of memory. Creation and
+   // persisting or sharing of that block with another process is the
+   // responsibility of the caller. The allocator needs to know only the
+-  // block's |base| address, the total |size| of the block, and any internal
+-  // |page| size (zero if not paged) across which allocations should not span.
+-  // The |id| is an arbitrary value the caller can use to identify a
++  // block's `base` address, the total `size` of the block, and any internal
++  // `page` size (zero if not paged) across which allocations should not span.
++  // The `id` is an arbitrary value the caller can use to identify a
+   // particular memory segment. It will only be loaded during the initial
+   // creation of the segment and can be checked by the caller for consistency.
+-  // The |name|, if provided, is used to distinguish histograms for this
++  // The `name`, if provided, is used to distinguish histograms for this
+   // allocator. Only the primary owner of the segment should define this value;
+   // other processes can learn it from the shared state. If the access mode
+   // is kReadOnly then no changes will be made to it. The resulting object
+@@ -367,12 +367,12 @@ class BASE_EXPORT PersistentMemoryAlloca
+   uint8_t GetMemoryState() const;
+ 
+   // Create internal histograms for tracking memory use and allocation sizes
+-  // for allocator of |name| (which can simply be the result of Name()). This
+-  // is done seperately from construction for situations such as when the
++  // for allocator of `name` (which can simply be the result of Name()). This
++  // is done separately from construction for situations such as when the
+   // histograms will be backed by memory provided by this very allocator.
+   //
+   // IMPORTANT: tools/metrics/histograms/metadata/uma/histograms.xml must
+-  // be updated with the following histograms for each |name| param:
++  // be updated with the following histograms for each `name` param:
+   //    UMA.PersistentAllocator.name.Errors
+   //    UMA.PersistentAllocator.name.UsedPct
+   void CreateTrackingHistograms(std::string_view name);
+@@ -382,13 +382,13 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // OS that all the data should be sent to the disk immediately. This is
+   // useful in the rare case where something has just been stored that needs
+   // to survive a hard shutdown of the machine like from a power failure.
+-  // The |sync| parameter indicates if this call should block until the flush
++  // The `sync` parameter indicates if this call should block until the flush
+   // is complete but is only advisory and may or may not have an effect
+   // depending on the capabilities of the OS. Synchronous flushes are allowed
+-  // only from threads that are allowed to do I/O but since |sync| is only
++  // only from threads that are allowed to do I/O but since `sync` is only
+   // advisory, all flushes should be done on IO-capable threads.
+-  // TODO: Since |sync| is ignored on Windows, consider making it re-post on a
+-  // background thread with |sync| set to true so that |sync| is not just
++  // TODO: Since `sync` is ignored on Windows, consider making it re-post on a
++  // background thread with `sync` set to true so that `sync` is not just
+   // advisory.
+   void Flush(bool sync);
+ 
+@@ -400,9 +400,9 @@ class BASE_EXPORT PersistentMemoryAlloca
+   size_t size() const { return mem_size_; }
+   size_t used() const;
+ 
+-  // Get an object referenced by a |ref|. For safety reasons, the |type_id|
+-  // code and size-of(|T|) are compared to ensure the reference is valid
+-  // and cannot return an object outside of the memory segment. A |type_id| of
++  // Get an object referenced by a `ref`. For safety reasons, the `type_id`
++  // code and size-of(`T`) are compared to ensure the reference is valid
++  // and cannot return an object outside of the memory segment. A `type_id` of
+   // kTypeIdAny (zero) will match any though the size is still checked. NULL is
+   // returned if any problem is detected, such as corrupted storage or incorrect
+   // parameters. Callers MUST check that the returned value is not-null EVERY
+@@ -422,7 +422,7 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // largest architecture, including at the end.
+   //
+   // To protected against mistakes, all objects must have the attribute
+-  // |kExpectedInstanceSize| (static constexpr size_t)  that is a hard-coded
++  // `kExpectedInstanceSize` (static constexpr size_t)  that is a hard-coded
+   // numerical value -- NNN, not sizeof(T) -- that can be tested. If the
+   // instance size is not fixed, at least one build will fail.
+   //
+@@ -442,27 +442,28 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // nature of that keyword to the caller. It can add it back, if necessary,
+   // based on knowledge of how the allocator is being used.
+   template <typename T>
+-  T* GetAsObject(Reference ref) {
++  T* GetAsObject(Reference ref, size_t* alloc_size = nullptr) {
+     static_assert(std::is_standard_layout_v<T>, "only standard objects");
+     static_assert(!std::is_array_v<T>, "use GetAsArray<>()");
+     static_assert(T::kExpectedInstanceSize == sizeof(T), "inconsistent size");
+     return const_cast<T*>(reinterpret_cast<volatile T*>(
+-        GetBlockData(ref, T::kPersistentTypeId, sizeof(T))));
++        GetBlockData(ref, T::kPersistentTypeId, sizeof(T), alloc_size)));
+   }
+   template <typename T>
+-  const T* GetAsObject(Reference ref) const {
++  const T* GetAsObject(Reference ref, size_t* alloc_size = nullptr) const {
+     static_assert(std::is_standard_layout_v<T>, "only standard objects");
+     static_assert(!std::is_array_v<T>, "use GetAsArray<>()");
+     static_assert(T::kExpectedInstanceSize == sizeof(T), "inconsistent size");
+     return const_cast<const T*>(reinterpret_cast<const volatile T*>(
+-        GetBlockData(ref, T::kPersistentTypeId, sizeof(T))));
++        GetBlockData(ref, T::kPersistentTypeId, sizeof(T), alloc_size)));
+   }
+ 
+-  // Like GetAsObject but get an array of simple, fixed-size types.
++  // Like GetAsObject() but get an array of simple, fixed-size types.
+   //
+-  // Use a |count| of the required number of array elements, or kSizeAny.
+-  // GetAllocSize() can be used to calculate the upper bound but isn't reliable
+-  // because padding can make space for extra elements that were not written.
++  // Use a `count` of the required number of array elements, or kSizeAny.
++  // The, optionally returned, `alloc_size` can be used to calculate the upper
++  // bound but isn't reliable because padding can make space for extra elements
++  // that were not written.
+   //
+   // Remember that an array of char is a string but may not be NUL terminated.
+   //
+@@ -470,29 +471,29 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // compatibilty when using these accessors. Only use fixed-size types such
+   // as char, float, double, or (u)intXX_t.
+   template <typename T>
+-  T* GetAsArray(Reference ref, uint32_t type_id, size_t count) {
++  T* GetAsArray(Reference ref,
++                uint32_t type_id,
++                size_t count,
++                size_t* alloc_size = nullptr) {
+     static_assert(std::is_fundamental_v<T>, "use GetAsObject<>()");
+     return const_cast<T*>(reinterpret_cast<volatile T*>(
+-        GetBlockData(ref, type_id, count * sizeof(T))));
++        GetBlockData(ref, type_id, count * sizeof(T), alloc_size)));
+   }
+   template <typename T>
+-  const T* GetAsArray(Reference ref, uint32_t type_id, size_t count) const {
++  const T* GetAsArray(Reference ref,
++                      uint32_t type_id,
++                      size_t count,
++                      size_t* alloc_size = nullptr) const {
+     static_assert(std::is_fundamental_v<T>, "use GetAsObject<>()");
+     return const_cast<const char*>(reinterpret_cast<const volatile T*>(
+-        GetBlockData(ref, type_id, count * sizeof(T))));
++        GetBlockData(ref, type_id, count * sizeof(T), alloc_size)));
+   }
+ 
+   // Get the corresponding reference for an object held in persistent memory.
+-  // If the |memory| is not valid or the type does not match, a kReferenceNull
++  // If the `memory` is not valid or the type does not match, a kReferenceNull
+   // result will be returned.
+   Reference GetAsReference(const void* memory, uint32_t type_id) const;
+ 
+-  // Get the number of bytes allocated to a block. This is useful when storing
+-  // arrays in order to validate the ending boundary. The returned value will
+-  // include any padding added to achieve the required alignment and so could
+-  // be larger than given in the original Allocate() request.
+-  size_t GetAllocSize(Reference ref) const;
+-
+   // Access the internal "type" of an object. This generally isn't necessary
+   // but can be used to "clear" the type and so effectively mark it as deleted
+   // even though the memory stays valid and allocated. Changing the type is
+@@ -500,8 +501,8 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // It will return false if the existing type is not what is expected.
+   //
+   // Changing the type doesn't mean the data is compatible with the new type.
+-  // Passing true for |clear| will zero the memory after the type has been
+-  // changed away from |from_type_id| but before it becomes |to_type_id| meaning
++  // Passing true for `clear` will zero the memory after the type has been
++  // changed away from `from_type_id` but before it becomes `to_type_id` meaning
+   // that it is done in a manner that is thread-safe. Memory is guaranteed to
+   // be zeroed atomically by machine-word in a monotonically increasing order.
+   //
+@@ -553,13 +554,15 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // While the above works much like malloc & free, these next methods provide
+   // an "object" interface similar to new and delete.
+ 
+-  // Reserve space in the memory segment of the desired |size| and |type_id|.
++  // Reserve space in the memory segment of the desired `size` and `type_id`.
+   //
+   // A return value of zero indicates the allocation failed, otherwise the
+   // returned reference can be used by any process to get a real pointer via
+-  // the GetAsObject() or GetAsArray calls. The actual allocated size may be
++  // the GetAsObject() or GetAsArray() calls. The actual allocated size may be
+   // larger and will always be a multiple of 8 bytes (64 bits).
+-  Reference Allocate(size_t size, uint32_t type_id);
++  Reference Allocate(size_t size,
++                     uint32_t type_id,
++                     size_t* alloc_size = nullptr);
+ 
+   // Allocate and construct an object in persistent memory. The type must have
+   // both (size_t) kExpectedInstanceSize and (uint32_t) kPersistentTypeId
+@@ -586,7 +589,7 @@ class BASE_EXPORT PersistentMemoryAlloca
+   }
+ 
+   // Similar to New, above, but construct the object out of an existing memory
+-  // block and of an expected type. If |clear| is true, memory will be zeroed
++  // block and of an expected type. If `clear` is true, memory will be zeroed
+   // before construction. Though this is not standard object behavior, it
+   // is present to match with new allocations that always come from zeroed
+   // memory. Anything previously present simply ceases to exist; no destructor
+@@ -596,13 +599,16 @@ class BASE_EXPORT PersistentMemoryAlloca
+   // results. USE WITH CARE!
+   template <typename T>
+   T* New(Reference ref, uint32_t from_type_id, bool clear) {
+-    DCHECK_LE(sizeof(T), GetAllocSize(ref)) << "alloc not big enough for obj";
+     // Make sure the memory is appropriate. This won't be used until after
+     // the type is changed but checking first avoids the possibility of having
+     // to change the type back.
+-    void* mem = const_cast<void*>(GetBlockData(ref, 0, sizeof(T)));
++    size_t alloc_size = 0;
++    void* mem = const_cast<void*>(GetBlockData(ref, 0, sizeof(T), &alloc_size));
+     if (!mem)
+       return nullptr;
++
++    DCHECK_LE(sizeof(T), alloc_size) << "alloc not big enough for obj";
++
+     // Ensure the allocator's internal alignment is sufficient for this object.
+     // This protects against coding errors in the allocator.
+     DCHECK_EQ(0U, reinterpret_cast<uintptr_t>(mem) & (alignof(T) - 1));
+@@ -633,7 +639,7 @@ class BASE_EXPORT PersistentMemoryAlloca
+     // First change the type to "transitioning" so there is no race condition
+     // where another thread could find the object through iteration while it
+     // is been destructed. This will "acquire" the memory so no changes get
+-    // reordered before it. It will fail if |ref| is invalid.
++    // reordered before it. It will fail if `ref` is invalid.
+     if (!ChangeType(ref, kTypeIdTransitioning, T::kPersistentTypeId, false))
+       return;
+     // Destruct the object.
+@@ -677,7 +683,7 @@ class BASE_EXPORT PersistentMemoryAlloca
+   };
+ 
+   // Constructs the allocator. Everything is the same as the public allocator
+-  // except |memory| which is a structure with additional information besides
++  // except `memory` which is a structure with additional information besides
+   // the base address.
+   PersistentMemoryAllocator(Memory memory,
+                             size_t size,
+@@ -715,32 +721,52 @@ class BASE_EXPORT PersistentMemoryAlloca
+   }
+ 
+   // Actual method for doing the allocation.
+-  Reference AllocateImpl(size_t size, uint32_t type_id);
++  Reference AllocateImpl(size_t size, uint32_t type_id, size_t* alloc_size);
+ 
+-  // Gets the block header associated with a specific reference.
++  // Dereferences a block `ref` to retrieve a pointer to the block header for
++  // the reference. This method ensures that the referenced block is valid for
++  // the desired `type_id` and `size`. Optionally, if `alloc_sizes` is not
++  // nullptr, the validated size of the underlying allocation is returned.
++  //
++  // Special cases for internal use only:
++  //
++  // * If `queue_ok` is true and `ref` is kReferenceQueueindicates then the
++  //   block header for the allocation queue is returned.
++  //
++  // * if `free_ok` then the block header is allowed to point to a block that
++  //   may not be in the `allocated` state. This bypasses block validation.
++  //
++  // Because they bypass block valoidation, it is not premitted to request the
++  // `alloc_size` when either of `queue_ok` or `free_ok` are true.
+   const volatile BlockHeader* GetBlock(Reference ref,
+                                        uint32_t type_id,
+                                        size_t size,
+                                        bool queue_ok,
+-                                       bool free_ok) const;
++                                       bool free_ok,
++                                       size_t* alloc_size = nullptr) const;
+   volatile BlockHeader* GetBlock(Reference ref,
+                                  uint32_t type_id,
+                                  size_t size,
+                                  bool queue_ok,
+-                                 bool free_ok) {
++                                 bool free_ok,
++                                 size_t* alloc_size = nullptr) {
+     return const_cast<volatile BlockHeader*>(
+         const_cast<const PersistentMemoryAllocator*>(this)->GetBlock(
+-            ref, type_id, size, queue_ok, free_ok));
++            ref, type_id, size, queue_ok, free_ok, alloc_size));
+   }
+ 
+   // Gets the actual data within a block associated with a specific reference.
+   const volatile void* GetBlockData(Reference ref,
+                                     uint32_t type_id,
+-                                    size_t size) const;
+-  volatile void* GetBlockData(Reference ref, uint32_t type_id, size_t size) {
++                                    size_t size,
++                                    size_t* alloc_size = nullptr) const;
++  volatile void* GetBlockData(Reference ref,
++                              uint32_t type_id,
++                              size_t size,
++                              size_t* alloc_size = nullptr) {
+     return const_cast<volatile void*>(
+         const_cast<const PersistentMemoryAllocator*>(this)->GetBlockData(
+-            ref, type_id, size));
++            ref, type_id, size, alloc_size));
+   }
+ 
+   // Records an error in the internal histogram.
+@@ -792,12 +818,12 @@ class BASE_EXPORT LocalPersistentMemoryA
+   ~LocalPersistentMemoryAllocator() override;
+ 
+  private:
+-  // Allocates a block of local memory of the specified |size|, ensuring that
++  // Allocates a block of local memory of the specified `size`, ensuring that
+   // the memory will not be physically allocated until accessed and will read
+   // as zero when that happens.
+   static Memory AllocateLocalMemory(size_t size, std::string_view name);
+ 
+-  // Deallocates a block of local |memory| of the specified |size|.
++  // Deallocates a block of local `memory` of the specified `size`.
+   static void DeallocateLocalMemory(void* memory, size_t size, MemoryType type);
+ };
+ 
+@@ -865,8 +891,8 @@ class BASE_EXPORT ReadOnlySharedPersiste
+ class BASE_EXPORT FilePersistentMemoryAllocator
+     : public PersistentMemoryAllocator {
+  public:
+-  // A |max_size| of zero will use the length of the file as the maximum
+-  // size. The |file| object must have been already created with sufficient
++  // A `max_size` of zero will use the length of the file as the maximum
++  // size. The `file` object must have been already created with sufficient
+   // permissions (read, read/write, or read/write/extend).
+   FilePersistentMemoryAllocator(std::unique_ptr<MemoryMappedFile> file,
+                                 size_t max_size,
+@@ -916,18 +942,18 @@ class BASE_EXPORT DelayedPersistentAlloc
+  public:
+   using Reference = PersistentMemoryAllocator::Reference;
+ 
+-  // Creates a delayed allocation using the specified |allocator|. When
+-  // needed, the memory will be allocated using the specified |type| and
+-  // |size|. If |offset| is given, the returned pointer will be at that
++  // Creates a delayed allocation using the specified `allocator`. When
++  // needed, the memory will be allocated using the specified `type` and
++  // `size`. If `offset` is given, the returned pointer will be at that
+   // offset into the segment; this allows combining allocations into a
+   // single persistent segment to reduce overhead and means an "all or
+-  // nothing" request. Note that |size| is always the total memory size
+-  // and |offset| is just indicating the start of a block within it.
++  // nothing" request. Note that `size` is always the total memory size
++  // and `offset` is just indicating the start of a block within it.
+   //
+-  // Once allocated, a reference to the segment will be stored at |ref|.
++  // Once allocated, a reference to the segment will be stored at `ref`.
+   // This shared location must be initialized to zero (0); it is checked
+   // with every Get() request to see if the allocation has already been
+-  // done. If reading |ref| outside of this object, be sure to do an
++  // done. If reading `ref` outside of this object, be sure to do an
+   // "acquire" load. Don't write to it -- leave that to this object.
+   DelayedPersistentAllocation(PersistentMemoryAllocator* allocator,
+                               std::atomic<Reference>* ref,
diff --git a/electron32/patches/patch-base_metrics_persistent__memory__allocator__unittest.cc b/electron32/patches/patch-base_metrics_persistent__memory__allocator__unittest.cc
new file mode 100644
index 0000000000..ba11e8b541
--- /dev/null
+++ b/electron32/patches/patch-base_metrics_persistent__memory__allocator__unittest.cc
@@ -0,0 +1,55 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- base/metrics/persistent_memory_allocator_unittest.cc.orig	2024-10-18 12:33:59.786263200 +0000
++++ base/metrics/persistent_memory_allocator_unittest.cc
+@@ -140,11 +140,12 @@ TEST_F(PersistentMemoryAllocatorTest, Al
+   ASSERT_TRUE(obj1);
+   Reference block1 = allocator_->GetAsReference(obj1);
+   ASSERT_NE(0U, block1);
+-  EXPECT_NE(nullptr, allocator_->GetAsObject<TestObject1>(block1));
+   EXPECT_EQ(nullptr, allocator_->GetAsObject<TestObject2>(block1));
+-  EXPECT_LE(sizeof(TestObject1), allocator_->GetAllocSize(block1));
+-  EXPECT_GT(sizeof(TestObject1) + kAllocAlignment,
+-            allocator_->GetAllocSize(block1));
++  size_t alloc_size_1 = 0;
++  EXPECT_NE(nullptr,
++            allocator_->GetAsObject<TestObject1>(block1, &alloc_size_1));
++  EXPECT_LE(sizeof(TestObject1), alloc_size_1);
++  EXPECT_GT(sizeof(TestObject1) + kAllocAlignment, alloc_size_1);
+   PersistentMemoryAllocator::MemoryInfo meminfo1;
+   allocator_->GetMemoryInfo(&meminfo1);
+   EXPECT_EQ(meminfo0.total, meminfo1.total);
+@@ -180,11 +181,12 @@ TEST_F(PersistentMemoryAllocatorTest, Al
+   ASSERT_TRUE(obj2);
+   Reference block2 = allocator_->GetAsReference(obj2);
+   ASSERT_NE(0U, block2);
+-  EXPECT_NE(nullptr, allocator_->GetAsObject<TestObject2>(block2));
+   EXPECT_EQ(nullptr, allocator_->GetAsObject<TestObject1>(block2));
+-  EXPECT_LE(sizeof(TestObject2), allocator_->GetAllocSize(block2));
+-  EXPECT_GT(sizeof(TestObject2) + kAllocAlignment,
+-            allocator_->GetAllocSize(block2));
++  size_t alloc_size_2 = 0;
++  EXPECT_NE(nullptr,
++            allocator_->GetAsObject<TestObject2>(block2, &alloc_size_2));
++  EXPECT_LE(sizeof(TestObject2), alloc_size_2);
++  EXPECT_GT(sizeof(TestObject2) + kAllocAlignment, alloc_size_2);
+   PersistentMemoryAllocator::MemoryInfo meminfo2;
+   allocator_->GetMemoryInfo(&meminfo2);
+   EXPECT_EQ(meminfo1.total, meminfo2.total);
+@@ -965,10 +967,10 @@ TEST(FilePersistentMemoryAllocatorTest, 
+       uint32_t type_id;
+       Reference ref;
+       while ((ref = iter.GetNext(&type_id)) != 0) {
++        size_t size = 0;
+         const char* data = allocator.GetAsArray<char>(
+-            ref, 0, PersistentMemoryAllocator::kSizeAny);
++            ref, 0, PersistentMemoryAllocator::kSizeAny, &size);
+         uint32_t type = allocator.GetType(ref);
+-        size_t size = allocator.GetAllocSize(ref);
+         // Ensure compiler can't optimize-out above variables.
+         (void)data;
+         (void)type;
diff --git a/electron32/patches/patch-base_process_process__handle__netbsd.cc b/electron32/patches/patch-base_process_process__handle__netbsd.cc
index 6a73a2db04..6a25ad7012 100644
--- a/electron32/patches/patch-base_process_process__handle__netbsd.cc
+++ b/electron32/patches/patch-base_process_process__handle__netbsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- base/process/process_handle_netbsd.cc.orig	2025-01-19 14:12:03.860984806 +0000
+--- base/process/process_handle_netbsd.cc.orig	2025-02-15 09:43:46.221797547 +0000
 +++ base/process/process_handle_netbsd.cc
 @@ -0,0 +1,55 @@
 +// Copyright 2011 The Chromium Authors
diff --git a/electron32/patches/patch-base_process_process__iterator__netbsd.cc b/electron32/patches/patch-base_process_process__iterator__netbsd.cc
index 4b5a056fae..38b926a1ce 100644
--- a/electron32/patches/patch-base_process_process__iterator__netbsd.cc
+++ b/electron32/patches/patch-base_process_process__iterator__netbsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- base/process/process_iterator_netbsd.cc.orig	2025-01-19 14:12:03.861465218 +0000
+--- base/process/process_iterator_netbsd.cc.orig	2025-02-15 09:43:46.222409533 +0000
 +++ base/process/process_iterator_netbsd.cc
 @@ -0,0 +1,132 @@
 +// Copyright 2013 The Chromium Authors
diff --git a/electron32/patches/patch-base_process_process__metrics__netbsd.cc b/electron32/patches/patch-base_process_process__metrics__netbsd.cc
index 0ea875e043..e76839d5eb 100644
--- a/electron32/patches/patch-base_process_process__metrics__netbsd.cc
+++ b/electron32/patches/patch-base_process_process__metrics__netbsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- base/process/process_metrics_netbsd.cc.orig	2025-01-19 14:12:03.862032599 +0000
+--- base/process/process_metrics_netbsd.cc.orig	2025-02-15 09:43:46.223087337 +0000
 +++ base/process/process_metrics_netbsd.cc
 @@ -0,0 +1,175 @@
 +// Copyright 2013 The Chromium Authors
diff --git a/electron32/patches/patch-base_system_sys__info__netbsd.cc b/electron32/patches/patch-base_system_sys__info__netbsd.cc
index 07c664900f..864e072dfc 100644
--- a/electron32/patches/patch-base_system_sys__info__netbsd.cc
+++ b/electron32/patches/patch-base_system_sys__info__netbsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- base/system/sys_info_netbsd.cc.orig	2025-01-19 14:12:03.871109707 +0000
+--- base/system/sys_info_netbsd.cc.orig	2025-02-15 09:43:46.226031203 +0000
 +++ base/system/sys_info_netbsd.cc
 @@ -0,0 +1,91 @@
 +// Copyright 2011 The Chromium Authors
diff --git a/electron32/patches/patch-base_threading_platform__thread__bsd.cc b/electron32/patches/patch-base_threading_platform__thread__bsd.cc
index d35bbffb0b..6cfb3c33a5 100644
--- a/electron32/patches/patch-base_threading_platform__thread__bsd.cc
+++ b/electron32/patches/patch-base_threading_platform__thread__bsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- base/threading/platform_thread_bsd.cc.orig	2025-01-19 14:12:03.877262910 +0000
+--- base/threading/platform_thread_bsd.cc.orig	2025-02-15 09:43:46.227530359 +0000
 +++ base/threading/platform_thread_bsd.cc
 @@ -0,0 +1,31 @@
 +// Copyright 2023 The Chromium Authors
diff --git a/electron32/patches/patch-build_linux_unbundle_icu.gn b/electron32/patches/patch-build_linux_unbundle_icu.gn
index 6e4ad7f9db..7a6ffa115e 100644
--- a/electron32/patches/patch-build_linux_unbundle_icu.gn
+++ b/electron32/patches/patch-build_linux_unbundle_icu.gn
@@ -22,3 +22,22 @@ $NetBSD$
      # U_EXPORT (defined in unicode/platform.h) is used to set public visibility
      # on classes through the U_COMMON_API and U_I18N_API macros (among others).
      # When linking against the system ICU library, we want its symbols to have
+@@ -35,6 +44,18 @@ config("icu_config") {
+     # please see: https://crbug.com/822820
+     "U_IMPORT=U_EXPORT",
+   ]
++
++  _icu_version = exec_script(pkg_config_script,
++                              common_pkg_config_args + pkg_config_args + [
++                                    "icu-i18n",
++                                    "--version-as-components",
++                                  ],
++                              "value")
++
++  # Unbreak with icu 76 where private symbols are picked up
++  if (_icu_version[0] >= 76) {
++    defines += [ "U_HIDE_DRAFT_API" ]
++  }
+ }
+ 
+ pkg_config("system_icui18n") {
diff --git a/electron32/patches/patch-build_toolchain_freebsd_BUILD.gn b/electron32/patches/patch-build_toolchain_freebsd_BUILD.gn
index 8b72d969ad..de6c1e7629 100644
--- a/electron32/patches/patch-build_toolchain_freebsd_BUILD.gn
+++ b/electron32/patches/patch-build_toolchain_freebsd_BUILD.gn
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- build/toolchain/freebsd/BUILD.gn.orig	2025-01-19 14:12:03.886423960 +0000
+--- build/toolchain/freebsd/BUILD.gn.orig	2025-02-15 09:43:46.232003921 +0000
 +++ build/toolchain/freebsd/BUILD.gn
 @@ -0,0 +1,66 @@
 +# Copyright 2013 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-build_toolchain_netbsd_BUILD.gn b/electron32/patches/patch-build_toolchain_netbsd_BUILD.gn
index 82bc44124e..e6d230c2bf 100644
--- a/electron32/patches/patch-build_toolchain_netbsd_BUILD.gn
+++ b/electron32/patches/patch-build_toolchain_netbsd_BUILD.gn
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- build/toolchain/netbsd/BUILD.gn.orig	2025-01-19 14:12:03.888945404 +0000
+--- build/toolchain/netbsd/BUILD.gn.orig	2025-02-15 09:43:46.232474102 +0000
 +++ build/toolchain/netbsd/BUILD.gn
 @@ -0,0 +1,66 @@
 +# Copyright 2013 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-build_toolchain_openbsd_BUILD.gn b/electron32/patches/patch-build_toolchain_openbsd_BUILD.gn
index 7b96e44977..65678595f5 100644
--- a/electron32/patches/patch-build_toolchain_openbsd_BUILD.gn
+++ b/electron32/patches/patch-build_toolchain_openbsd_BUILD.gn
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- build/toolchain/openbsd/BUILD.gn.orig	2025-01-19 14:12:03.892714639 +0000
+--- build/toolchain/openbsd/BUILD.gn.orig	2025-02-15 09:43:46.232646717 +0000
 +++ build/toolchain/openbsd/BUILD.gn
 @@ -0,0 +1,66 @@
 +# Copyright 2013 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-cc_tiles_gpu__image__decode__cache.cc b/electron32/patches/patch-cc_tiles_gpu__image__decode__cache.cc
new file mode 100644
index 0000000000..29410a7b6e
--- /dev/null
+++ b/electron32/patches/patch-cc_tiles_gpu__image__decode__cache.cc
@@ -0,0 +1,38 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- cc/tiles/gpu_image_decode_cache.cc.orig	2024-10-18 12:33:59.978154700 +0000
++++ cc/tiles/gpu_image_decode_cache.cc
+@@ -2398,6 +2398,9 @@ void GpuImageDecodeCache::DecodeImageIfN
+ 
+   image_data->decode.ResetData();
+ 
++  // Prevent image_data from being deleted while lock is not held.
++  scoped_refptr<ImageData> image_data_holder(image_data);
++
+   // Decode the image into `aux_image_data` while the lock is not held.
+   DecodedAuxImageData aux_image_data[kAuxImageCount];
+   {
+@@ -2725,6 +2728,9 @@ void GpuImageDecodeCache::UploadImageIfN
+   sk_sp<SkImage> uploaded_v_image =
+       image_data->decode.image(2, AuxImage::kDefault);
+ 
++  // Prevent image_data from being deleted while lock is not held.
++  scoped_refptr<ImageData> image_data_holder(image_data);
++
+   // For kGpu, we upload and color convert (if necessary).
+   if (image_data->mode == DecodedDataMode::kGpu) {
+     DCHECK(!use_transfer_cache_);
+@@ -2812,6 +2818,9 @@ void GpuImageDecodeCache::UploadImageIfN
+   DCHECK(!use_transfer_cache_);
+   DCHECK(!image_data->info.yuva.has_value());
+ 
++  // Prevent image_data from being deleted while lock is not held.
++  scoped_refptr<ImageData> image_data_holder(image_data);
++
+   // RGBX decoding is below.
+   // For kGpu, we upload and color convert (if necessary).
+   if (image_data->mode == DecodedDataMode::kGpu) {
diff --git a/electron32/patches/patch-components_metrics_persistent__system__profile.cc b/electron32/patches/patch-components_metrics_persistent__system__profile.cc
new file mode 100644
index 0000000000..9c98e903f6
--- /dev/null
+++ b/electron32/patches/patch-components_metrics_persistent__system__profile.cc
@@ -0,0 +1,54 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- components/metrics/persistent_system_profile.cc.orig	2024-10-18 12:34:06.882349300 +0000
++++ components/metrics/persistent_system_profile.cc
+@@ -104,7 +104,7 @@ bool PersistentSystemProfile::RecordAllo
+       if (!AddSegment(remaining_size))
+         return false;
+     }
+-    // Write out as much of the data as possible. |data| and |remaining_size|
++    // Write out as much of the data as possible. `data` and `remaining_size`
+     // are updated in place.
+     if (!WriteData(type, &data, &remaining_size))
+       return false;
+@@ -147,8 +147,7 @@ bool PersistentSystemProfile::RecordAllo
+ 
+ bool PersistentSystemProfile::RecordAllocator::NextSegment() const {
+   base::PersistentMemoryAllocator::Iterator iter(allocator_, alloc_reference_);
+-  alloc_reference_ = iter.GetNextOfType(kTypeIdSystemProfile);
+-  alloc_size_ = allocator_->GetAllocSize(alloc_reference_);
++  alloc_reference_ = iter.GetNextOfType(kTypeIdSystemProfile, &alloc_size_);
+   end_offset_ = 0;
+   return alloc_reference_ != 0;
+ }
+@@ -169,13 +168,15 @@ bool PersistentSystemProfile::RecordAllo
+   size_t size =
+       std::max(CalculateRecordSize(min_size), kSystemProfileAllocSize);
+ 
+-  uint32_t ref = allocator_->Allocate(size, kTypeIdSystemProfile);
++  size_t new_alloc_size = 0;
++  uint32_t ref =
++      allocator_->Allocate(size, kTypeIdSystemProfile, &new_alloc_size);
+   if (!ref)
+     return false;  // Allocator must be full.
+   allocator_->MakeIterable(ref);
+ 
+   alloc_reference_ = ref;
+-  alloc_size_ = allocator_->GetAllocSize(ref);
++  alloc_size_ = new_alloc_size;
+   return true;
+ }
+ 
+@@ -284,7 +285,7 @@ void PersistentSystemProfile::RegisterPe
+     base::PersistentMemoryAllocator* memory_allocator) {
+   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ 
+-  // Create and store the allocator. A |min_size| of "1" ensures that a memory
++  // Create and store the allocator. A `min_size` of "1" ensures that a memory
+   // block is reserved now.
+   RecordAllocator allocator(memory_allocator, 1);
+   allocators_.push_back(std::move(allocator));
diff --git a/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.cc b/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.cc
index bcb3e31de7..b23ea582b4 100644
--- a/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.cc
+++ b/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- components/viz/service/display_embedder/software_output_device_proxy.cc.orig	2025-01-19 14:12:03.984384930 +0000
+--- components/viz/service/display_embedder/software_output_device_proxy.cc.orig	2025-02-15 09:43:46.319610669 +0000
 +++ components/viz/service/display_embedder/software_output_device_proxy.cc
 @@ -0,0 +1,161 @@
 +// Copyright 2014 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.h b/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.h
index 531a803937..96ca513dae 100644
--- a/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.h
+++ b/electron32/patches/patch-components_viz_service_display__embedder_software__output__device__proxy.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- components/viz/service/display_embedder/software_output_device_proxy.h.orig	2025-01-19 14:12:03.984505815 +0000
+--- components/viz/service/display_embedder/software_output_device_proxy.h.orig	2025-02-15 09:43:46.319755490 +0000
 +++ components/viz/service/display_embedder/software_output_device_proxy.h
 @@ -0,0 +1,98 @@
 +// Copyright 2014 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc b/electron32/patches/patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc
index 70b44cf52f..9744135eeb 100644
--- a/electron32/patches/patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc
+++ b/electron32/patches/patch-content_browser_file__system__access_file__path__watcher_file__path__watcher__bsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- content/browser/file_system_access/file_path_watcher/file_path_watcher_bsd.cc.orig	2025-01-19 14:12:03.990208453 +0000
+--- content/browser/file_system_access/file_path_watcher/file_path_watcher_bsd.cc.orig	2025-02-15 09:43:46.325632232 +0000
 +++ content/browser/file_system_access/file_path_watcher/file_path_watcher_bsd.cc
 @@ -0,0 +1,55 @@
 +// Copyright 2024 The Chromium Authors
diff --git a/electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.cc b/electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.cc
new file mode 100644
index 0000000000..7320c437f8
--- /dev/null
+++ b/electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.cc
@@ -0,0 +1,140 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- content/browser/renderer_host/media/video_capture_manager.cc.orig	2024-10-18 12:34:13.310953400 +0000
++++ content/browser/renderer_host/media/video_capture_manager.cc
+@@ -15,6 +15,7 @@
+ #include "base/location.h"
+ #include "base/logging.h"
+ #include "base/memory/raw_ptr.h"
++#include "base/memory/scoped_refptr.h"
+ #include "base/metrics/histogram_functions.h"
+ #include "base/observer_list.h"
+ #include "base/ranges/algorithm.h"
+@@ -61,12 +62,14 @@ namespace content {
+ class VideoCaptureManager::CaptureDeviceStartRequest {
+  public:
+   CaptureDeviceStartRequest(
+-      VideoCaptureController* controller,
++      scoped_refptr<VideoCaptureController> controller,
+       const media::VideoCaptureSessionId& session_id,
+       const media::VideoCaptureParams& params,
+       mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
+           video_effects_processor);
+-  VideoCaptureController* controller() const { return controller_; }
++  scoped_refptr<VideoCaptureController> controller() const {
++    return controller_;
++  }
+   const base::UnguessableToken& session_id() const { return session_id_; }
+   media::VideoCaptureParams params() const { return params_; }
+ 
+@@ -76,7 +79,7 @@ class VideoCaptureManager::CaptureDevice
+   }
+ 
+  private:
+-  const raw_ptr<VideoCaptureController> controller_;
++  const scoped_refptr<VideoCaptureController> controller_;
+   const base::UnguessableToken session_id_;
+   const media::VideoCaptureParams params_;
+   mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
+@@ -84,12 +87,12 @@ class VideoCaptureManager::CaptureDevice
+ };
+ 
+ VideoCaptureManager::CaptureDeviceStartRequest::CaptureDeviceStartRequest(
+-    VideoCaptureController* controller,
++    scoped_refptr<VideoCaptureController> controller,
+     const media::VideoCaptureSessionId& session_id,
+     const media::VideoCaptureParams& params,
+     mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
+         video_effects_processor)
+-    : controller_(controller),
++    : controller_(std::move(controller)),
+       session_id_(session_id),
+       params_(params),
+       video_effects_processor_(std::move(video_effects_processor)) {}
+@@ -258,14 +261,15 @@ void VideoCaptureManager::ApplySubCaptur
+ 
+ void VideoCaptureManager::QueueStartDevice(
+     const media::VideoCaptureSessionId& session_id,
+-    VideoCaptureController* controller,
++    scoped_refptr<VideoCaptureController> controller,
+     const media::VideoCaptureParams& params,
+     mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
+         video_effects_processor) {
+   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+   DCHECK(lock_time_.is_null());
+-  device_start_request_queue_.push_back(CaptureDeviceStartRequest(
+-      controller, session_id, params, std::move(video_effects_processor)));
++  device_start_request_queue_.push_back(
++      CaptureDeviceStartRequest(std::move(controller), session_id, params,
++                                std::move(video_effects_processor)));
+   if (device_start_request_queue_.size() == 1)
+     ProcessDeviceStartRequestQueue();
+ }
+@@ -311,7 +315,8 @@ void VideoCaptureManager::ProcessDeviceS
+   if (request == device_start_request_queue_.end())
+     return;
+ 
+-  VideoCaptureController* const controller = request->controller();
++  scoped_refptr<VideoCaptureController> const controller =
++      request->controller();
+ 
+   EmitLogMessage("VideoCaptureManager::ProcessDeviceStartRequestQueue", 3);
+   // The unit test VideoCaptureManagerTest.OpenNotExisting requires us to fail
+@@ -329,7 +334,7 @@ void VideoCaptureManager::ProcessDeviceS
+         GetDeviceInfoById(controller->device_id());
+     if (!device_info) {
+       OnDeviceLaunchFailed(
+-          controller,
++          controller.get(),
+           media::VideoCaptureError::
+               kVideoCaptureManagerProcessDeviceStartQueueDeviceInfoNotFound);
+       return;
+@@ -350,7 +355,7 @@ void VideoCaptureManager::ProcessDeviceS
+       base::BindOnce([](scoped_refptr<VideoCaptureManager>,
+                         scoped_refptr<VideoCaptureController>) {},
+                      scoped_refptr<VideoCaptureManager>(this),
+-                     GetControllerSharedRef(controller)),
++                     std::move(controller)),
+       request->TakeVideoEffectsProcessor());
+ }
+ 
+@@ -434,7 +439,7 @@ void VideoCaptureManager::ConnectClient(
+     EmitLogMessage(string_stream.str(), 1);
+   }
+ 
+-  VideoCaptureController* controller =
++  scoped_refptr<VideoCaptureController> controller =
+       GetOrCreateController(session_id, params);
+   if (!controller) {
+     std::move(done_cb).Run(nullptr);
+@@ -908,7 +913,8 @@ media::VideoCaptureDeviceInfo* VideoCapt
+   return nullptr;
+ }
+ 
+-VideoCaptureController* VideoCaptureManager::GetOrCreateController(
++scoped_refptr<VideoCaptureController>
++VideoCaptureManager::GetOrCreateController(
+     const media::VideoCaptureSessionId& capture_session_id,
+     const media::VideoCaptureParams& params) {
+   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+@@ -930,10 +936,12 @@ VideoCaptureController* VideoCaptureMana
+     return existing_device;
+   }
+ 
+-  VideoCaptureController* new_controller = new VideoCaptureController(
+-      device_info.id, device_info.type, params,
+-      video_capture_provider_->CreateDeviceLauncher(), emit_log_message_cb_);
+-  controllers_.emplace_back(new_controller);
++  scoped_refptr<VideoCaptureController> new_controller =
++      base::MakeRefCounted<VideoCaptureController>(
++          device_info.id, device_info.type, params,
++          video_capture_provider_->CreateDeviceLauncher(),
++          emit_log_message_cb_);
++  controllers_.push_back(new_controller);
+   return new_controller;
+ }
+ 
diff --git a/electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.h b/electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.h
new file mode 100644
index 0000000000..b013aa5bd2
--- /dev/null
+++ b/electron32/patches/patch-content_browser_renderer__host_media_video__capture__manager.h
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- content/browser/renderer_host/media/video_capture_manager.h.orig	2024-10-18 12:34:13.310953400 +0000
++++ content/browser/renderer_host/media/video_capture_manager.h
+@@ -297,7 +297,7 @@ class CONTENT_EXPORT VideoCaptureManager
+   // Finds a VideoCaptureController for the indicated |capture_session_id|,
+   // creating a fresh one if necessary. Returns nullptr if said
+   // |capture_session_id| is invalid.
+-  VideoCaptureController* GetOrCreateController(
++  scoped_refptr<VideoCaptureController> GetOrCreateController(
+       const media::VideoCaptureSessionId& capture_session_id,
+       const media::VideoCaptureParams& params);
+ 
+@@ -309,7 +309,7 @@ class CONTENT_EXPORT VideoCaptureManager
+   // another request pending start.
+   void QueueStartDevice(
+       const media::VideoCaptureSessionId& session_id,
+-      VideoCaptureController* controller,
++      scoped_refptr<VideoCaptureController> controller,
+       const media::VideoCaptureParams& params,
+       mojo::PendingRemote<video_effects::mojom::VideoEffectsProcessor>
+           video_effects_processor);
diff --git a/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.cc b/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.cc
index 47814a2089..6f6cf4a1ad 100644
--- a/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.cc
+++ b/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- content/common/gpu_pre_sandbox_hook_bsd.cc.orig	2025-01-19 14:12:04.011298787 +0000
+--- content/common/gpu_pre_sandbox_hook_bsd.cc.orig	2025-02-15 09:43:46.346242934 +0000
 +++ content/common/gpu_pre_sandbox_hook_bsd.cc
 @@ -0,0 +1,68 @@
 +// Copyright 2023 The Chromium Authors
diff --git a/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.h b/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.h
index 7b5dd40caf..aff057bf79 100644
--- a/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.h
+++ b/electron32/patches/patch-content_common_gpu__pre__sandbox__hook__bsd.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- content/common/gpu_pre_sandbox_hook_bsd.h.orig	2025-01-19 14:12:04.011405383 +0000
+--- content/common/gpu_pre_sandbox_hook_bsd.h.orig	2025-02-15 09:43:46.346375751 +0000
 +++ content/common/gpu_pre_sandbox_hook_bsd.h
 @@ -0,0 +1,20 @@
 +// Copyright 2017 The Chromium Authors
diff --git a/electron32/patches/patch-electron_BUILD.gn b/electron32/patches/patch-electron_BUILD.gn
index 43fd22df39..87f4da5aed 100644
--- a/electron32/patches/patch-electron_BUILD.gn
+++ b/electron32/patches/patch-electron_BUILD.gn
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/BUILD.gn.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/BUILD.gn.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/BUILD.gn
 @@ -524,7 +524,7 @@ source_set("electron_lib") {
      defines += [ "GDK_DISABLE_DEPRECATION_WARNINGS" ]
diff --git a/electron32/patches/patch-electron_build_args_all.gn b/electron32/patches/patch-electron_build_args_all.gn
index 89b5e20030..9be1dc1379 100644
--- a/electron32/patches/patch-electron_build_args_all.gn
+++ b/electron32/patches/patch-electron_build_args_all.gn
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/build/args/all.gn.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/build/args/all.gn.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/build/args/all.gn
 @@ -14,8 +14,8 @@ v8_enable_snapshot_native_code_counters 
  v8_enable_javascript_promise_hooks = true
diff --git a/electron32/patches/patch-electron_build_args_release.gn b/electron32/patches/patch-electron_build_args_release.gn
index dd21c72e51..b44e817da4 100644
--- a/electron32/patches/patch-electron_build_args_release.gn
+++ b/electron32/patches/patch-electron_build_args_release.gn
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/build/args/release.gn.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/build/args/release.gn.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/build/args/release.gn
 @@ -7,7 +7,7 @@ is_official_build = true
  # explicitly override here to build OpenH264 encoder/FFmpeg decoder.
diff --git a/electron32/patches/patch-electron_default__app_default__app.ts b/electron32/patches/patch-electron_default__app_default__app.ts
index fca65dbfaf..1036a72f19 100644
--- a/electron32/patches/patch-electron_default__app_default__app.ts
+++ b/electron32/patches/patch-electron_default__app_default__app.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/default_app/default_app.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/default_app/default_app.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/default_app/default_app.ts
 @@ -61,7 +61,8 @@ async function createWindow (backgroundC
      show: false
diff --git a/electron32/patches/patch-electron_filenames.gni b/electron32/patches/patch-electron_filenames.gni
index f34f56acb9..2e90dea5a9 100644
--- a/electron32/patches/patch-electron_filenames.gni
+++ b/electron32/patches/patch-electron_filenames.gni
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/filenames.gni.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/filenames.gni.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/filenames.gni
 @@ -243,8 +243,8 @@ filenames = {
      "shell/app/command_line_args.h",
diff --git a/electron32/patches/patch-electron_lib_browser_api_app.ts b/electron32/patches/patch-electron_lib_browser_api_app.ts
index 113a860a3a..529cb54c43 100644
--- a/electron32/patches/patch-electron_lib_browser_api_app.ts
+++ b/electron32/patches/patch-electron_lib_browser_api_app.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/browser/api/app.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/browser/api/app.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/browser/api/app.ts
 @@ -67,7 +67,8 @@ if (process.platform === 'darwin') {
    app.dock!.getMenu = () => dockMenu;
diff --git a/electron32/patches/patch-electron_lib_browser_api_dialog.ts b/electron32/patches/patch-electron_lib_browser_api_dialog.ts
index 1f1844335b..3c23ac5142 100644
--- a/electron32/patches/patch-electron_lib_browser_api_dialog.ts
+++ b/electron32/patches/patch-electron_lib_browser_api_dialog.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/browser/api/dialog.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/browser/api/dialog.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/browser/api/dialog.ts
 @@ -41,7 +41,8 @@ const normalizeAccessKey = (text: string
    // existing single underscores with a second underscore, replace double
diff --git a/electron32/patches/patch-electron_lib_browser_api_menu-item-roles.ts b/electron32/patches/patch-electron_lib_browser_api_menu-item-roles.ts
index 0a0d72226d..21f2e21ae7 100644
--- a/electron32/patches/patch-electron_lib_browser_api_menu-item-roles.ts
+++ b/electron32/patches/patch-electron_lib_browser_api_menu-item-roles.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/browser/api/menu-item-roles.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/browser/api/menu-item-roles.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/browser/api/menu-item-roles.ts
 @@ -2,7 +2,8 @@ import { app, BaseWindow, BrowserWindow,
  
diff --git a/electron32/patches/patch-electron_lib_browser_api_power-monitor.ts b/electron32/patches/patch-electron_lib_browser_api_power-monitor.ts
index 500365a52e..dd8566fb35 100644
--- a/electron32/patches/patch-electron_lib_browser_api_power-monitor.ts
+++ b/electron32/patches/patch-electron_lib_browser_api_power-monitor.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/browser/api/power-monitor.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/browser/api/power-monitor.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/browser/api/power-monitor.ts
 @@ -17,7 +17,8 @@ class PowerMonitor extends EventEmitter 
        const pm = createPowerMonitor();
diff --git a/electron32/patches/patch-electron_lib_browser_init.ts b/electron32/patches/patch-electron_lib_browser_init.ts
index eb688d2c1d..e803d8ccd6 100644
--- a/electron32/patches/patch-electron_lib_browser_init.ts
+++ b/electron32/patches/patch-electron_lib_browser_init.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/browser/init.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/browser/init.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/browser/init.ts
 @@ -162,7 +162,8 @@ const mainStartupScript = packageJson.ma
  const KNOWN_XDG_DESKTOP_VALUES = new Set(['Pantheon', 'Unity:Unity7', 'pop:GNOME']);
diff --git a/electron32/patches/patch-electron_lib_browser_rpc-server.ts b/electron32/patches/patch-electron_lib_browser_rpc-server.ts
index 941195df66..7734b48335 100644
--- a/electron32/patches/patch-electron_lib_browser_rpc-server.ts
+++ b/electron32/patches/patch-electron_lib_browser_rpc-server.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/browser/rpc-server.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/browser/rpc-server.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/browser/rpc-server.ts
 @@ -28,7 +28,7 @@ const allowedClipboardMethods = (() => {
    switch (process.platform) {
diff --git a/electron32/patches/patch-electron_lib_renderer_api_clipboard.ts b/electron32/patches/patch-electron_lib_renderer_api_clipboard.ts
index 8ec0c841f7..5c48e523c7 100644
--- a/electron32/patches/patch-electron_lib_renderer_api_clipboard.ts
+++ b/electron32/patches/patch-electron_lib_renderer_api_clipboard.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/lib/renderer/api/clipboard.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/lib/renderer/api/clipboard.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/lib/renderer/api/clipboard.ts
 @@ -7,7 +7,8 @@ const makeRemoteMethod = function (metho
    return (...args: any[]) => ipcRendererUtils.invokeSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, method, ...args);
diff --git a/electron32/patches/patch-electron_script_lib_config.py b/electron32/patches/patch-electron_script_lib_config.py
index 7288d94a20..b894a924ba 100644
--- a/electron32/patches/patch-electron_script_lib_config.py
+++ b/electron32/patches/patch-electron_script_lib_config.py
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/script/lib/config.py.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/script/lib/config.py.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/script/lib/config.py
 @@ -7,6 +7,11 @@ PLATFORM = {
    'cygwin': 'win32',
diff --git a/electron32/patches/patch-electron_script_lib_utils.js b/electron32/patches/patch-electron_script_lib_utils.js
index cb088cfd69..9f36106a20 100644
--- a/electron32/patches/patch-electron_script_lib_utils.js
+++ b/electron32/patches/patch-electron_script_lib_utils.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/script/lib/utils.js.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/script/lib/utils.js.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/script/lib/utils.js
 @@ -19,7 +19,7 @@ function getElectronExec () {
        return `out/${OUT_DIR}/Electron.app/Contents/MacOS/Electron`;
diff --git a/electron32/patches/patch-electron_script_spec-runner.js b/electron32/patches/patch-electron_script_spec-runner.js
index 4e0de81066..7dcee4e1ec 100644
--- a/electron32/patches/patch-electron_script_spec-runner.js
+++ b/electron32/patches/patch-electron_script_spec-runner.js
@@ -4,9 +4,9 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/script/spec-runner.js.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/script/spec-runner.js.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/script/spec-runner.js
-@@ -165,7 +165,8 @@ async function runTestUsingElectron (spe
+@@ -197,7 +197,8 @@ async function runTestUsingElectron (spe
      exe = path.resolve(BASE, utils.getElectronExec());
    }
    const runnerArgs = [`electron/${specDir}`, ...unknownArgs.slice(2)];
diff --git a/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.cc b/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
index d9e1fbbe1a..cbb45c1366 100644
--- a/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
+++ b/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/app/electron_crash_reporter_client.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/app/electron_crash_reporter_client.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/app/electron_crash_reporter_client.cc
 @@ -95,7 +95,7 @@ ElectronCrashReporterClient::ElectronCra
  
diff --git a/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.h b/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.h
index fe3afa240e..80a5f63e9a 100644
--- a/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.h
+++ b/electron32/patches/patch-electron_shell_app_electron__crash__reporter__client.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/app/electron_crash_reporter_client.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/app/electron_crash_reporter_client.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/app/electron_crash_reporter_client.h
 @@ -31,7 +31,7 @@ class ElectronCrashReporterClient : publ
        const std::map<std::string, std::string>& annotations);
diff --git a/electron32/patches/patch-electron_shell_app_electron__main__delegate.cc b/electron32/patches/patch-electron_shell_app_electron__main__delegate.cc
index c020c17472..4b9aa0a437 100644
--- a/electron32/patches/patch-electron_shell_app_electron__main__delegate.cc
+++ b/electron32/patches/patch-electron_shell_app_electron__main__delegate.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/app/electron_main_delegate.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/app/electron_main_delegate.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/app/electron_main_delegate.cc
 @@ -59,13 +59,13 @@
  #include "chrome/child/v8_crashpad_support_win.h"
diff --git a/electron32/patches/patch-electron_shell_app_node__main.cc b/electron32/patches/patch-electron_shell_app_node__main.cc
index a7c7cf6314..89891bea13 100644
--- a/electron32/patches/patch-electron_shell_app_node__main.cc
+++ b/electron32/patches/patch-electron_shell_app_node__main.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/app/node_main.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/app/node_main.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/app/node_main.cc
 @@ -48,7 +48,7 @@
  #include "shell/common/mac/codesign_util.h"
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__app.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__app.cc
index d3c75f7e32..0c6817b496 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__app.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__app.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_app.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_app.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_app.cc
 @@ -92,7 +92,7 @@
  #include "shell/browser/ui/cocoa/electron_bundle_mover.h"
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
index f8f79d7c00..1132f00640 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_base_window.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_base_window.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_base_window.cc
 @@ -40,7 +40,7 @@
  #include "shell/browser/ui/views/win_frame_view.h"
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.h b/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.h
index c60c890114..dc7f751d87 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.h
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__base__window.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_base_window.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_base_window.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_base_window.h
 @@ -241,7 +241,7 @@ class BaseWindow : public gin_helper::Tr
    void SetAppDetails(const gin_helper::Dictionary& options);
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
index 2b5cf450af..90df2c6c1d 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_crash_reporter.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_crash_reporter.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_crash_reporter.cc
 @@ -30,7 +30,7 @@
  #include "shell/common/process_util.h"
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
index 3c1743bfc9..63eb24383a 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_desktop_capturer.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_desktop_capturer.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_desktop_capturer.cc
 @@ -46,7 +46,7 @@
  #endif
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
index 601f75d01c..a8c5d1594f 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_power_monitor.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_power_monitor.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_power_monitor.cc
 @@ -118,6 +118,11 @@ void PowerMonitor::OnSpeedLimitChange(in
        gin::DataObjectBuilder(isolate).Set("limit", speed_limit).Build());
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h b/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
index 47b9e92c20..2ef3e79080 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_power_monitor.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_power_monitor.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_power_monitor.h
 @@ -40,7 +40,7 @@ class PowerMonitor final : public gin::W
    explicit PowerMonitor(v8::Isolate* isolate);
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
index d48f0d5a2b..256d9f56ce 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_safe_storage.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_safe_storage.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_safe_storage.cc
 @@ -20,7 +20,7 @@ const char* kEncryptionVersionPrefixV11 
  bool use_password_v10 = false;
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc b/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
index e0ec3659a1..c2b5469b7c 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_web_contents.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_web_contents.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_web_contents.cc
 @@ -153,11 +153,11 @@
  #include "ui/base/cocoa/defaults_utils.h"
diff --git a/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.h b/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
index faf303b9e7..16b9bac99d 100644
--- a/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
+++ b/electron32/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/electron_api_web_contents.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/electron_api_web_contents.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/electron_api_web_contents.h
 @@ -762,7 +762,7 @@ class WebContents final : public Exclusi
  #if defined(TOOLKIT_VIEWS) && !BUILDFLAG(IS_MAC)
diff --git a/electron32/patches/patch-electron_shell_browser_api_process__metric.h b/electron32/patches/patch-electron_shell_browser_api_process__metric.h
index 82f0b829fd..58d9111510 100644
--- a/electron32/patches/patch-electron_shell_browser_api_process__metric.h
+++ b/electron32/patches/patch-electron_shell_browser_api_process__metric.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/api/process_metric.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/api/process_metric.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/api/process_metric.h
 @@ -14,7 +14,7 @@
  
diff --git a/electron32/patches/patch-electron_shell_browser_browser.cc b/electron32/patches/patch-electron_shell_browser_browser.cc
index 4d7183c80c..81d2083149 100644
--- a/electron32/patches/patch-electron_shell_browser_browser.cc
+++ b/electron32/patches/patch-electron_shell_browser_browser.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/browser.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/browser.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/browser.cc
 @@ -66,7 +66,7 @@ Browser* Browser::Get() {
    return ElectronBrowserMainParts::Get()->browser();
diff --git a/electron32/patches/patch-electron_shell_browser_browser.h b/electron32/patches/patch-electron_shell_browser_browser.h
index 35ccf1a0aa..192a0aca6b 100644
--- a/electron32/patches/patch-electron_shell_browser_browser.h
+++ b/electron32/patches/patch-electron_shell_browser_browser.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/browser.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/browser.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/browser.h
 @@ -145,7 +145,7 @@ class Browser : private WindowListObserv
  
diff --git a/electron32/patches/patch-electron_shell_browser_browser__linux.cc b/electron32/patches/patch-electron_shell_browser_browser__linux.cc
index e223b85a58..8d7a98bf65 100644
--- a/electron32/patches/patch-electron_shell_browser_browser__linux.cc
+++ b/electron32/patches/patch-electron_shell_browser_browser__linux.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/browser_linux.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/browser_linux.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/browser_linux.cc
 @@ -19,7 +19,7 @@
  #include "shell/common/gin_converters/login_item_settings_converter.h"
diff --git a/electron32/patches/patch-electron_shell_browser_browser__process__impl.cc b/electron32/patches/patch-electron_shell_browser_browser__process__impl.cc
index f03857e89d..22a81353c8 100644
--- a/electron32/patches/patch-electron_shell_browser_browser__process__impl.cc
+++ b/electron32/patches/patch-electron_shell_browser_browser__process__impl.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/browser_process_impl.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/browser_process_impl.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/browser_process_impl.cc
 @@ -339,7 +339,7 @@ electron::ResolveProxyHelper* BrowserPro
    return resolve_proxy_helper_.get();
diff --git a/electron32/patches/patch-electron_shell_browser_browser__process__impl.h b/electron32/patches/patch-electron_shell_browser_browser__process__impl.h
index bfe2267710..f81a01dc24 100644
--- a/electron32/patches/patch-electron_shell_browser_browser__process__impl.h
+++ b/electron32/patches/patch-electron_shell_browser_browser__process__impl.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/browser_process_impl.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/browser_process_impl.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/browser_process_impl.h
 @@ -23,7 +23,7 @@
  #include "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.cc b/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
index cb07e594c4..a7ecbb97ce 100644
--- a/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
+++ b/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/electron_browser_main_parts.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/electron_browser_main_parts.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/electron_browser_main_parts.cc
 @@ -78,7 +78,7 @@
  #include "ui/wm/core/wm_state.h"
diff --git a/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.h b/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.h
index f5533f401f..45471461fa 100644
--- a/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.h
+++ b/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/electron_browser_main_parts.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/electron_browser_main_parts.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/electron_browser_main_parts.h
 @@ -119,7 +119,7 @@ class ElectronBrowserMainParts : public 
        const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
diff --git a/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc b/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
index 362517fcdc..4e3ea9ecdb 100644
--- a/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
+++ b/electron32/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/electron_browser_main_parts_posix.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/electron_browser_main_parts_posix.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/electron_browser_main_parts_posix.cc
 @@ -210,6 +210,9 @@ void ElectronBrowserMainParts::InstallSh
    g_pipe_pid = getpid();
diff --git a/electron32/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc b/electron32/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
index de31b86b6e..b7bccebbd4 100644
--- a/electron32/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
+++ b/electron32/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc
 @@ -55,6 +55,10 @@ bool ElectronRuntimeAPIDelegate::GetPlat
      info->os = extensions::api::runtime::PlatformOs::kLinux;
diff --git a/electron32/patches/patch-electron_shell_browser_native__window.cc b/electron32/patches/patch-electron_shell_browser_native__window.cc
index c5bfb145ec..bc06e35a29 100644
--- a/electron32/patches/patch-electron_shell_browser_native__window.cc
+++ b/electron32/patches/patch-electron_shell_browser_native__window.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/native_window.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/native_window.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/native_window.cc
 @@ -203,7 +203,7 @@ void NativeWindow::InitFromOptions(const
    } else {
diff --git a/electron32/patches/patch-electron_shell_browser_native__window__views.cc b/electron32/patches/patch-electron_shell_browser_native__window__views.cc
index d92db11acb..e49f9d98bf 100644
--- a/electron32/patches/patch-electron_shell_browser_native__window__views.cc
+++ b/electron32/patches/patch-electron_shell_browser_native__window__views.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/native_window_views.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/native_window_views.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/native_window_views.cc
 @@ -53,7 +53,7 @@
  #include "ui/wm/core/shadow_types.h"
diff --git a/electron32/patches/patch-electron_shell_browser_native__window__views.h b/electron32/patches/patch-electron_shell_browser_native__window__views.h
index dbb12cead0..6ae49896e0 100644
--- a/electron32/patches/patch-electron_shell_browser_native__window__views.h
+++ b/electron32/patches/patch-electron_shell_browser_native__window__views.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/native_window_views.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/native_window_views.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/native_window_views.h
 @@ -25,7 +25,7 @@
  
diff --git a/electron32/patches/patch-electron_shell_browser_net_system__network__context__manager.cc b/electron32/patches/patch-electron_shell_browser_net_system__network__context__manager.cc
index 1502445869..d9beea0f7d 100644
--- a/electron32/patches/patch-electron_shell_browser_net_system__network__context__manager.cc
+++ b/electron32/patches/patch-electron_shell_browser_net_system__network__context__manager.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/net/system_network_context_manager.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/net/system_network_context_manager.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/net/system_network_context_manager.cc
 @@ -42,7 +42,7 @@
  #include "shell/common/options_switches.h"
diff --git a/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc b/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
index 37ce691580..c0a602785f 100644
--- a/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
+++ b/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/osr/osr_host_display_client.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/osr/osr_host_display_client.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/osr/osr_host_display_client.cc
 @@ -96,7 +96,7 @@ void OffScreenHostDisplayClient::CreateL
    layered_window_updater_->SetActive(active_);
diff --git a/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.h b/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
index 033ec36d6b..8b78014781 100644
--- a/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
+++ b/electron32/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/osr/osr_host_display_client.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/osr/osr_host_display_client.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/osr/osr_host_display_client.h
 @@ -72,7 +72,7 @@ class OffScreenHostDisplayClient : publi
        mojo::PendingReceiver<viz::mojom::LayeredWindowUpdater> receiver)
diff --git a/electron32/patches/patch-electron_shell_browser_printing_printing__utils.cc b/electron32/patches/patch-electron_shell_browser_printing_printing__utils.cc
index 93c9a436f2..24df7f3486 100644
--- a/electron32/patches/patch-electron_shell_browser_printing_printing__utils.cc
+++ b/electron32/patches/patch-electron_shell_browser_printing_printing__utils.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/printing/printing_utils.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/printing/printing_utils.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/printing/printing_utils.cc
 @@ -28,7 +28,7 @@
  #include <ApplicationServices/ApplicationServices.h>
diff --git a/electron32/patches/patch-electron_shell_browser_relauncher__linux.cc b/electron32/patches/patch-electron_shell_browser_relauncher__linux.cc
index fb84c1247d..28cd32c744 100644
--- a/electron32/patches/patch-electron_shell_browser_relauncher__linux.cc
+++ b/electron32/patches/patch-electron_shell_browser_relauncher__linux.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/relauncher_linux.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/relauncher_linux.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/relauncher_linux.cc
 @@ -6,8 +6,10 @@
  
diff --git a/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc b/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
index 5b51c6f573..70ffca1650 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
+++ b/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/inspectable_web_contents.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/inspectable_web_contents.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/inspectable_web_contents.cc
 @@ -557,7 +557,7 @@ void InspectableWebContents::LoadComplet
            prefs.FindString("currentDockState");
diff --git a/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h b/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
index 4fcfa0d5b4..247daeea1d 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
+++ b/electron32/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/inspectable_web_contents_view_delegate.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/inspectable_web_contents_view_delegate.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/inspectable_web_contents_view_delegate.h
 @@ -24,7 +24,7 @@ class InspectableWebContentsViewDelegate
    // Returns the icon of devtools window.
diff --git a/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc b/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
index 4926468fc9..026bb6a461 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
+++ b/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/views/electron_views_delegate.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/views/electron_views_delegate.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/views/electron_views_delegate.cc
 @@ -9,7 +9,7 @@
  #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
diff --git a/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h b/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
index be1843ed54..c89c45ebd5 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
+++ b/electron32/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/views/electron_views_delegate.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/views/electron_views_delegate.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/views/electron_views_delegate.h
 @@ -44,7 +44,7 @@ class ViewsDelegate : public views::View
    HICON GetSmallWindowIcon() const override;
diff --git a/electron32/patches/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc b/electron32/patches/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc
index 6769ea6c2a..d231dccdd5 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc
+++ b/electron32/patches/patch-electron_shell_browser_ui_views_inspectable__web__contents__view__views.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/views/inspectable_web_contents_view_views.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/views/inspectable_web_contents_view_views.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/views/inspectable_web_contents_view_views.cc
 @@ -184,7 +184,7 @@ void InspectableWebContentsViewViews::Se
      params.delegate = devtools_window_delegate_;
diff --git a/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.cc b/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
index caa43e2106..4651ed09d4 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
+++ b/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/views/menu_bar.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/views/menu_bar.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/views/menu_bar.cc
 @@ -13,7 +13,7 @@
  #include "ui/views/background.h"
diff --git a/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.h b/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.h
index bbeed7b1b0..27ed8fb964 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.h
+++ b/electron32/patches/patch-electron_shell_browser_ui_views_menu__bar.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/views/menu_bar.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/views/menu_bar.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/views/menu_bar.h
 @@ -84,7 +84,7 @@ class MenuBar : public views::Accessible
    View* FindAccelChild(char16_t key);
diff --git a/electron32/patches/patch-electron_shell_browser_ui_views_submenu__button.cc b/electron32/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
index 7b91026377..c4c9ebfe2f 100644
--- a/electron32/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
+++ b/electron32/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/browser/ui/views/submenu_button.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/browser/ui/views/submenu_button.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/browser/ui/views/submenu_button.cc
 @@ -22,7 +22,7 @@ SubmenuButton::SubmenuButton(PressedCall
                               const SkColor& background_color)
diff --git a/electron32/patches/patch-electron_shell_common_api_electron__api__clipboard.cc b/electron32/patches/patch-electron_shell_common_api_electron__api__clipboard.cc
index 812350d867..e8729dacc6 100644
--- a/electron32/patches/patch-electron_shell_common_api_electron__api__clipboard.cc
+++ b/electron32/patches/patch-electron_shell_common_api_electron__api__clipboard.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/api/electron_api_clipboard.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/api/electron_api_clipboard.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/api/electron_api_clipboard.cc
 @@ -59,7 +59,7 @@ std::string Clipboard::Read(const std::s
        ui::ClipboardFormatType::CustomPlatformType(format_string));
diff --git a/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.cc b/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.cc
index f91ae586f4..4f7e6279ef 100644
--- a/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.cc
+++ b/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/api/electron_api_native_image.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/api/electron_api_native_image.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/api/electron_api_native_image.cc
 @@ -640,7 +640,7 @@ void Initialize(v8::Local<v8::Object> ex
    native_image.SetMethod("createFromDataURL", &NativeImage::CreateFromDataURL);
diff --git a/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.h b/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.h
index 0980cceb25..2fd7d58264 100644
--- a/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.h
+++ b/electron32/patches/patch-electron_shell_common_api_electron__api__native__image.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/api/electron_api_native_image.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/api/electron_api_native_image.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/api/electron_api_native_image.h
 @@ -78,7 +78,7 @@ class NativeImage final : public gin::Wr
                                                      const GURL& url);
diff --git a/electron32/patches/patch-electron_shell_common_api_electron__bindings.cc b/electron32/patches/patch-electron_shell_common_api_electron__bindings.cc
index 5be8c5d2b3..f3de3dd6a8 100644
--- a/electron32/patches/patch-electron_shell_common_api_electron__bindings.cc
+++ b/electron32/patches/patch-electron_shell_common_api_electron__bindings.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/api/electron_bindings.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/api/electron_bindings.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/api/electron_bindings.cc
 @@ -253,7 +253,7 @@ void ElectronBindings::DidReceiveMemoryD
      if (target_pid == dump.pid()) {
diff --git a/electron32/patches/patch-electron_shell_common_electron__command__line.cc b/electron32/patches/patch-electron_shell_common_electron__command__line.cc
index 535f5dbfc3..f8350620e7 100644
--- a/electron32/patches/patch-electron_shell_common_electron__command__line.cc
+++ b/electron32/patches/patch-electron_shell_common_electron__command__line.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/electron_command_line.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/electron_command_line.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/electron_command_line.cc
 @@ -26,7 +26,7 @@ void ElectronCommandLine::Init(int argc,
    argv_.assign(argv, argv + argc);
diff --git a/electron32/patches/patch-electron_shell_common_electron__command__line.h b/electron32/patches/patch-electron_shell_common_electron__command__line.h
index e42f3d99a0..d0fe560604 100644
--- a/electron32/patches/patch-electron_shell_common_electron__command__line.h
+++ b/electron32/patches/patch-electron_shell_common_electron__command__line.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/electron_command_line.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/electron_command_line.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/electron_command_line.h
 @@ -22,7 +22,7 @@ class ElectronCommandLine {
  
diff --git a/electron32/patches/patch-electron_shell_common_electron__paths.h b/electron32/patches/patch-electron_shell_common_electron__paths.h
index 271d2c6517..69f793a0bf 100644
--- a/electron32/patches/patch-electron_shell_common_electron__paths.h
+++ b/electron32/patches/patch-electron_shell_common_electron__paths.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/electron_paths.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/electron_paths.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/electron_paths.h
 @@ -30,7 +30,7 @@ enum {
    DIR_RECENT,  // Directory where recent files live
diff --git a/electron32/patches/patch-electron_shell_common_gin__converters_std__converter.h b/electron32/patches/patch-electron_shell_common_gin__converters_std__converter.h
index 13032488b4..7515346612 100644
--- a/electron32/patches/patch-electron_shell_common_gin__converters_std__converter.h
+++ b/electron32/patches/patch-electron_shell_common_gin__converters_std__converter.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/gin_converters/std_converter.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/gin_converters/std_converter.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/gin_converters/std_converter.h
 @@ -28,7 +28,7 @@ v8::Local<v8::Value> ConvertToV8(v8::Iso
        isolate, std::forward<T>(input));
diff --git a/electron32/patches/patch-electron_shell_common_node__bindings.cc b/electron32/patches/patch-electron_shell_common_node__bindings.cc
index 02e278f8ed..96f01a7aa1 100644
--- a/electron32/patches/patch-electron_shell_common_node__bindings.cc
+++ b/electron32/patches/patch-electron_shell_common_node__bindings.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/node_bindings.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/node_bindings.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/node_bindings.cc
 @@ -43,7 +43,7 @@
  #include "third_party/electron_node/src/debug_utils.h"
diff --git a/electron32/patches/patch-electron_shell_common_node__bindings__linux.cc b/electron32/patches/patch-electron_shell_common_node__bindings__linux.cc
index 4926c11c96..1c8ae14c89 100644
--- a/electron32/patches/patch-electron_shell_common_node__bindings__linux.cc
+++ b/electron32/patches/patch-electron_shell_common_node__bindings__linux.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/node_bindings_linux.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/node_bindings_linux.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/node_bindings_linux.cc
 @@ -4,12 +4,25 @@
  
diff --git a/electron32/patches/patch-electron_shell_common_platform__util.h b/electron32/patches/patch-electron_shell_common_platform__util.h
index ffa7463aa8..0d0bd830ae 100644
--- a/electron32/patches/patch-electron_shell_common_platform__util.h
+++ b/electron32/patches/patch-electron_shell_common_platform__util.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/common/platform_util.h.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/common/platform_util.h.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/common/platform_util.h
 @@ -56,7 +56,7 @@ bool SetLoginItemEnabled(const std::stri
                           bool enabled);
diff --git a/electron32/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc b/electron32/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
index 0f380dae0a..5f4a99503b 100644
--- a/electron32/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
+++ b/electron32/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc
 @@ -6,7 +6,7 @@
  #include "shell/common/gin_helper/dictionary.h"
diff --git a/electron32/patches/patch-electron_spec_api-app-spec.ts b/electron32/patches/patch-electron_spec_api-app-spec.ts
index 9aade65198..548d986fa0 100644
--- a/electron32/patches/patch-electron_spec_api-app-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-app-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-app-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-app-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-app-spec.ts
 @@ -126,11 +126,13 @@ describe('app module', () => {
    });
diff --git a/electron32/patches/patch-electron_spec_api-browser-window-spec.ts b/electron32/patches/patch-electron_spec_api-browser-window-spec.ts
index 795646927f..e7f272b681 100644
--- a/electron32/patches/patch-electron_spec_api-browser-window-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-browser-window-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-browser-window-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-browser-window-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-browser-window-spec.ts
 @@ -67,7 +67,8 @@ describe('BrowserWindow module', () => {
        }).not.to.throw();
@@ -16,7 +16,7 @@ $NetBSD$
        const appPath = path.join(fixtures, 'apps', 'xwindow-icon');
        const appProcess = childProcess.spawn(process.execPath, [appPath]);
        await once(appProcess, 'exit');
-@@ -1123,7 +1124,8 @@ describe('BrowserWindow module', () => {
+@@ -1126,7 +1127,8 @@ describe('BrowserWindow module', () => {
  
      describe('BrowserWindow.minimize()', () => {
        // TODO(codebytere): Enable for Linux once maximize/minimize events work in CI.
@@ -26,7 +26,7 @@ $NetBSD$
          const minimize = once(w, 'minimize');
          w.minimize();
          await minimize;
-@@ -1140,7 +1142,8 @@ describe('BrowserWindow module', () => {
+@@ -1143,7 +1145,8 @@ describe('BrowserWindow module', () => {
        });
  
        // TODO(dsanders11): Enable for Linux once CI plays nice with these kinds of tests
@@ -36,7 +36,7 @@ $NetBSD$
          const maximize = once(w, 'maximize');
          const shown = once(w, 'show');
          w.maximize();
-@@ -1205,7 +1208,8 @@ describe('BrowserWindow module', () => {
+@@ -1208,7 +1211,8 @@ describe('BrowserWindow module', () => {
          expect(w.isFocused()).to.equal(true);
        });
  
@@ -46,7 +46,7 @@ $NetBSD$
          const w1 = new BrowserWindow({ show: false });
          const w2 = new BrowserWindow({ show: false });
          const w3 = new BrowserWindow({ show: false });
-@@ -1306,7 +1310,8 @@ describe('BrowserWindow module', () => {
+@@ -1309,7 +1313,8 @@ describe('BrowserWindow module', () => {
          expect(w.isFocused()).to.equal(false);
        });
  
@@ -56,7 +56,7 @@ $NetBSD$
          const w1 = new BrowserWindow({ show: false });
          const w2 = new BrowserWindow({ show: false });
          const w3 = new BrowserWindow({ show: false });
-@@ -1765,7 +1770,8 @@ describe('BrowserWindow module', () => {
+@@ -1768,7 +1773,8 @@ describe('BrowserWindow module', () => {
          });
        });
  
@@ -66,7 +66,7 @@ $NetBSD$
          it('checks normal bounds when maximized', async () => {
            const bounds = w.getBounds();
            const maximize = once(w, 'maximize');
-@@ -1975,7 +1981,8 @@ describe('BrowserWindow module', () => {
+@@ -1978,7 +1984,8 @@ describe('BrowserWindow module', () => {
          });
        });
  
@@ -76,7 +76,7 @@ $NetBSD$
          it('checks normal bounds when minimized', async () => {
            const bounds = w.getBounds();
            const minimize = once(w, 'minimize');
-@@ -2938,7 +2945,8 @@ describe('BrowserWindow module', () => {
+@@ -2941,7 +2948,8 @@ describe('BrowserWindow module', () => {
    describe('BrowserWindow.setOpacity(opacity)', () => {
      afterEach(closeAllWindows);
  
@@ -86,7 +86,7 @@ $NetBSD$
        it('make window with initial opacity', () => {
          const w = new BrowserWindow({ show: false, opacity: 0.5 });
          expect(w.getOpacity()).to.equal(0.5);
-@@ -2964,7 +2972,8 @@ describe('BrowserWindow module', () => {
+@@ -2967,7 +2975,8 @@ describe('BrowserWindow module', () => {
        });
      });
  
@@ -96,7 +96,7 @@ $NetBSD$
        it('sets 1 regardless of parameter', () => {
          const w = new BrowserWindow({ show: false });
          w.setOpacity(0);
-@@ -3175,7 +3184,8 @@ describe('BrowserWindow module', () => {
+@@ -3178,7 +3187,8 @@ describe('BrowserWindow module', () => {
        expect(overlayRectPreMax.height).to.equal(size);
  
        // 'maximize' event is not emitted on Linux in CI.
@@ -106,7 +106,7 @@ $NetBSD$
          const maximize = once(w, 'maximize');
          w.show();
          w.maximize();
-@@ -3241,7 +3251,8 @@ describe('BrowserWindow module', () => {
+@@ -3244,7 +3254,8 @@ describe('BrowserWindow module', () => {
          expect(preMaxHeight).to.equal(size);
  
          // 'maximize' event is not emitted on Linux in CI.
@@ -116,7 +116,7 @@ $NetBSD$
            const maximize = once(w, 'maximize');
            w.show();
            w.maximize();
-@@ -3906,7 +3917,8 @@ describe('BrowserWindow module', () => {
+@@ -3909,7 +3920,8 @@ describe('BrowserWindow module', () => {
          expect(test.nodeTimers).to.equal(true);
          expect(test.nodeUrl).to.equal(true);
  
@@ -126,7 +126,7 @@ $NetBSD$
            expect(test.creationTime).to.be.null('creation time');
            expect(test.systemMemoryInfo).to.be.null('system memory info');
          } else {
-@@ -4411,7 +4423,8 @@ describe('BrowserWindow module', () => {
+@@ -4414,7 +4426,8 @@ describe('BrowserWindow module', () => {
      });
    });
  
@@ -136,7 +136,7 @@ $NetBSD$
      afterEach(closeAllWindows);
      it('emits an event when window is maximized', async () => {
        const w = new BrowserWindow({ show: false });
-@@ -4682,7 +4695,8 @@ describe('BrowserWindow module', () => {
+@@ -4685,7 +4698,8 @@ describe('BrowserWindow module', () => {
      // TODO(zcbenz):
      // This test does not run on Linux CI. See:
      // https://github.com/electron/electron/issues/28699
@@ -146,7 +146,7 @@ $NetBSD$
        const w = new BrowserWindow({});
        const maximize = once(w, 'maximize');
        w.maximize();
-@@ -4699,7 +4713,8 @@ describe('BrowserWindow module', () => {
+@@ -4702,7 +4716,8 @@ describe('BrowserWindow module', () => {
    });
  
    // TODO(dsanders11): Enable once maximize event works on Linux again on CI
@@ -156,7 +156,7 @@ $NetBSD$
      afterEach(closeAllWindows);
      it('should show the window if it is not currently shown', async () => {
        const w = new BrowserWindow({ show: false });
-@@ -4736,7 +4751,8 @@ describe('BrowserWindow module', () => {
+@@ -4739,7 +4754,8 @@ describe('BrowserWindow module', () => {
  
      // TODO(dsanders11): Enable once minimize event works on Linux again.
      //                   See https://github.com/electron/electron/issues/28699
@@ -166,7 +166,7 @@ $NetBSD$
        const w = new BrowserWindow();
        const minimize = once(w, 'minimize');
        w.minimize();
-@@ -5210,7 +5226,8 @@ describe('BrowserWindow module', () => {
+@@ -5213,7 +5229,8 @@ describe('BrowserWindow module', () => {
        });
  
        // On Linux there is no "resizable" property of a window.
@@ -176,7 +176,7 @@ $NetBSD$
          const w = new BrowserWindow({ show: false });
          expect(w.resizable).to.be.true('resizable');
  
-@@ -5349,7 +5366,8 @@ describe('BrowserWindow module', () => {
+@@ -5352,7 +5369,8 @@ describe('BrowserWindow module', () => {
      });
    });
  
@@ -186,7 +186,7 @@ $NetBSD$
      // Not implemented on Linux.
      afterEach(closeAllWindows);
  
-@@ -6516,7 +6534,8 @@ describe('BrowserWindow module', () => {
+@@ -6519,7 +6537,8 @@ describe('BrowserWindow module', () => {
    describe('"transparent" option', () => {
      afterEach(closeAllWindows);
  
diff --git a/electron32/patches/patch-electron_spec_api-clipboard-spec.ts b/electron32/patches/patch-electron_spec_api-clipboard-spec.ts
index 86e45f6fcd..f56ee3c474 100644
--- a/electron32/patches/patch-electron_spec_api-clipboard-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-clipboard-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-clipboard-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-clipboard-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-clipboard-spec.ts
 @@ -54,7 +54,8 @@ ifdescribe(process.platform !== 'win32' 
      });
diff --git a/electron32/patches/patch-electron_spec_api-content-tracing-spec.ts b/electron32/patches/patch-electron_spec_api-content-tracing-spec.ts
index 7d07292e9c..57e5e3e1b6 100644
--- a/electron32/patches/patch-electron_spec_api-content-tracing-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-content-tracing-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-content-tracing-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-content-tracing-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-content-tracing-spec.ts
 @@ -9,7 +9,8 @@ import { setTimeout } from 'node:timers/
  import { ifdescribe } from './lib/spec-helpers';
diff --git a/electron32/patches/patch-electron_spec_api-crash-reporter-spec.ts b/electron32/patches/patch-electron_spec_api-crash-reporter-spec.ts
index 6b199250d6..f36de54cab 100644
--- a/electron32/patches/patch-electron_spec_api-crash-reporter-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-crash-reporter-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-crash-reporter-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-crash-reporter-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-crash-reporter-spec.ts
 @@ -14,7 +14,8 @@ import { setTimeout } from 'node:timers/
  import { ifdescribe, ifit, defer, startRemoteControlApp, repeatedly, listen } from './lib/spec-helpers';
diff --git a/electron32/patches/patch-electron_spec_api-desktop-capturer-spec.ts b/electron32/patches/patch-electron_spec_api-desktop-capturer-spec.ts
index 651c26a580..7bec94637a 100644
--- a/electron32/patches/patch-electron_spec_api-desktop-capturer-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-desktop-capturer-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-desktop-capturer-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-desktop-capturer-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-desktop-capturer-spec.ts
 @@ -45,7 +45,8 @@ ifdescribe(!process.arch.includes('arm')
    });
diff --git a/electron32/patches/patch-electron_spec_api-menu-spec.ts b/electron32/patches/patch-electron_spec_api-menu-spec.ts
index a5d4079308..6af6a17b77 100644
--- a/electron32/patches/patch-electron_spec_api-menu-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-menu-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-menu-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-menu-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-menu-spec.ts
 @@ -890,7 +890,8 @@ describe('Menu module', function () {
      // https://github.com/electron/electron/issues/35724
diff --git a/electron32/patches/patch-electron_spec_api-native-image-spec.ts b/electron32/patches/patch-electron_spec_api-native-image-spec.ts
index 7dc1a700f6..4b965d343d 100644
--- a/electron32/patches/patch-electron_spec_api-native-image-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-native-image-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-native-image-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-native-image-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-native-image-spec.ts
 @@ -428,7 +428,8 @@ describe('nativeImage module', () => {
      });
diff --git a/electron32/patches/patch-electron_spec_api-net-log-spec.ts b/electron32/patches/patch-electron_spec_api-net-log-spec.ts
index d888acfac9..b60a348449 100644
--- a/electron32/patches/patch-electron_spec_api-net-log-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-net-log-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-net-log-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-net-log-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-net-log-spec.ts
 @@ -121,7 +121,8 @@ describe('netLog module', () => {
      expect(JSON.parse(dump).events.some((x: any) => x.params && x.params.bytes && Buffer.from(x.params.bytes, 'base64').includes(unique))).to.be.true('uuid present in dump');
diff --git a/electron32/patches/patch-electron_spec_api-notification-dbus-spec.ts b/electron32/patches/patch-electron_spec_api-notification-dbus-spec.ts
index 90886250f8..7db01e784f 100644
--- a/electron32/patches/patch-electron_spec_api-notification-dbus-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-notification-dbus-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-notification-dbus-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-notification-dbus-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-notification-dbus-spec.ts
 @@ -19,7 +19,8 @@ import { ifdescribe } from './lib/spec-h
  
diff --git a/electron32/patches/patch-electron_spec_api-power-monitor-spec.ts b/electron32/patches/patch-electron_spec_api-power-monitor-spec.ts
index 872e6e4d63..b4c8cab13b 100644
--- a/electron32/patches/patch-electron_spec_api-power-monitor-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-power-monitor-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-power-monitor-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-power-monitor-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-power-monitor-spec.ts
 @@ -18,7 +18,8 @@ import { ifdescribe, startRemoteControlA
  describe('powerMonitor', () => {
diff --git a/electron32/patches/patch-electron_spec_api-process-spec.ts b/electron32/patches/patch-electron_spec_api-process-spec.ts
index 6d309e88c5..dd5043c5de 100644
--- a/electron32/patches/patch-electron_spec_api-process-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-process-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-process-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-process-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-process-spec.ts
 @@ -46,7 +46,8 @@ describe('process module', () => {
        it('resolves promise successfully with valid data', async () => {
diff --git a/electron32/patches/patch-electron_spec_api-protocol-spec.ts b/electron32/patches/patch-electron_spec_api-protocol-spec.ts
index d8328b063a..e084428506 100644
--- a/electron32/patches/patch-electron_spec_api-protocol-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-protocol-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-protocol-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-protocol-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-protocol-spec.ts
 @@ -1738,7 +1738,8 @@ describe('protocol module', () => {
  
diff --git a/electron32/patches/patch-electron_spec_api-safe-storage-spec.ts b/electron32/patches/patch-electron_spec_api-safe-storage-spec.ts
index 582de98d22..959017b593 100644
--- a/electron32/patches/patch-electron_spec_api-safe-storage-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-safe-storage-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-safe-storage-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-safe-storage-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-safe-storage-spec.ts
 @@ -29,7 +29,8 @@ describe('safeStorage module', () => {
  
diff --git a/electron32/patches/patch-electron_spec_api-screen-spec.ts b/electron32/patches/patch-electron_spec_api-screen-spec.ts
index e148d35be7..b3572a2c44 100644
--- a/electron32/patches/patch-electron_spec_api-screen-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-screen-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-screen-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-screen-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-screen-spec.ts
 @@ -95,7 +95,8 @@ describe('screen module', () => {
  
diff --git a/electron32/patches/patch-electron_spec_api-shell-spec.ts b/electron32/patches/patch-electron_spec_api-shell-spec.ts
index e1877f429b..9ab07b62f1 100644
--- a/electron32/patches/patch-electron_spec_api-shell-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-shell-spec.ts
@@ -4,9 +4,9 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-shell-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-shell-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-shell-spec.ts
-@@ -26,7 +26,8 @@ describe('shell module', () => {
+@@ -37,7 +37,8 @@ describe('shell module', () => {
  
      afterEach(async () => {
        // reset env vars to prevent side effects
@@ -16,7 +16,7 @@ $NetBSD$
          process.env.DE = envVars.de;
          process.env.BROWSER = envVars.browser;
          process.env.DISPLAY = envVars.display;
-@@ -42,6 +43,11 @@ describe('shell module', () => {
+@@ -57,6 +58,11 @@ describe('shell module', () => {
          process.env.DE = 'generic';
          process.env.DISPLAY = '';
          requestReceived = Promise.resolve();
diff --git a/electron32/patches/patch-electron_spec_api-subframe-spec.ts b/electron32/patches/patch-electron_spec_api-subframe-spec.ts
index 8df5b9c369..b4e95c6269 100644
--- a/electron32/patches/patch-electron_spec_api-subframe-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-subframe-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-subframe-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-subframe-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-subframe-spec.ts
 @@ -218,7 +218,8 @@ describe('renderer nodeIntegrationInSubF
  });
diff --git a/electron32/patches/patch-electron_spec_api-tray-spec.ts b/electron32/patches/patch-electron_spec_api-tray-spec.ts
index 5f2b280d82..f59a918dde 100644
--- a/electron32/patches/patch-electron_spec_api-tray-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-tray-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-tray-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-tray-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-tray-spec.ts
 @@ -131,7 +131,8 @@ describe('tray module', () => {
    describe('tray.getBounds()', () => {
diff --git a/electron32/patches/patch-electron_spec_api-utility-process-spec.ts b/electron32/patches/patch-electron_spec_api-utility-process-spec.ts
index 7babc62620..5e8b3571e9 100644
--- a/electron32/patches/patch-electron_spec_api-utility-process-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-utility-process-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-utility-process-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-utility-process-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-utility-process-spec.ts
 @@ -438,7 +438,8 @@ describe('utilityProcess module', () => 
        expect(output).to.include(result);
diff --git a/electron32/patches/patch-electron_spec_api-web-frame-main-spec.ts b/electron32/patches/patch-electron_spec_api-web-frame-main-spec.ts
index 7b2631df40..74b773799e 100644
--- a/electron32/patches/patch-electron_spec_api-web-frame-main-spec.ts
+++ b/electron32/patches/patch-electron_spec_api-web-frame-main-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/api-web-frame-main-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/api-web-frame-main-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/api-web-frame-main-spec.ts
 @@ -292,7 +292,8 @@ describe('webFrameMain module', () => {
      });
diff --git a/electron32/patches/patch-electron_spec_chromium-spec.ts b/electron32/patches/patch-electron_spec_chromium-spec.ts
index b41213da8a..049dfa8fc1 100644
--- a/electron32/patches/patch-electron_spec_chromium-spec.ts
+++ b/electron32/patches/patch-electron_spec_chromium-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/chromium-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/chromium-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/chromium-spec.ts
 @@ -474,13 +474,17 @@ describe('command line switches', () => 
      it('should not set an invalid locale', async () => testLocale('asdfkl', `${currentLocale}|${currentSystemLocale}|${currentPreferredLanguages}`));
@@ -38,7 +38,7 @@ $NetBSD$
        const rc = await startRemoteControlApp(['--trace-startup=*', `--trace-startup-file=${outputFilePath}`, '--trace-startup-duration=1', '--enable-logging']);
        const stderrComplete = new Promise<string>(resolve => {
          let stderr = '';
-@@ -2917,12 +2922,13 @@ describe('font fallback', () => {
+@@ -2924,12 +2929,13 @@ describe('font fallback', () => {
        expect(fonts[0].familyName).to.equal('Arial');
      } else if (process.platform === 'darwin') {
        expect(fonts[0].familyName).to.equal('Helvetica');
@@ -54,7 +54,7 @@ $NetBSD$
      const html = `
      <html lang="ja-JP">
        <head>
-@@ -3318,7 +3324,8 @@ describe('navigator.clipboard.write', ()
+@@ -3326,7 +3332,8 @@ describe('navigator.clipboard.write', ()
    });
  });
  
diff --git a/electron32/patches/patch-electron_spec_crash-spec.ts b/electron32/patches/patch-electron_spec_crash-spec.ts
index 2ba38ef7ec..c94e2b2d7b 100644
--- a/electron32/patches/patch-electron_spec_crash-spec.ts
+++ b/electron32/patches/patch-electron_spec_crash-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/crash-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/crash-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/crash-spec.ts
 @@ -47,7 +47,8 @@ const shouldRunCase = (crashCase: string
        if (process.platform === 'win32') {
diff --git a/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js b/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
index eef16edb84..84b3175bb7 100644
--- a/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
+++ b/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/fixtures/api/safe-storage/decrypt-app/main.js.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/fixtures/api/safe-storage/decrypt-app/main.js.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/fixtures/api/safe-storage/decrypt-app/main.js
 @@ -7,7 +7,8 @@ const pathToEncryptedString = path.resol
  const readFile = fs.readFile;
diff --git a/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js b/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
index ac36a50620..155be6d8b6 100644
--- a/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
+++ b/electron32/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/fixtures/api/safe-storage/encrypt-app/main.js.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/fixtures/api/safe-storage/encrypt-app/main.js.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/fixtures/api/safe-storage/encrypt-app/main.js
 @@ -7,7 +7,8 @@ const pathToEncryptedString = path.resol
  const writeFile = fs.writeFile;
diff --git a/electron32/patches/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js b/electron32/patches/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js
index 29ec26ec15..39c6a8db02 100644
--- a/electron32/patches/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js
+++ b/electron32/patches/patch-electron_spec_fixtures_crash-cases_safe-storage_index.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/fixtures/crash-cases/safe-storage/index.js.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/fixtures/crash-cases/safe-storage/index.js.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/fixtures/crash-cases/safe-storage/index.js
 @@ -22,7 +22,8 @@ const { expect } = require('chai');
    await app.whenReady();
diff --git a/electron32/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js b/electron32/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
index 301844f518..c781895543 100644
--- a/electron32/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
+++ b/electron32/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/fixtures/native-addon/uv-dlopen/index.js.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/fixtures/native-addon/uv-dlopen/index.js.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/fixtures/native-addon/uv-dlopen/index.js
 @@ -4,7 +4,7 @@ const testLoadLibrary = require('./build
  
diff --git a/electron32/patches/patch-electron_spec_node-spec.ts b/electron32/patches/patch-electron_spec_node-spec.ts
index e52eb9a724..c2ab1130ba 100644
--- a/electron32/patches/patch-electron_spec_node-spec.ts
+++ b/electron32/patches/patch-electron_spec_node-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/node-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/node-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/node-spec.ts
 @@ -148,7 +148,8 @@ describe('node feature', () => {
      });
diff --git a/electron32/patches/patch-electron_spec_version-bump-spec.ts b/electron32/patches/patch-electron_spec_version-bump-spec.ts
index ff0b3888c6..fd4f981c95 100644
--- a/electron32/patches/patch-electron_spec_version-bump-spec.ts
+++ b/electron32/patches/patch-electron_spec_version-bump-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/version-bump-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/version-bump-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/version-bump-spec.ts
 @@ -53,7 +53,8 @@ class GitFake {
  }
diff --git a/electron32/patches/patch-electron_spec_visibility-state-spec.ts b/electron32/patches/patch-electron_spec_visibility-state-spec.ts
index e3c2ee77ef..0444dd44b6 100644
--- a/electron32/patches/patch-electron_spec_visibility-state-spec.ts
+++ b/electron32/patches/patch-electron_spec_visibility-state-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/visibility-state-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/visibility-state-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/visibility-state-spec.ts
 @@ -12,7 +12,8 @@ import { closeWindow } from './lib/windo
  
diff --git a/electron32/patches/patch-electron_spec_webview-spec.ts b/electron32/patches/patch-electron_spec_webview-spec.ts
index 03b8fca047..c7e65348fb 100644
--- a/electron32/patches/patch-electron_spec_webview-spec.ts
+++ b/electron32/patches/patch-electron_spec_webview-spec.ts
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- electron/spec/webview-spec.ts.orig	2024-12-05 00:03:24.000000000 +0000
+--- electron/spec/webview-spec.ts.orig	2025-01-21 17:36:55.000000000 +0000
 +++ electron/spec/webview-spec.ts
 @@ -559,7 +559,8 @@ describe('<webview> tag', function () {
      });
diff --git a/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.cc b/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.cc
index ca354b2d15..012e7fe96f 100644
--- a/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.cc
+++ b/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- media/audio/sndio/audio_manager_sndio.cc.orig	2025-01-19 14:12:04.049477446 +0000
+--- media/audio/sndio/audio_manager_sndio.cc.orig	2025-02-15 09:43:46.387325509 +0000
 +++ media/audio/sndio/audio_manager_sndio.cc
 @@ -0,0 +1,213 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.h b/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.h
index c3a16eb2d0..9a9d60e64d 100644
--- a/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.h
+++ b/electron32/patches/patch-media_audio_sndio_audio__manager__sndio.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- media/audio/sndio/audio_manager_sndio.h.orig	2025-01-19 14:12:04.049601607 +0000
+--- media/audio/sndio/audio_manager_sndio.h.orig	2025-02-15 09:43:46.387473736 +0000
 +++ media/audio/sndio/audio_manager_sndio.h
 @@ -0,0 +1,66 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-media_audio_sndio_sndio__input.cc b/electron32/patches/patch-media_audio_sndio_sndio__input.cc
index 0e6170601b..e2e3f2ce0f 100644
--- a/electron32/patches/patch-media_audio_sndio_sndio__input.cc
+++ b/electron32/patches/patch-media_audio_sndio_sndio__input.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- media/audio/sndio/sndio_input.cc.orig	2025-01-19 14:12:04.049702553 +0000
+--- media/audio/sndio/sndio_input.cc.orig	2025-02-15 09:43:46.387604660 +0000
 +++ media/audio/sndio/sndio_input.cc
 @@ -0,0 +1,200 @@
 +// Copyright 2013 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-media_audio_sndio_sndio__input.h b/electron32/patches/patch-media_audio_sndio_sndio__input.h
index d23704755f..33644f8abb 100644
--- a/electron32/patches/patch-media_audio_sndio_sndio__input.h
+++ b/electron32/patches/patch-media_audio_sndio_sndio__input.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- media/audio/sndio/sndio_input.h.orig	2025-01-19 14:12:04.049821344 +0000
+--- media/audio/sndio/sndio_input.h.orig	2025-02-15 09:43:46.387744251 +0000
 +++ media/audio/sndio/sndio_input.h
 @@ -0,0 +1,91 @@
 +// Copyright 2013 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-media_audio_sndio_sndio__output.cc b/electron32/patches/patch-media_audio_sndio_sndio__output.cc
index 98836007af..d5a96a23c2 100644
--- a/electron32/patches/patch-media_audio_sndio_sndio__output.cc
+++ b/electron32/patches/patch-media_audio_sndio_sndio__output.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- media/audio/sndio/sndio_output.cc.orig	2025-01-19 14:12:04.049926297 +0000
+--- media/audio/sndio/sndio_output.cc.orig	2025-02-15 09:43:46.387875525 +0000
 +++ media/audio/sndio/sndio_output.cc
 @@ -0,0 +1,187 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-media_audio_sndio_sndio__output.h b/electron32/patches/patch-media_audio_sndio_sndio__output.h
index d7b1836b49..b9784242de 100644
--- a/electron32/patches/patch-media_audio_sndio_sndio__output.h
+++ b/electron32/patches/patch-media_audio_sndio_sndio__output.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- media/audio/sndio/sndio_output.h.orig	2025-01-19 14:12:04.050054426 +0000
+--- media/audio/sndio/sndio_output.h.orig	2025-02-15 09:43:46.388022781 +0000
 +++ media/audio/sndio/sndio_output.h
 @@ -0,0 +1,88 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.cc b/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.cc
index 9f3d6a97ea..5272e49741 100644
--- a/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.cc
+++ b/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- sandbox/policy/freebsd/sandbox_freebsd.cc.orig	2025-01-19 14:12:04.073711762 +0000
+--- sandbox/policy/freebsd/sandbox_freebsd.cc.orig	2025-02-15 09:43:46.413407978 +0000
 +++ sandbox/policy/freebsd/sandbox_freebsd.cc
 @@ -0,0 +1,245 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.h b/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.h
index a3ebf4c5b6..1c00cd860c 100644
--- a/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.h
+++ b/electron32/patches/patch-sandbox_policy_freebsd_sandbox__freebsd.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- sandbox/policy/freebsd/sandbox_freebsd.h.orig	2025-01-19 14:12:04.073840852 +0000
+--- sandbox/policy/freebsd/sandbox_freebsd.h.orig	2025-02-15 09:43:46.413556325 +0000
 +++ sandbox/policy/freebsd/sandbox_freebsd.h
 @@ -0,0 +1,278 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.cc b/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.cc
index bf7be7a9bd..23bede0760 100644
--- a/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.cc
+++ b/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- sandbox/policy/netbsd/sandbox_netbsd.cc.orig	2025-01-19 14:12:04.074204418 +0000
+--- sandbox/policy/netbsd/sandbox_netbsd.cc.orig	2025-02-15 09:43:46.413996188 +0000
 +++ sandbox/policy/netbsd/sandbox_netbsd.cc
 @@ -0,0 +1,245 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.h b/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.h
index 396025777c..25d99e8aba 100644
--- a/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.h
+++ b/electron32/patches/patch-sandbox_policy_netbsd_sandbox__netbsd.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- sandbox/policy/netbsd/sandbox_netbsd.h.orig	2025-01-19 14:12:04.074323539 +0000
+--- sandbox/policy/netbsd/sandbox_netbsd.h.orig	2025-02-15 09:43:46.414143864 +0000
 +++ sandbox/policy/netbsd/sandbox_netbsd.h
 @@ -0,0 +1,278 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.cc b/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.cc
index d0e9b85a6c..812e1b01e1 100644
--- a/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.cc
+++ b/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- sandbox/policy/openbsd/sandbox_openbsd.cc.orig	2025-01-19 14:12:04.074488900 +0000
+--- sandbox/policy/openbsd/sandbox_openbsd.cc.orig	2025-02-15 09:43:46.414336938 +0000
 +++ sandbox/policy/openbsd/sandbox_openbsd.cc
 @@ -0,0 +1,424 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.h b/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.h
index dfce0083b9..4128f0d301 100644
--- a/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.h
+++ b/electron32/patches/patch-sandbox_policy_openbsd_sandbox__openbsd.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- sandbox/policy/openbsd/sandbox_openbsd.h.orig	2025-01-19 14:12:04.074632900 +0000
+--- sandbox/policy/openbsd/sandbox_openbsd.h.orig	2025-02-15 09:43:46.414500445 +0000
 +++ sandbox/policy/openbsd/sandbox_openbsd.h
 @@ -0,0 +1,282 @@
 +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-services_device_hid_hid__connection__fido.cc b/electron32/patches/patch-services_device_hid_hid__connection__fido.cc
index 142274e83a..5cb81002a8 100644
--- a/electron32/patches/patch-services_device_hid_hid__connection__fido.cc
+++ b/electron32/patches/patch-services_device_hid_hid__connection__fido.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_connection_fido.cc.orig	2025-01-19 14:12:04.076021495 +0000
+--- services/device/hid/hid_connection_fido.cc.orig	2025-02-15 09:43:46.416177837 +0000
 +++ services/device/hid/hid_connection_fido.cc
 @@ -0,0 +1,216 @@
 +// Copyright 2014 The Chromium Authors
diff --git a/electron32/patches/patch-services_device_hid_hid__connection__fido.h b/electron32/patches/patch-services_device_hid_hid__connection__fido.h
index 5a8b0f08db..1368e9795f 100644
--- a/electron32/patches/patch-services_device_hid_hid__connection__fido.h
+++ b/electron32/patches/patch-services_device_hid_hid__connection__fido.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_connection_fido.h.orig	2025-01-19 14:12:04.076145355 +0000
+--- services/device/hid/hid_connection_fido.h.orig	2025-02-15 09:43:46.416326074 +0000
 +++ services/device/hid/hid_connection_fido.h
 @@ -0,0 +1,60 @@
 +// Copyright 2014 The Chromium Authors
diff --git a/electron32/patches/patch-services_device_hid_hid__connection__freebsd.cc b/electron32/patches/patch-services_device_hid_hid__connection__freebsd.cc
index 68682b96cb..aa32ca71d5 100644
--- a/electron32/patches/patch-services_device_hid_hid__connection__freebsd.cc
+++ b/electron32/patches/patch-services_device_hid_hid__connection__freebsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_connection_freebsd.cc.orig	2025-01-19 14:12:04.076252443 +0000
+--- services/device/hid/hid_connection_freebsd.cc.orig	2025-02-15 09:43:46.416457208 +0000
 +++ services/device/hid/hid_connection_freebsd.cc
 @@ -0,0 +1,240 @@
 +// Copyright (c) 2014 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-services_device_hid_hid__connection__freebsd.h b/electron32/patches/patch-services_device_hid_hid__connection__freebsd.h
index 5eefa81ce4..7478aa9339 100644
--- a/electron32/patches/patch-services_device_hid_hid__connection__freebsd.h
+++ b/electron32/patches/patch-services_device_hid_hid__connection__freebsd.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_connection_freebsd.h.orig	2025-01-19 14:12:04.076379780 +0000
+--- services/device/hid/hid_connection_freebsd.h.orig	2025-02-15 09:43:46.416604414 +0000
 +++ services/device/hid/hid_connection_freebsd.h
 @@ -0,0 +1,67 @@
 +// Copyright (c) 2014 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-services_device_hid_hid__service__fido.cc b/electron32/patches/patch-services_device_hid_hid__service__fido.cc
index f08d434b46..41d93795e9 100644
--- a/electron32/patches/patch-services_device_hid_hid__service__fido.cc
+++ b/electron32/patches/patch-services_device_hid_hid__service__fido.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_service_fido.cc.orig	2025-01-19 14:12:04.076585580 +0000
+--- services/device/hid/hid_service_fido.cc.orig	2025-02-15 09:43:46.416868997 +0000
 +++ services/device/hid/hid_service_fido.cc
 @@ -0,0 +1,396 @@
 +// Copyright 2014 The Chromium Authors
diff --git a/electron32/patches/patch-services_device_hid_hid__service__fido.h b/electron32/patches/patch-services_device_hid_hid__service__fido.h
index 5073c78827..e316807026 100644
--- a/electron32/patches/patch-services_device_hid_hid__service__fido.h
+++ b/electron32/patches/patch-services_device_hid_hid__service__fido.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_service_fido.h.orig	2025-01-19 14:12:04.076725561 +0000
+--- services/device/hid/hid_service_fido.h.orig	2025-02-15 09:43:46.417038625 +0000
 +++ services/device/hid/hid_service_fido.h
 @@ -0,0 +1,65 @@
 +// Copyright 2014 The Chromium Authors
diff --git a/electron32/patches/patch-services_device_hid_hid__service__freebsd.cc b/electron32/patches/patch-services_device_hid_hid__service__freebsd.cc
index 91b3ca1cd3..ea5343689c 100644
--- a/electron32/patches/patch-services_device_hid_hid__service__freebsd.cc
+++ b/electron32/patches/patch-services_device_hid_hid__service__freebsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_service_freebsd.cc.orig	2025-01-19 14:12:04.076830515 +0000
+--- services/device/hid/hid_service_freebsd.cc.orig	2025-02-15 09:43:46.417171463 +0000
 +++ services/device/hid/hid_service_freebsd.cc
 @@ -0,0 +1,395 @@
 +// Copyright 2014 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-services_device_hid_hid__service__freebsd.h b/electron32/patches/patch-services_device_hid_hid__service__freebsd.h
index 841e6f12a9..60049462eb 100644
--- a/electron32/patches/patch-services_device_hid_hid__service__freebsd.h
+++ b/electron32/patches/patch-services_device_hid_hid__service__freebsd.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/hid/hid_service_freebsd.h.orig	2025-01-19 14:12:04.076978432 +0000
+--- services/device/hid/hid_service_freebsd.h.orig	2025-02-15 09:43:46.417330581 +0000
 +++ services/device/hid/hid_service_freebsd.h
 @@ -0,0 +1,49 @@
 +// Copyright 2014 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-services_device_usb_usb__service__fake.cc b/electron32/patches/patch-services_device_usb_usb__service__fake.cc
index db5abbf387..eb2499b5a9 100644
--- a/electron32/patches/patch-services_device_usb_usb__service__fake.cc
+++ b/electron32/patches/patch-services_device_usb_usb__service__fake.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/usb/usb_service_fake.cc.orig	2025-01-19 14:12:04.077871034 +0000
+--- services/device/usb/usb_service_fake.cc.orig	2025-02-15 09:43:46.418442026 +0000
 +++ services/device/usb/usb_service_fake.cc
 @@ -0,0 +1,49 @@
 +// Copyright 2014 The Chromium Authors
diff --git a/electron32/patches/patch-services_device_usb_usb__service__fake.h b/electron32/patches/patch-services_device_usb_usb__service__fake.h
index 58362efd4d..8bd29dc141 100644
--- a/electron32/patches/patch-services_device_usb_usb__service__fake.h
+++ b/electron32/patches/patch-services_device_usb_usb__service__fake.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/device/usb/usb_service_fake.h.orig	2025-01-19 14:12:04.077967552 +0000
+--- services/device/usb/usb_service_fake.h.orig	2025-02-15 09:43:46.418573090 +0000
 +++ services/device/usb/usb_service_fake.h
 @@ -0,0 +1,48 @@
 +// Copyright 2015 The Chromium Authors
diff --git a/electron32/patches/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc b/electron32/patches/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc
index 70effe257a..12b1b6173e 100644
--- a/electron32/patches/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc
+++ b/electron32/patches/patch-services_resource__coordinator_public_cpp_memory__instrumentation_os__metrics__bsd.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_bsd.cc.orig	2025-01-19 14:12:04.082629179 +0000
+--- services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_bsd.cc.orig	2025-02-15 09:43:46.423238583 +0000
 +++ services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics_bsd.cc
 @@ -0,0 +1,66 @@
 +// Copyright 2022 The Chromium Authors. All rights reserved.
diff --git a/electron32/patches/patch-third__party_blink_public_platform_web__worker__fetch__context.h b/electron32/patches/patch-third__party_blink_public_platform_web__worker__fetch__context.h
new file mode 100644
index 0000000000..370dcaa2e4
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_public_platform_web__worker__fetch__context.h
@@ -0,0 +1,29 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/public/platform/web_worker_fetch_context.h.orig	2024-10-18 12:34:34.672521400 +0000
++++ third_party/blink/public/platform/web_worker_fetch_context.h
+@@ -33,19 +33,12 @@ class SiteForCookies;
+ 
+ namespace blink {
+ 
++class AcceptLanguagesWatcher;
+ class WebDocumentSubresourceFilter;
+ class URLLoaderFactory;
+ class WebURLRequest;
+ class URLLoaderThrottle;
+ 
+-// Helper class allowing DedicatedOrSharedWorkerFetchContextImpl to notify blink
+-// upon an accept languages update. This class will be extended by
+-// WorkerNavigator.
+-class AcceptLanguagesWatcher {
+- public:
+-  virtual void NotifyUpdate() = 0;
+-};
+-
+ // WebWorkerFetchContext is a per-worker object created on the main thread,
+ // passed to a worker (dedicated, shared and service worker) and initialized on
+ // the worker thread by InitializeOnWorkerThread(). It contains information
diff --git a/electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.cc b/electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.cc
new file mode 100644
index 0000000000..7d65f135cc
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.cc
@@ -0,0 +1,18 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/core/workers/worker_navigator.cc.orig	2024-10-18 12:34:35.760020500 +0000
++++ third_party/blink/renderer/core/workers/worker_navigator.cc
+@@ -61,4 +61,9 @@ void WorkerNavigator::NotifyUpdate() {
+       *Event::Create(event_type_names::kLanguagechange));
+ }
+ 
++void WorkerNavigator::Trace(Visitor* visitor) const {
++  NavigatorBase::Trace(visitor);
++  AcceptLanguagesWatcher::Trace(visitor);
++}
++
+ }  // namespace blink
diff --git a/electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.h b/electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.h
new file mode 100644
index 0000000000..191cb87074
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_core_workers_worker__navigator.h
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/core/workers/worker_navigator.h.orig	2024-10-18 12:34:35.760020500 +0000
++++ third_party/blink/renderer/core/workers/worker_navigator.h
+@@ -29,6 +29,7 @@
+ #include "third_party/blink/public/platform/web_worker_fetch_context.h"
+ #include "third_party/blink/renderer/core/core_export.h"
+ #include "third_party/blink/renderer/core/execution_context/navigator_base.h"
++#include "third_party/blink/renderer/platform/accept_languages_watcher.h"
+ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+ 
+ namespace blink {
+@@ -46,6 +47,9 @@ class CORE_EXPORT WorkerNavigator final 
+ 
+   // AcceptLanguagesWatcher override
+   void NotifyUpdate() override;
++
++  // Both NavigatorLanguage and AcceptLanguagesWatcher override
++  void Trace(Visitor* visitor) const override;
+ };
+ 
+ }  // namespace blink
diff --git a/electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.cc b/electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.cc
new file mode 100644
index 0000000000..8ca4552920
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.cc
@@ -0,0 +1,32 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc.orig	2024-10-18 12:34:36.155838700 +0000
++++ third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc
+@@ -18,6 +18,7 @@
+ #include "third_party/blink/public/platform/url_loader_throttle_provider.h"
+ #include "third_party/blink/public/platform/web_url_request_extra_data.h"
+ #include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h"
++#include "third_party/blink/renderer/platform/accept_languages_watcher.h"
+ #include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_factory.h"
+ #include "third_party/blink/renderer/platform/loader/internet_disconnected_url_loader.h"
+ 
+@@ -226,9 +227,12 @@ void WebServiceWorkerFetchContextImpl::U
+ 
+ void WebServiceWorkerFetchContextImpl::NotifyUpdate(
+     const RendererPreferences& new_prefs) {
+-  DCHECK(accept_languages_watcher_);
+-  if (renderer_preferences_.accept_languages != new_prefs.accept_languages)
+-    accept_languages_watcher_->NotifyUpdate();
++  // Reserving `watcher` on the stack ensures it is not GC'd within this scope.
++  auto* watcher = accept_languages_watcher_.Get();
++  if (watcher &&
++      renderer_preferences_.accept_languages != new_prefs.accept_languages) {
++    watcher->NotifyUpdate();
++  }
+   renderer_preferences_ = new_prefs;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.h b/electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.h
new file mode 100644
index 0000000000..f797cb6d5d
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_modules_service__worker_web__service__worker__fetch__context__impl.h
@@ -0,0 +1,36 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.h.orig	2024-10-18 12:34:36.155838700 +0000
++++ third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.h
+@@ -6,16 +6,16 @@
+ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_FETCH_CONTEXT_IMPL_H_
+ 
+ #include "base/memory/raw_ptr.h"
++#include "base/task/single_thread_task_runner.h"
+ #include "mojo/public/cpp/bindings/pending_receiver.h"
+ #include "mojo/public/cpp/bindings/receiver.h"
+ #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h"
+ #include "third_party/blink/public/mojom/renderer_preference_watcher.mojom-blink.h"
+ #include "third_party/blink/public/mojom/service_worker/service_worker.mojom-forward.h"
+ #include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom-blink.h"
+-
+-#include "base/task/single_thread_task_runner.h"
+ #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h"
+ #include "third_party/blink/public/platform/web_common.h"
++#include "third_party/blink/renderer/platform/heap/persistent.h"
+ #include "third_party/blink/renderer/platform/weborigin/kurl.h"
+ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+ #include "third_party/blink/renderer/platform/wtf/vector.h"
+@@ -135,7 +135,7 @@ class BLINK_EXPORT WebServiceWorkerFetch
+   // This is owned by ThreadedMessagingProxyBase on the main thread.
+   raw_ptr<base::WaitableEvent> terminate_sync_load_event_ = nullptr;
+ 
+-  raw_ptr<AcceptLanguagesWatcher> accept_languages_watcher_ = nullptr;
++  WeakPersistent<AcceptLanguagesWatcher> accept_languages_watcher_;
+ 
+   Vector<String> cors_exempt_header_list_;
+   bool is_offline_mode_ = false;
diff --git a/electron32/patches/patch-third__party_blink_renderer_platform_BUILD.gn b/electron32/patches/patch-third__party_blink_renderer_platform_BUILD.gn
index 80aa3fc010..8900a07aad 100644
--- a/electron32/patches/patch-third__party_blink_renderer_platform_BUILD.gn
+++ b/electron32/patches/patch-third__party_blink_renderer_platform_BUILD.gn
@@ -6,7 +6,15 @@ $NetBSD$
 
 --- third_party/blink/renderer/platform/BUILD.gn.orig	2024-10-18 12:34:36.419717800 +0000
 +++ third_party/blink/renderer/platform/BUILD.gn
-@@ -2003,7 +2003,7 @@ static_library("test_support") {
+@@ -335,6 +335,7 @@ component("platform") {
+   output_name = "blink_platform"
+ 
+   sources = [
++    "accept_languages_watcher.h",
+     "animation/animation_translation_util.cc",
+     "animation/animation_translation_util.h",
+     "animation/compositor_animation.cc",
+@@ -2003,7 +2004,7 @@ static_library("test_support") {
    ]
  
    # fuzzed_data_provider may not work with a custom toolchain.
diff --git a/electron32/patches/patch-third__party_blink_renderer_platform_accept__languages__watcher.h b/electron32/patches/patch-third__party_blink_renderer_platform_accept__languages__watcher.h
new file mode 100644
index 0000000000..462c6ca340
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_platform_accept__languages__watcher.h
@@ -0,0 +1,31 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/platform/accept_languages_watcher.h.orig	2025-02-15 09:43:46.445747966 +0000
++++ third_party/blink/renderer/platform/accept_languages_watcher.h
+@@ -0,0 +1,22 @@
++// Copyright 2024 The Chromium Authors
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_ACCEPT_LANGUAGES_WATCHER_H_
++#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_ACCEPT_LANGUAGES_WATCHER_H_
++
++#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
++
++namespace blink {
++
++// Helper class allowing DedicatedOrSharedWorkerFetchContextImpl to notify blink
++// upon an accept languages update. This class will be extended by
++// WorkerNavigator.
++class AcceptLanguagesWatcher : public GarbageCollectedMixin {
++ public:
++  virtual void NotifyUpdate() = 0;
++};
++
++}  // namespace blink
++
++#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_ACCEPT_LANGUAGES_WATCHER_H_
diff --git a/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_DEPS b/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_DEPS
new file mode 100644
index 0000000000..29b45320ec
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_DEPS
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/platform/loader/fetch/url_loader/DEPS.orig	2024-10-18 12:34:36.919489100 +0000
++++ third_party/blink/renderer/platform/loader/fetch/url_loader/DEPS
+@@ -28,4 +28,7 @@ specific_include_rules = {
+     "web_url_loader_unittest.cc": [
+         "+net/test/cert_test_util.h"
+     ],
++    "dedicated_or_shared_worker_fetch_context_impl.cc": [
++        "+third_party/blink/renderer/platform/accept_languages_watcher.h",
++    ],
+ }
diff --git a/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.cc b/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.cc
new file mode 100644
index 0000000000..1d5c0506d3
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.cc
@@ -0,0 +1,33 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc.orig	2024-10-18 12:34:36.923487200 +0000
++++ third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc
+@@ -28,6 +28,7 @@
+ #include "third_party/blink/public/platform/web_security_origin.h"
+ #include "third_party/blink/public/platform/web_url_request_extra_data.h"
+ #include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h"
++#include "third_party/blink/renderer/platform/accept_languages_watcher.h"
+ #include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.h"
+ #include "third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_factory.h"
+ #include "url/url_constants.h"
+@@ -600,9 +601,13 @@ void DedicatedOrSharedWorkerFetchContext
+ 
+ void DedicatedOrSharedWorkerFetchContextImpl::NotifyUpdate(
+     const RendererPreferences& new_prefs) {
+-  if (accept_languages_watcher_ &&
+-      renderer_preferences_.accept_languages != new_prefs.accept_languages)
+-    accept_languages_watcher_->NotifyUpdate();
++  // Reserving `accept_languages_watcher` on the stack ensures it is not GC'd
++  // within this scope.
++  auto* accept_languages_watcher = accept_languages_watcher_.Get();
++  if (accept_languages_watcher &&
++      renderer_preferences_.accept_languages != new_prefs.accept_languages) {
++    accept_languages_watcher->NotifyUpdate();
++  }
+   renderer_preferences_ = new_prefs;
+   for (auto& watcher : child_preference_watchers_)
+     watcher->NotifyUpdate(new_prefs);
diff --git a/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.h b/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.h
new file mode 100644
index 0000000000..7018406726
--- /dev/null
+++ b/electron32/patches/patch-third__party_blink_renderer_platform_loader_fetch_url__loader_dedicated__or__shared__worker__fetch__context__impl.h
@@ -0,0 +1,25 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h.orig	2024-10-18 12:34:36.923487200 +0000
++++ third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.h
+@@ -23,6 +23,7 @@
+ #include "third_party/blink/public/platform/web_common.h"
+ #include "third_party/blink/public/platform/web_dedicated_or_shared_worker_fetch_context.h"
+ #include "third_party/blink/public/platform/web_string.h"
++#include "third_party/blink/renderer/platform/heap/persistent.h"
+ #include "third_party/blink/renderer/platform/wtf/casting.h"
+ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+ #include "third_party/blink/renderer/platform/wtf/vector.h"
+@@ -300,7 +301,7 @@ class BLINK_PLATFORM_EXPORT DedicatedOrS
+   std::unique_ptr<WeakWrapperResourceLoadInfoNotifier>
+       weak_wrapper_resource_load_info_notifier_;
+ 
+-  raw_ptr<AcceptLanguagesWatcher> accept_languages_watcher_ = nullptr;
++  WeakPersistent<AcceptLanguagesWatcher> accept_languages_watcher_;
+ };
+ 
+ template <>
diff --git a/electron32/patches/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc b/electron32/patches/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
index 1fa6ea436d..3d55f97319 100644
--- a/electron32/patches/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
+++ b/electron32/patches/patch-third__party_crashpad_crashpad_client_crashpad__client__posix.cc
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/crashpad/crashpad/client/crashpad_client_posix.cc.orig	2025-01-19 14:12:04.112051133 +0000
+--- third_party/crashpad/crashpad/client/crashpad_client_posix.cc.orig	2025-02-15 09:43:46.452142121 +0000
 +++ third_party/crashpad/crashpad/client/crashpad_client_posix.cc
 @@ -0,0 +1,40 @@
 +// Copyright 2017 The Crashpad Authors. All rights reserved.
diff --git a/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__printer_ast__printer__test.cc b/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__printer_ast__printer__test.cc
new file mode 100644
index 0000000000..36c471c828
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__printer_ast__printer__test.cc
@@ -0,0 +1,182 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/src/tint/lang/msl/writer/ast_printer/ast_printer_test.cc.orig	2024-10-18 12:38:01.405487300 +0000
++++ third_party/dawn/src/tint/lang/msl/writer/ast_printer/ast_printer_test.cc
+@@ -378,93 +378,137 @@ TEST_F(MslASTPrinterTest, WorkgroupMatri
+     EXPECT_EQ(gen.Result(), R"(#include <metal_stdlib>
+ 
+ using namespace metal;
++
++template<typename T, size_t N>
++struct tint_array {
++    const constant T& operator[](size_t i) const constant { return elements[i]; }
++    device T& operator[](size_t i) device { return elements[i]; }
++    const device T& operator[](size_t i) const device { return elements[i]; }
++    thread T& operator[](size_t i) thread { return elements[i]; }
++    const thread T& operator[](size_t i) const thread { return elements[i]; }
++    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
++    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
++    T elements[N];
++};
++
+ struct tint_symbol_16 {
+   float2x2 m1;
+-  float2x3 m2;
+   float2x4 m3;
+ };
+ 
+ struct tint_symbol_24 {
+   float3x2 m4;
+-  float3x3 m5;
+   float3x4 m6;
+ };
+ 
+ struct tint_symbol_32 {
+   float4x2 m7;
+-  float4x3 m8;
+   float4x4 m9;
+ };
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup float2x2* const tint_symbol, threadgroup float2x3* const tint_symbol_1, threadgroup float2x4* const tint_symbol_2) {
++struct tint_packed_vec3_f32_array_element {
++  packed_float3 elements;
++};
++
++float2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 2> in) {
++  float2x3 result = float2x3(float3(in[0].elements), float3(in[1].elements));
++  return result;
++}
++
++float3x3 tint_unpack_vec3_in_composite_1(tint_array<tint_packed_vec3_f32_array_element, 3> in) {
++  float3x3 result = float3x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements));
++  return result;
++}
++
++float4x3 tint_unpack_vec3_in_composite_2(tint_array<tint_packed_vec3_f32_array_element, 4> in) {
++  float4x3 result = float4x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements), float3(in[3].elements));
++  return result;
++}
++
++tint_array<tint_packed_vec3_f32_array_element, 2> tint_pack_vec3_in_composite(float2x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 2> result = tint_array<tint_packed_vec3_f32_array_element, 2>{{.elements=packed_float3(in[0])}, {.elements=packed_float3(in[1])}};
++  return result;
++}
++
++tint_array<tint_packed_vec3_f32_array_element, 3> tint_pack_vec3_in_composite_1(float3x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 3> result = tint_array<tint_packed_vec3_f32_array_element, 3>{{.elements=packed_float3(in[0])}, {.elements=packed_float3(in[1])}, {.elements=packed_float3(in[2])}};
++  return result;
++}
++
++tint_array<tint_packed_vec3_f32_array_element, 4> tint_pack_vec3_in_composite_2(float4x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 4> result = tint_array<tint_packed_vec3_f32_array_element, 4>{{.elements=packed_float3(in[0])}, {.elements=packed_float3(in[1])}, {.elements=packed_float3(in[2])}, {.elements=packed_float3(in[3])}};
++  return result;
++}
++
++void tint_zero_workgroup_memory(uint local_idx, threadgroup float2x2* const tint_symbol, threadgroup tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_1, threadgroup float2x4* const tint_symbol_2) {
+   if ((local_idx < 1u)) {
+     *(tint_symbol) = float2x2(float2(0.0f), float2(0.0f));
+-    *(tint_symbol_1) = float2x3(float3(0.0f), float3(0.0f));
++    *(tint_symbol_1) = tint_pack_vec3_in_composite(float2x3(float3(0.0f), float3(0.0f)));
+     *(tint_symbol_2) = float2x4(float4(0.0f), float4(0.0f));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void tint_zero_workgroup_memory_1(uint local_idx_1, threadgroup float3x2* const tint_symbol_3, threadgroup float3x3* const tint_symbol_4, threadgroup float3x4* const tint_symbol_5) {
++void tint_zero_workgroup_memory_1(uint local_idx_1, threadgroup float3x2* const tint_symbol_3, threadgroup tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol_4, threadgroup float3x4* const tint_symbol_5) {
+   if ((local_idx_1 < 1u)) {
+     *(tint_symbol_3) = float3x2(float2(0.0f), float2(0.0f), float2(0.0f));
+-    *(tint_symbol_4) = float3x3(float3(0.0f), float3(0.0f), float3(0.0f));
++    *(tint_symbol_4) = tint_pack_vec3_in_composite_1(float3x3(float3(0.0f), float3(0.0f), float3(0.0f)));
+     *(tint_symbol_5) = float3x4(float4(0.0f), float4(0.0f), float4(0.0f));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void tint_zero_workgroup_memory_2(uint local_idx_2, threadgroup float4x2* const tint_symbol_6, threadgroup float4x3* const tint_symbol_7, threadgroup float4x4* const tint_symbol_8) {
++void tint_zero_workgroup_memory_2(uint local_idx_2, threadgroup float4x2* const tint_symbol_6, threadgroup tint_array<tint_packed_vec3_f32_array_element, 4>* const tint_symbol_7, threadgroup float4x4* const tint_symbol_8) {
+   if ((local_idx_2 < 1u)) {
+     *(tint_symbol_6) = float4x2(float2(0.0f), float2(0.0f), float2(0.0f), float2(0.0f));
+-    *(tint_symbol_7) = float4x3(float3(0.0f), float3(0.0f), float3(0.0f), float3(0.0f));
++    *(tint_symbol_7) = tint_pack_vec3_in_composite_2(float4x3(float3(0.0f), float3(0.0f), float3(0.0f), float3(0.0f)));
+     *(tint_symbol_8) = float4x4(float4(0.0f), float4(0.0f), float4(0.0f), float4(0.0f));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void main1_inner(uint local_invocation_index, threadgroup float2x2* const tint_symbol_9, threadgroup float2x3* const tint_symbol_10, threadgroup float2x4* const tint_symbol_11) {
++void main1_inner(uint local_invocation_index, threadgroup float2x2* const tint_symbol_9, threadgroup tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_10, threadgroup float2x4* const tint_symbol_11) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_9, tint_symbol_10, tint_symbol_11);
+   float2x2 const a1 = *(tint_symbol_9);
+-  float2x3 const a2 = *(tint_symbol_10);
++  float2x3 const a2 = tint_unpack_vec3_in_composite(*(tint_symbol_10));
+   float2x4 const a3 = *(tint_symbol_11);
+ }
+ 
+ kernel void main1(threadgroup tint_symbol_16* tint_symbol_13 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+   threadgroup float2x2* const tint_symbol_12 = &((*(tint_symbol_13)).m1);
+-  threadgroup float2x3* const tint_symbol_14 = &((*(tint_symbol_13)).m2);
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 2> tint_symbol_14;
+   threadgroup float2x4* const tint_symbol_15 = &((*(tint_symbol_13)).m3);
+-  main1_inner(local_invocation_index, tint_symbol_12, tint_symbol_14, tint_symbol_15);
++  main1_inner(local_invocation_index, tint_symbol_12, &(tint_symbol_14), tint_symbol_15);
+   return;
+ }
+ 
+-void main2_inner(uint local_invocation_index_1, threadgroup float3x2* const tint_symbol_17, threadgroup float3x3* const tint_symbol_18, threadgroup float3x4* const tint_symbol_19) {
++void main2_inner(uint local_invocation_index_1, threadgroup float3x2* const tint_symbol_17, threadgroup tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol_18, threadgroup float3x4* const tint_symbol_19) {
+   tint_zero_workgroup_memory_1(local_invocation_index_1, tint_symbol_17, tint_symbol_18, tint_symbol_19);
+   float3x2 const a1 = *(tint_symbol_17);
+-  float3x3 const a2 = *(tint_symbol_18);
++  float3x3 const a2 = tint_unpack_vec3_in_composite_1(*(tint_symbol_18));
+   float3x4 const a3 = *(tint_symbol_19);
+ }
+ 
+ kernel void main2(threadgroup tint_symbol_24* tint_symbol_21 [[threadgroup(0)]], uint local_invocation_index_1 [[thread_index_in_threadgroup]]) {
+   threadgroup float3x2* const tint_symbol_20 = &((*(tint_symbol_21)).m4);
+-  threadgroup float3x3* const tint_symbol_22 = &((*(tint_symbol_21)).m5);
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 3> tint_symbol_22;
+   threadgroup float3x4* const tint_symbol_23 = &((*(tint_symbol_21)).m6);
+-  main2_inner(local_invocation_index_1, tint_symbol_20, tint_symbol_22, tint_symbol_23);
++  main2_inner(local_invocation_index_1, tint_symbol_20, &(tint_symbol_22), tint_symbol_23);
+   return;
+ }
+ 
+-void main3_inner(uint local_invocation_index_2, threadgroup float4x2* const tint_symbol_25, threadgroup float4x3* const tint_symbol_26, threadgroup float4x4* const tint_symbol_27) {
++void main3_inner(uint local_invocation_index_2, threadgroup float4x2* const tint_symbol_25, threadgroup tint_array<tint_packed_vec3_f32_array_element, 4>* const tint_symbol_26, threadgroup float4x4* const tint_symbol_27) {
+   tint_zero_workgroup_memory_2(local_invocation_index_2, tint_symbol_25, tint_symbol_26, tint_symbol_27);
+   float4x2 const a1 = *(tint_symbol_25);
+-  float4x3 const a2 = *(tint_symbol_26);
++  float4x3 const a2 = tint_unpack_vec3_in_composite_2(*(tint_symbol_26));
+   float4x4 const a3 = *(tint_symbol_27);
+ }
+ 
+ kernel void main3(threadgroup tint_symbol_32* tint_symbol_29 [[threadgroup(0)]], uint local_invocation_index_2 [[thread_index_in_threadgroup]]) {
+   threadgroup float4x2* const tint_symbol_28 = &((*(tint_symbol_29)).m7);
+-  threadgroup float4x3* const tint_symbol_30 = &((*(tint_symbol_29)).m8);
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 4> tint_symbol_30;
+   threadgroup float4x4* const tint_symbol_31 = &((*(tint_symbol_29)).m9);
+-  main3_inner(local_invocation_index_2, tint_symbol_28, tint_symbol_30, tint_symbol_31);
++  main3_inner(local_invocation_index_2, tint_symbol_28, &(tint_symbol_30), tint_symbol_31);
+   return;
+ }
+ 
+@@ -479,11 +523,11 @@ kernel void main4_no_usages() {
+     ASSERT_TRUE(allocations.count("main2"));
+     ASSERT_TRUE(allocations.count("main3"));
+     ASSERT_EQ(allocations.at("main1").size(), 1u);
+-    EXPECT_EQ(allocations.at("main1")[0], 20u * sizeof(float));
++    EXPECT_EQ(allocations.at("main1")[0], 12u * sizeof(float));
+     ASSERT_EQ(allocations.at("main2").size(), 1u);
+-    EXPECT_EQ(allocations.at("main2")[0], 32u * sizeof(float));
++    EXPECT_EQ(allocations.at("main2")[0], 20u * sizeof(float));
+     ASSERT_EQ(allocations.at("main3").size(), 1u);
+-    EXPECT_EQ(allocations.at("main3")[0], 40u * sizeof(float));
++    EXPECT_EQ(allocations.at("main3")[0], 24u * sizeof(float));
+     EXPECT_EQ(allocations.at("main4_no_usages").size(), 0u);
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3.cc b/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3.cc
new file mode 100644
index 0000000000..449f54ea6e
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3.cc
@@ -0,0 +1,77 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/src/tint/lang/msl/writer/ast_raise/packed_vec3.cc.orig	2024-10-18 12:38:01.405487300 +0000
++++ third_party/dawn/src/tint/lang/msl/writer/ast_raise/packed_vec3.cc
+@@ -83,6 +83,14 @@ struct PackedVec3::State {
+     /// A map from type to the name of a helper function used to unpack that type.
+     Hashmap<const core::type::Type*, Symbol, 4> unpack_helpers;
+ 
++    /// @returns true if @p addrspace requires vec3 types to be packed
++    bool AddressSpaceNeedsPacking(core::AddressSpace addrspace) {
++        // Host-shareable address spaces need to be packed to match the memory layout on the host.
++        // The workgroup address space needs to be packed so that the size of generated threadgroup
++        // variables matches the size of the original WGSL declarations.
++        return core::IsHostShareable(addrspace) || addrspace == core::AddressSpace::kWorkgroup;
++    }
++
+     /// @param ty the type to test
+     /// @returns true if `ty` is a vec3, false otherwise
+     bool IsVec3(const core::type::Type* ty) {
+@@ -373,7 +381,7 @@ struct PackedVec3::State {
+         // if the transform is necessary.
+         for (auto* decl : src.AST().GlobalVariables()) {
+             auto* var = sem.Get<sem::GlobalVariable>(decl);
+-            if (var && core::IsHostShareable(var->AddressSpace()) &&
++            if (var && AddressSpaceNeedsPacking(var->AddressSpace()) &&
+                 ContainsVec3(var->Type()->UnwrapRef())) {
+                 return true;
+             }
+@@ -410,7 +418,7 @@ struct PackedVec3::State {
+                 [&](const sem::TypeExpression* type) {
+                     // Rewrite pointers to types that contain vec3s.
+                     auto* ptr = type->Type()->As<core::type::Pointer>();
+-                    if (ptr && core::IsHostShareable(ptr->AddressSpace())) {
++                    if (ptr && AddressSpaceNeedsPacking(ptr->AddressSpace())) {
+                         auto new_store_type = RewriteType(ptr->StoreType());
+                         if (new_store_type) {
+                             auto access = ptr->AddressSpace() == core::AddressSpace::kStorage
+@@ -423,7 +431,7 @@ struct PackedVec3::State {
+                     }
+                 },
+                 [&](const sem::Variable* var) {
+-                    if (!core::IsHostShareable(var->AddressSpace())) {
++                    if (!AddressSpaceNeedsPacking(var->AddressSpace())) {
+                         return;
+                     }
+ 
+@@ -439,7 +447,7 @@ struct PackedVec3::State {
+                         auto* lhs = sem.GetVal(assign->lhs);
+                         auto* rhs = sem.GetVal(assign->rhs);
+                         if (!ContainsVec3(rhs->Type()) ||
+-                            !core::IsHostShareable(
++                            !AddressSpaceNeedsPacking(
+                                 lhs->Type()->As<core::type::Reference>()->AddressSpace())) {
+                             // Skip assignments to address spaces that are not host-shareable, or
+                             // that do not contain vec3 types.
+@@ -467,7 +475,7 @@ struct PackedVec3::State {
+                 [&](const sem::Load* load) {
+                     // Unpack loads of types that contain vec3s in host-shareable address spaces.
+                     if (ContainsVec3(load->Type()) &&
+-                        core::IsHostShareable(load->ReferenceType()->AddressSpace())) {
++                        AddressSpaceNeedsPacking(load->ReferenceType()->AddressSpace())) {
+                         to_unpack.Add(load);
+                     }
+                 },
+@@ -477,7 +485,7 @@ struct PackedVec3::State {
+                     // struct.
+                     if (auto* ref = accessor->Type()->As<core::type::Reference>()) {
+                         if (IsVec3(ref->StoreType()) &&
+-                            core::IsHostShareable(ref->AddressSpace())) {
++                            AddressSpaceNeedsPacking(ref->AddressSpace())) {
+                             ctx.Replace(node, b.MemberAccessor(ctx.Clone(accessor->Declaration()),
+                                                                kStructMemberName));
+                         }
diff --git a/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3__test.cc b/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3__test.cc
new file mode 100644
index 0000000000..cce5c86f8c
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_src_tint_lang_msl_writer_ast__raise_packed__vec3__test.cc
@@ -0,0 +1,50 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/src/tint/lang/msl/writer/ast_raise/packed_vec3_test.cc.orig	2024-10-18 12:38:01.405487300 +0000
++++ third_party/dawn/src/tint/lang/msl/writer/ast_raise/packed_vec3_test.cc
+@@ -67,11 +67,6 @@ var<private> p_v : vec3<f32>;
+ var<private> p_m : mat3x3<f32>;
+ var<private> p_a : array<vec3<f32>, 4>;
+ 
+-var<workgroup> w_s : S;
+-var<workgroup> w_v : vec3<f32>;
+-var<workgroup> w_m : mat3x3<f32>;
+-var<workgroup> w_a : array<vec3<f32>, 4>;
+-
+ fn f() {
+   var f_s : S;
+   var f_v : vec3<f32>;
+@@ -6944,20 +6939,20 @@ struct S {
+ 
+ @group(0) @binding(0) var<storage> P : S_tint_packed_vec3;
+ 
+-var<workgroup> w1 : S;
++var<workgroup> w1 : S_tint_packed_vec3;
+ 
+-var<workgroup> w2 : vec3<f32>;
++var<workgroup> w2 : __packed_vec3<f32>;
+ 
+-var<workgroup> w3 : array<vec3<f32>, 4>;
++var<workgroup> w3 : array<tint_packed_vec3_f32_array_element, 4u>;
+ 
+-var<workgroup> w4 : mat3x3<f32>;
++var<workgroup> w4 : array<tint_packed_vec3_f32_array_element, 3u>;
+ 
+ fn f() {
+-  let pv_1 : ptr<workgroup, vec3<f32>> = &(w1.v);
+-  let pv_2 : ptr<workgroup, vec3<f32>> = &(w2);
+-  let pv_3 : ptr<workgroup, vec3<f32>> = &(w3[0]);
+-  let pv_4 : ptr<workgroup, mat3x3<f32>> = &(w1.m);
+-  let pv_5 : ptr<workgroup, mat3x3<f32>> = &(w4);
++  let pv_1 : ptr<workgroup, __packed_vec3<f32>> = &(w1.v);
++  let pv_2 : ptr<workgroup, __packed_vec3<f32>> = &(w2);
++  let pv_3 : ptr<workgroup, __packed_vec3<f32>> = &(w3[0].elements);
++  let pv_4 : ptr<workgroup, array<tint_packed_vec3_f32_array_element, 3u>> = &(w1.m);
++  let pv_5 : ptr<workgroup, array<tint_packed_vec3_f32_array_element, 3u>> = &(w4);
+ }
+ )";
+ 
diff --git a/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc b/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc
index de3ccd2e18..ac6e1f8be7 100644
--- a/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc
+++ b/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_address__space__layout__validation__test.cc
@@ -105,11 +105,12 @@ $NetBSD$
                         });
  
      Structure("Outer", Vector{
-@@ -730,5 +730,29 @@ TEST_F(ResolverAddressSpaceLayoutValidat
+@@ -730,5 +730,97 @@ TEST_F(ResolverAddressSpaceLayoutValidat
      EXPECT_TRUE(r()->Resolve()) << r()->error();
  }
  
-+TEST_F(ResolverAddressSpaceLayoutValidationTest, AlignAttributeTooSmall) {
+-}  // namespace
++TEST_F(ResolverAddressSpaceLayoutValidationTest, AlignAttributeTooSmall_Storage) {
 +    // struct S {
 +    //   @align(4) vector : vec4u;
 +    //   scalar : u32;
@@ -133,5 +134,73 @@ $NetBSD$
 +56:78 note: 'S' used in address space 'storage' here)");
 +}
 +
- }  // namespace
++TEST_F(ResolverAddressSpaceLayoutValidationTest, AlignAttributeTooSmall_Workgroup) {
++    // struct S {
++    //   @align(4) vector : vec4u;
++    //   scalar : u32;
++    // };
++    //
++    // var<workgroup> a : array<S, 4>;
++    Structure(
++        "S", Vector{
++                 Member("vector", ty.vec4<u32>(), Vector{MemberAlign(Expr(Source{{12, 34}}, 4_a))}),
++                 Member("scalar", ty.u32()),
++             });
++
++    GlobalVar(Source{{56, 78}}, "a", ty("S"), core::AddressSpace::kWorkgroup, Group(0_a));
++
++    ASSERT_FALSE(r()->Resolve());
++    EXPECT_EQ(
++        r()->error(),
++        R"(12:34 error: alignment must be a multiple of '16' bytes for the 'workgroup' address space
++56:78 note: 'S' used in address space 'workgroup' here)");
++}
++
++TEST_F(ResolverAddressSpaceLayoutValidationTest, AlignAttributeTooSmall_Private) {
++    // struct S {
++    //   @align(4) vector : vec4u;
++    //   scalar : u32;
++    // };
++    //
++    // var<private> a : array<S, 4>;
++    Structure(
++        "S", Vector{
++                 Member("vector", ty.vec4<u32>(), Vector{MemberAlign(Expr(Source{{12, 34}}, 4_a))}),
++                 Member("scalar", ty.u32()),
++             });
++
++    GlobalVar(Source{{56, 78}}, "a", ty("S"), core::AddressSpace::kPrivate, Group(0_a));
++
++    ASSERT_FALSE(r()->Resolve());
++    EXPECT_EQ(
++        r()->error(),
++        R"(12:34 error: alignment must be a multiple of '16' bytes for the 'private' address space
++56:78 note: 'S' used in address space 'private' here)");
++}
++
++TEST_F(ResolverAddressSpaceLayoutValidationTest, AlignAttributeTooSmall_Function) {
++    // struct S {
++    //   @align(4) vector : vec4u;
++    //   scalar : u32;
++    // };
++    //
++    // fn foo() {
++    //   var a : array<S, 4>;
++    // }
++    Structure(
++        "S", Vector{
++                 Member("vector", ty.vec4<u32>(), Vector{MemberAlign(Expr(Source{{12, 34}}, 4_a))}),
++                 Member("scalar", ty.u32()),
++             });
++
++    GlobalVar(Source{{56, 78}}, "a", ty("S"), core::AddressSpace::kFunction, Group(0_a));
++
++    ASSERT_FALSE(r()->Resolve());
++    EXPECT_EQ(
++        r()->error(),
++        R"(12:34 error: alignment must be a multiple of '16' bytes for the 'function' address space
++56:78 note: 'S' used in address space 'function' here)");
++}
++
++ }  // namespace
  }  // namespace tint::resolver
diff --git a/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc b/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc
index 61475d05dd..43968a5645 100644
--- a/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc
+++ b/electron32/patches/patch-third__party_dawn_src_tint_lang_wgsl_resolver_validator.cc
@@ -6,7 +6,18 @@ $NetBSD$
 
 --- third_party/dawn/src/tint/lang/wgsl/resolver/validator.cc.orig	2024-10-18 12:38:01.525448000 +0000
 +++ third_party/dawn/src/tint/lang/wgsl/resolver/validator.cc
-@@ -661,6 +661,22 @@ bool Validator::AddressSpaceLayout(const
+@@ -577,10 +577,6 @@ bool Validator::AddressSpaceLayout(const
+         return true;
+     }
+ 
+-    if (!core::IsHostShareable(address_space)) {
+-        return true;
+-    }
+-
+     auto note_usage = [&] {
+         AddNote(source) << style::Type(store_ty->FriendlyName()) << " used in address space "
+                         << style::Enum(address_space) << " here";
+@@ -661,6 +657,22 @@ bool Validator::AddressSpaceLayout(const
                      return false;
                  }
              }
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..a159627048
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,67 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.601423300 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/array/mat2x3_f16/to_workgroup.wgsl.expected.msl
+@@ -18,45 +18,36 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct tint_symbol_8 {
+-  tint_array<half2x3, 4> w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+ };
+ 
+-half2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 2> in) {
+-  half2x3 result = half2x3(half3(in[0].elements), half3(in[1].elements));
+-  return result;
+-}
+-
+-tint_array<half2x3, 4> tint_unpack_vec3_in_composite_1(tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4> in) {
+-  tint_array<half2x3, 4> result = tint_array<half2x3, 4>{tint_unpack_vec3_in_composite(in[0]), tint_unpack_vec3_in_composite(in[1]), tint_unpack_vec3_in_composite(in[2]), tint_unpack_vec3_in_composite(in[3])};
++tint_array<tint_packed_vec3_f16_array_element, 2> tint_pack_vec3_in_composite(half2x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 2> result = tint_array<tint_packed_vec3_f16_array_element, 2>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<half2x3, 4>* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* const tint_symbol) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+-    (*(tint_symbol))[i] = half2x3(half3(0.0h), half3(0.0h));
++    (*(tint_symbol))[i] = tint_pack_vec3_in_composite(half2x3(half3(0.0h), half3(0.0h)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<half2x3, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* const tint_symbol_2, device half* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* const tint_symbol_2, device half* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = tint_unpack_vec3_in_composite((*(tint_symbol_2))[2]);
+-  (*(tint_symbol_1))[1][0] = half3((*(tint_symbol_2))[0][1].elements).zxy;
+-  (*(tint_symbol_1))[1][0][0] = (*(tint_symbol_2))[0][1].elements[0];
+-  *(tint_symbol_3) = (*(tint_symbol_1))[1][0][0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1] = (*(tint_symbol_2))[2];
++  (*(tint_symbol_1))[1][0].elements = packed_half3(half3((*(tint_symbol_2))[0][1].elements).zxy);
++  (*(tint_symbol_1))[1][0].elements[0] = (*(tint_symbol_2))[0][1].elements[0];
++  *(tint_symbol_3) = (*(tint_symbol_1))[1][0].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* tint_symbol_6 [[buffer(0)]], device half* tint_symbol_7 [[buffer(1)]], threadgroup tint_symbol_8* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<half2x3, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6, tint_symbol_7);
++kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4>* tint_symbol_5 [[buffer(0)]], device half* tint_symbol_6 [[buffer(1)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_array<tint_packed_vec3_f16_array_element, 2>, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5, tint_symbol_6);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..6a85c2c315
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat2x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,65 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/array/mat2x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.605422000 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/array/mat2x3_f32/to_workgroup.wgsl.expected.msl
+@@ -18,44 +18,35 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct tint_symbol_6 {
+-  tint_array<float2x3, 4> w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+ };
+ 
+-float2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 2> in) {
+-  float2x3 result = float2x3(float3(in[0].elements), float3(in[1].elements));
+-  return result;
+-}
+-
+-tint_array<float2x3, 4> tint_unpack_vec3_in_composite_1(tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4> in) {
+-  tint_array<float2x3, 4> result = tint_array<float2x3, 4>{tint_unpack_vec3_in_composite(in[0]), tint_unpack_vec3_in_composite(in[1]), tint_unpack_vec3_in_composite(in[2]), tint_unpack_vec3_in_composite(in[3])};
++tint_array<tint_packed_vec3_f32_array_element, 2> tint_pack_vec3_in_composite(float2x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 2> result = tint_array<tint_packed_vec3_f32_array_element, 2>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<float2x3, 4>* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* const tint_symbol) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+-    (*(tint_symbol))[i] = float2x3(float3(0.0f), float3(0.0f));
++    (*(tint_symbol))[i] = tint_pack_vec3_in_composite(float2x3(float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<float2x3, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = tint_unpack_vec3_in_composite((*(tint_symbol_2))[2]);
+-  (*(tint_symbol_1))[1][0] = float3((*(tint_symbol_2))[0][1].elements).zxy;
+-  (*(tint_symbol_1))[1][0][0] = (*(tint_symbol_2))[0][1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1] = (*(tint_symbol_2))[2];
++  (*(tint_symbol_1))[1][0].elements = packed_float3(float3((*(tint_symbol_2))[0][1].elements).zxy);
++  (*(tint_symbol_1))[1][0].elements[0] = (*(tint_symbol_2))[0][1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<float2x3, 4>* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 2>, 4> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat3x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat3x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..ac11143912
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat3x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,65 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/array/mat3x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.613419300 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/array/mat3x3_f32/to_workgroup.wgsl.expected.msl
+@@ -18,44 +18,35 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct tint_symbol_6 {
+-  tint_array<float3x3, 4> w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+ };
+ 
+-float3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 3> in) {
+-  float3x3 result = float3x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements));
+-  return result;
+-}
+-
+-tint_array<float3x3, 4> tint_unpack_vec3_in_composite_1(tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4> in) {
+-  tint_array<float3x3, 4> result = tint_array<float3x3, 4>{tint_unpack_vec3_in_composite(in[0]), tint_unpack_vec3_in_composite(in[1]), tint_unpack_vec3_in_composite(in[2]), tint_unpack_vec3_in_composite(in[3])};
++tint_array<tint_packed_vec3_f32_array_element, 3> tint_pack_vec3_in_composite(float3x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 3> result = tint_array<tint_packed_vec3_f32_array_element, 3>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[2])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<float3x3, 4>* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* const tint_symbol) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+-    (*(tint_symbol))[i] = float3x3(float3(0.0f), float3(0.0f), float3(0.0f));
++    (*(tint_symbol))[i] = tint_pack_vec3_in_composite(float3x3(float3(0.0f), float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<float3x3, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = tint_unpack_vec3_in_composite((*(tint_symbol_2))[2]);
+-  (*(tint_symbol_1))[1][0] = float3((*(tint_symbol_2))[0][1].elements).zxy;
+-  (*(tint_symbol_1))[1][0][0] = (*(tint_symbol_2))[0][1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1] = (*(tint_symbol_2))[2];
++  (*(tint_symbol_1))[1][0].elements = packed_float3(float3((*(tint_symbol_2))[0][1].elements).zxy);
++  (*(tint_symbol_1))[1][0].elements[0] = (*(tint_symbol_2))[0][1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<float3x3, 4>* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 3>, 4> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..f29e9e5445
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,65 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.625415300 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/array/mat4x3_f16/to_workgroup.wgsl.expected.msl
+@@ -18,44 +18,35 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct tint_symbol_6 {
+-  tint_array<half4x3, 4> w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+ };
+ 
+-half4x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 4> in) {
+-  half4x3 result = half4x3(half3(in[0].elements), half3(in[1].elements), half3(in[2].elements), half3(in[3].elements));
+-  return result;
+-}
+-
+-tint_array<half4x3, 4> tint_unpack_vec3_in_composite_1(tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4> in) {
+-  tint_array<half4x3, 4> result = tint_array<half4x3, 4>{tint_unpack_vec3_in_composite(in[0]), tint_unpack_vec3_in_composite(in[1]), tint_unpack_vec3_in_composite(in[2]), tint_unpack_vec3_in_composite(in[3])};
++tint_array<tint_packed_vec3_f16_array_element, 4> tint_pack_vec3_in_composite(half4x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 4> result = tint_array<tint_packed_vec3_f16_array_element, 4>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[2])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[3])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<half4x3, 4>* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* const tint_symbol) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+-    (*(tint_symbol))[i] = half4x3(half3(0.0h), half3(0.0h), half3(0.0h), half3(0.0h));
++    (*(tint_symbol))[i] = tint_pack_vec3_in_composite(half4x3(half3(0.0h), half3(0.0h), half3(0.0h), half3(0.0h)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<half4x3, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = tint_unpack_vec3_in_composite((*(tint_symbol_2))[2]);
+-  (*(tint_symbol_1))[1][0] = half3((*(tint_symbol_2))[0][1].elements).zxy;
+-  (*(tint_symbol_1))[1][0][0] = (*(tint_symbol_2))[0][1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1] = (*(tint_symbol_2))[2];
++  (*(tint_symbol_1))[1][0].elements = packed_half3(half3((*(tint_symbol_2))[0][1].elements).zxy);
++  (*(tint_symbol_1))[1][0].elements[0] = (*(tint_symbol_2))[0][1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<half4x3, 4>* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_array<tint_packed_vec3_f16_array_element, 4>, 4> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..8f479c1de8
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_array_mat4x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,65 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/array/mat4x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.629414000 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/array/mat4x3_f32/to_workgroup.wgsl.expected.msl
+@@ -18,44 +18,35 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct tint_symbol_6 {
+-  tint_array<float4x3, 4> w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+ };
+ 
+-float4x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 4> in) {
+-  float4x3 result = float4x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements), float3(in[3].elements));
+-  return result;
+-}
+-
+-tint_array<float4x3, 4> tint_unpack_vec3_in_composite_1(tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4> in) {
+-  tint_array<float4x3, 4> result = tint_array<float4x3, 4>{tint_unpack_vec3_in_composite(in[0]), tint_unpack_vec3_in_composite(in[1]), tint_unpack_vec3_in_composite(in[2]), tint_unpack_vec3_in_composite(in[3])};
++tint_array<tint_packed_vec3_f32_array_element, 4> tint_pack_vec3_in_composite(float4x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 4> result = tint_array<tint_packed_vec3_f32_array_element, 4>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[2])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[3])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<float4x3, 4>* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* const tint_symbol) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+-    (*(tint_symbol))[i] = float4x3(float3(0.0f), float3(0.0f), float3(0.0f), float3(0.0f));
++    (*(tint_symbol))[i] = tint_pack_vec3_in_composite(float4x3(float3(0.0f), float3(0.0f), float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<float4x3, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* const tint_symbol_1, const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = tint_unpack_vec3_in_composite((*(tint_symbol_2))[2]);
+-  (*(tint_symbol_1))[1][0] = float3((*(tint_symbol_2))[0][1].elements).zxy;
+-  (*(tint_symbol_1))[1][0][0] = (*(tint_symbol_2))[0][1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1] = (*(tint_symbol_2))[2];
++  (*(tint_symbol_1))[1][0].elements = packed_float3(float3((*(tint_symbol_2))[0][1].elements).zxy);
++  (*(tint_symbol_1))[1][0].elements[0] = (*(tint_symbol_2))[0][1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<float4x3, 4>* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 4>, 4> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..300913bdeb
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,85 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.645408900 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_workgroup.wgsl.expected.msl
+@@ -24,10 +24,6 @@ struct S {
+   int after;
+ };
+ 
+-struct tint_symbol_7 {
+-  tint_array<S, 4> w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+@@ -42,44 +38,45 @@ struct S_tint_packed_vec3 {
+   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_3;
+ };
+ 
+-half2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 2> in) {
+-  half2x3 result = half2x3(half3(in[0].elements), half3(in[1].elements));
++tint_array<tint_packed_vec3_f16_array_element, 2> tint_pack_vec3_in_composite(half2x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 2> result = tint_array<tint_packed_vec3_f16_array_element, 2>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}};
+   return result;
+ }
+ 
+-S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
+-  S result = {};
++struct S {
++  int before;
++  half2x3 m;
++  int after;
++};
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
+   result.before = in.before;
+-  result.m = tint_unpack_vec3_in_composite(in.m);
++  result.m = tint_pack_vec3_in_composite(in.m);
+   result.after = in.after;
+   return result;
+ }
+ 
+-tint_array<S, 4> tint_unpack_vec3_in_composite_2(tint_array<S_tint_packed_vec3, 4> in) {
+-  tint_array<S, 4> result = tint_array<S, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
+-  return result;
+-}
+-
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S, 4>* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+     S const tint_symbol = S{};
+-    (*(tint_symbol_1))[i] = tint_symbol;
++    (*(tint_symbol_1))[i] = tint_pack_vec3_in_composite_1(tint_symbol);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<S, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+-  *(tint_symbol_2) = tint_unpack_vec3_in_composite_2(*(tint_symbol_3));
+-  (*(tint_symbol_2))[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_3))[2]);
+-  (*(tint_symbol_2))[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_3))[2].m);
+-  (*(tint_symbol_2))[1].m[0] = half3((*(tint_symbol_3))[0].m[1].elements).zxy;
++  *(tint_symbol_2) = *(tint_symbol_3);
++  (*(tint_symbol_2))[1] = (*(tint_symbol_3))[2];
++  (*(tint_symbol_2))[3].m = (*(tint_symbol_3))[2].m;
++  (*(tint_symbol_2))[1].m[0].elements = packed_half3(half3((*(tint_symbol_3))[0].m[1].elements).zxy);
+ }
+ 
+-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_6 [[buffer(0)]], threadgroup tint_symbol_7* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<S, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6);
++kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<S_tint_packed_vec3, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..5e6d6238c8
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat2x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,91 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.649407600 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_workgroup.wgsl.expected.msl
+@@ -18,16 +18,6 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct S {
+-  int before;
+-  float2x3 m;
+-  int after;
+-};
+-
+-struct tint_symbol_7 {
+-  tint_array<S, 4> w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+@@ -42,44 +32,45 @@ struct S_tint_packed_vec3 {
+   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_3;
+ };
+ 
+-float2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 2> in) {
+-  float2x3 result = float2x3(float3(in[0].elements), float3(in[1].elements));
++tint_array<tint_packed_vec3_f32_array_element, 2> tint_pack_vec3_in_composite(float2x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 2> result = tint_array<tint_packed_vec3_f32_array_element, 2>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}};
+   return result;
+ }
+ 
+-S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
+-  S result = {};
++struct S {
++  int before;
++  float2x3 m;
++  int after;
++};
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
+   result.before = in.before;
+-  result.m = tint_unpack_vec3_in_composite(in.m);
++  result.m = tint_pack_vec3_in_composite(in.m);
+   result.after = in.after;
+   return result;
+ }
+ 
+-tint_array<S, 4> tint_unpack_vec3_in_composite_2(tint_array<S_tint_packed_vec3, 4> in) {
+-  tint_array<S, 4> result = tint_array<S, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
+-  return result;
+-}
+-
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S, 4>* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+     S const tint_symbol = S{};
+-    (*(tint_symbol_1))[i] = tint_symbol;
++    (*(tint_symbol_1))[i] = tint_pack_vec3_in_composite_1(tint_symbol);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<S, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+-  *(tint_symbol_2) = tint_unpack_vec3_in_composite_2(*(tint_symbol_3));
+-  (*(tint_symbol_2))[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_3))[2]);
+-  (*(tint_symbol_2))[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_3))[2].m);
+-  (*(tint_symbol_2))[1].m[0] = float3((*(tint_symbol_3))[0].m[1].elements).zxy;
++  *(tint_symbol_2) = *(tint_symbol_3);
++  (*(tint_symbol_2))[1] = (*(tint_symbol_3))[2];
++  (*(tint_symbol_2))[3].m = (*(tint_symbol_3))[2].m;
++  (*(tint_symbol_2))[1].m[0].elements = packed_float3(float3((*(tint_symbol_3))[0].m[1].elements).zxy);
+ }
+ 
+-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_6 [[buffer(0)]], threadgroup tint_symbol_7* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<S, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6);
++kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<S_tint_packed_vec3, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..07c73f653c
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,91 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.673399700 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_workgroup.wgsl.expected.msl
+@@ -18,16 +18,6 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct S {
+-  int before;
+-  half3x3 m;
+-  int after;
+-};
+-
+-struct tint_symbol_7 {
+-  tint_array<S, 4> w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+@@ -42,44 +32,45 @@ struct S_tint_packed_vec3 {
+   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_3;
+ };
+ 
+-half3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 3> in) {
+-  half3x3 result = half3x3(half3(in[0].elements), half3(in[1].elements), half3(in[2].elements));
++tint_array<tint_packed_vec3_f16_array_element, 3> tint_pack_vec3_in_composite(half3x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 3> result = tint_array<tint_packed_vec3_f16_array_element, 3>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[2])}};
+   return result;
+ }
+ 
+-S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
+-  S result = {};
++struct S {
++  int before;
++  half3x3 m;
++  int after;
++};
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
+   result.before = in.before;
+-  result.m = tint_unpack_vec3_in_composite(in.m);
++  result.m = tint_pack_vec3_in_composite(in.m);
+   result.after = in.after;
+   return result;
+ }
+ 
+-tint_array<S, 4> tint_unpack_vec3_in_composite_2(tint_array<S_tint_packed_vec3, 4> in) {
+-  tint_array<S, 4> result = tint_array<S, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
+-  return result;
+-}
+-
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S, 4>* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+     S const tint_symbol = S{};
+-    (*(tint_symbol_1))[i] = tint_symbol;
++    (*(tint_symbol_1))[i] = tint_pack_vec3_in_composite_1(tint_symbol);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<S, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+-  *(tint_symbol_2) = tint_unpack_vec3_in_composite_2(*(tint_symbol_3));
+-  (*(tint_symbol_2))[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_3))[2]);
+-  (*(tint_symbol_2))[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_3))[2].m);
+-  (*(tint_symbol_2))[1].m[0] = half3((*(tint_symbol_3))[0].m[1].elements).zxy;
++  *(tint_symbol_2) = *(tint_symbol_3);
++  (*(tint_symbol_2))[1] = (*(tint_symbol_3))[2];
++  (*(tint_symbol_2))[3].m = (*(tint_symbol_3))[2].m;
++  (*(tint_symbol_2))[1].m[0].elements = packed_half3(half3((*(tint_symbol_3))[0].m[1].elements).zxy);
+ }
+ 
+-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_6 [[buffer(0)]], threadgroup tint_symbol_7* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<S, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6);
++kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<S_tint_packed_vec3, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..82e06ec19c
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat3x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,91 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.673399700 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_workgroup.wgsl.expected.msl
+@@ -18,16 +18,6 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct S {
+-  int before;
+-  float3x3 m;
+-  int after;
+-};
+-
+-struct tint_symbol_7 {
+-  tint_array<S, 4> w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+@@ -41,44 +31,45 @@ struct S_tint_packed_vec3 {
+   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_2;
+ };
+ 
+-float3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 3> in) {
+-  float3x3 result = float3x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements));
++tint_array<tint_packed_vec3_f32_array_element, 3> tint_pack_vec3_in_composite(float3x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 3> result = tint_array<tint_packed_vec3_f32_array_element, 3>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[2])}};
+   return result;
+ }
+ 
+-S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
+-  S result = {};
++struct S {
++  int before;
++  float3x3 m;
++  int after;
++};
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
+   result.before = in.before;
+-  result.m = tint_unpack_vec3_in_composite(in.m);
++  result.m = tint_pack_vec3_in_composite(in.m);
+   result.after = in.after;
+   return result;
+ }
+ 
+-tint_array<S, 4> tint_unpack_vec3_in_composite_2(tint_array<S_tint_packed_vec3, 4> in) {
+-  tint_array<S, 4> result = tint_array<S, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
+-  return result;
+-}
+-
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S, 4>* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+     S const tint_symbol = S{};
+-    (*(tint_symbol_1))[i] = tint_symbol;
++    (*(tint_symbol_1))[i] = tint_pack_vec3_in_composite_1(tint_symbol);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<S, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+-  *(tint_symbol_2) = tint_unpack_vec3_in_composite_2(*(tint_symbol_3));
+-  (*(tint_symbol_2))[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_3))[2]);
+-  (*(tint_symbol_2))[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_3))[2].m);
+-  (*(tint_symbol_2))[1].m[0] = float3((*(tint_symbol_3))[0].m[1].elements).zxy;
++  *(tint_symbol_2) = *(tint_symbol_3);
++  (*(tint_symbol_2))[1] = (*(tint_symbol_3))[2];
++  (*(tint_symbol_2))[3].m = (*(tint_symbol_3))[2].m;
++  (*(tint_symbol_2))[1].m[0].elements = packed_float3(float3((*(tint_symbol_3))[0].m[1].elements).zxy);
+ }
+ 
+-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_6 [[buffer(0)]], threadgroup tint_symbol_7* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<S, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6);
++kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<S_tint_packed_vec3, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..ce2dc23f9b
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,91 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.701390500 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_workgroup.wgsl.expected.msl
+@@ -18,16 +18,6 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct S {
+-  int before;
+-  half4x3 m;
+-  int after;
+-};
+-
+-struct tint_symbol_7 {
+-  tint_array<S, 4> w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+@@ -42,44 +32,45 @@ struct S_tint_packed_vec3 {
+   /* 0x0044 */ tint_array<int8_t, 60> tint_pad_3;
+ };
+ 
+-half4x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 4> in) {
+-  half4x3 result = half4x3(half3(in[0].elements), half3(in[1].elements), half3(in[2].elements), half3(in[3].elements));
++tint_array<tint_packed_vec3_f16_array_element, 4> tint_pack_vec3_in_composite(half4x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 4> result = tint_array<tint_packed_vec3_f16_array_element, 4>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[2])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[3])}};
+   return result;
+ }
+ 
+-S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
+-  S result = {};
++struct S {
++  int before;
++  half4x3 m;
++  int after;
++};
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
+   result.before = in.before;
+-  result.m = tint_unpack_vec3_in_composite(in.m);
++  result.m = tint_pack_vec3_in_composite(in.m);
+   result.after = in.after;
+   return result;
+ }
+ 
+-tint_array<S, 4> tint_unpack_vec3_in_composite_2(tint_array<S_tint_packed_vec3, 4> in) {
+-  tint_array<S, 4> result = tint_array<S, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
+-  return result;
+-}
+-
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S, 4>* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+     S const tint_symbol = S{};
+-    (*(tint_symbol_1))[i] = tint_symbol;
++    (*(tint_symbol_1))[i] = tint_pack_vec3_in_composite_1(tint_symbol);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<S, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+-  *(tint_symbol_2) = tint_unpack_vec3_in_composite_2(*(tint_symbol_3));
+-  (*(tint_symbol_2))[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_3))[2]);
+-  (*(tint_symbol_2))[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_3))[2].m);
+-  (*(tint_symbol_2))[1].m[0] = half3((*(tint_symbol_3))[0].m[1].elements).zxy;
++  *(tint_symbol_2) = *(tint_symbol_3);
++  (*(tint_symbol_2))[1] = (*(tint_symbol_3))[2];
++  (*(tint_symbol_2))[3].m = (*(tint_symbol_3))[2].m;
++  (*(tint_symbol_2))[1].m[0].elements = packed_half3(half3((*(tint_symbol_3))[0].m[1].elements).zxy);
+ }
+ 
+-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_6 [[buffer(0)]], threadgroup tint_symbol_7* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<S, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6);
++kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<S_tint_packed_vec3, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..cedfdc7ee2
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_struct_mat4x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,91 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.701390500 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_workgroup.wgsl.expected.msl
+@@ -18,16 +18,6 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-struct S {
+-  int before;
+-  float4x3 m;
+-  int after;
+-};
+-
+-struct tint_symbol_7 {
+-  tint_array<S, 4> w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+@@ -42,44 +32,45 @@ struct S_tint_packed_vec3 {
+   /* 0x0084 */ tint_array<int8_t, 60> tint_pad_3;
+ };
+ 
+-float4x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 4> in) {
+-  float4x3 result = float4x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements), float3(in[3].elements));
++tint_array<tint_packed_vec3_f32_array_element, 4> tint_pack_vec3_in_composite(float4x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 4> result = tint_array<tint_packed_vec3_f32_array_element, 4>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[2])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[3])}};
+   return result;
+ }
+ 
+-S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
+-  S result = {};
++struct S {
++  int before;
++  float4x3 m;
++  int after;
++};
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
+   result.before = in.before;
+-  result.m = tint_unpack_vec3_in_composite(in.m);
++  result.m = tint_pack_vec3_in_composite(in.m);
+   result.after = in.after;
+   return result;
+ }
+ 
+-tint_array<S, 4> tint_unpack_vec3_in_composite_2(tint_array<S_tint_packed_vec3, 4> in) {
+-  tint_array<S, 4> result = tint_array<S, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
+-  return result;
+-}
+-
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S, 4>* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
+     uint const i = idx;
+     S const tint_symbol = S{};
+-    (*(tint_symbol_1))[i] = tint_symbol;
++    (*(tint_symbol_1))[i] = tint_pack_vec3_in_composite_1(tint_symbol);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup tint_array<S, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<S_tint_packed_vec3, 4>* const tint_symbol_2, const constant tint_array<S_tint_packed_vec3, 4>* const tint_symbol_3) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+-  *(tint_symbol_2) = tint_unpack_vec3_in_composite_2(*(tint_symbol_3));
+-  (*(tint_symbol_2))[1] = tint_unpack_vec3_in_composite_1((*(tint_symbol_3))[2]);
+-  (*(tint_symbol_2))[3].m = tint_unpack_vec3_in_composite((*(tint_symbol_3))[2].m);
+-  (*(tint_symbol_2))[1].m[0] = float3((*(tint_symbol_3))[0].m[1].elements).zxy;
++  *(tint_symbol_2) = *(tint_symbol_3);
++  (*(tint_symbol_2))[1] = (*(tint_symbol_3))[2];
++  (*(tint_symbol_2))[3].m = (*(tint_symbol_3))[2].m;
++  (*(tint_symbol_2))[1].m[0].elements = packed_float3(float3((*(tint_symbol_3))[0].m[1].elements).zxy);
+ }
+ 
+-kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_6 [[buffer(0)]], threadgroup tint_symbol_7* tint_symbol_5 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<S, 4>* const tint_symbol_4 = &((*(tint_symbol_5)).w);
+-  f_inner(local_invocation_index, tint_symbol_4, tint_symbol_6);
++kernel void f(const constant tint_array<S_tint_packed_vec3, 4>* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<S_tint_packed_vec3, 4> tint_symbol_4;
++  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..5e32a34d33
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.717385300 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat2x3_f16/to_workgroup.wgsl.expected.msl
+@@ -14,38 +14,34 @@ struct tint_array {
+     T elements[N];
+ };
+ 
+-struct tint_symbol_6 {
+-  half2x3 w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+ };
+ 
+-half2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 2> in) {
+-  half2x3 result = half2x3(half3(in[0].elements), half3(in[1].elements));
++tint_array<tint_packed_vec3_f16_array_element, 2> tint_pack_vec3_in_composite(half2x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 2> result = tint_array<tint_packed_vec3_f16_array_element, 2>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup half2x3* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f16_array_element, 2>* const tint_symbol) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol) = half2x3(half3(0.0h), half3(0.0h));
++    *(tint_symbol) = tint_pack_vec3_in_composite(half2x3(half3(0.0h), half3(0.0h)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup half2x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 2>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f16_array_element, 2>* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 2>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements);
+-  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements).zxy;
+-  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1].elements = (*(tint_symbol_2))[0].elements;
++  (*(tint_symbol_1))[1].elements = packed_half3(half3((*(tint_symbol_2))[0].elements).zxy);
++  (*(tint_symbol_1))[0].elements[1] = (*(tint_symbol_2))[1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup half2x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 2>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f16_array_element, 2> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..b5af3e477e
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat2x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.725382800 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat2x3_f32/to_workgroup.wgsl.expected.msl
+@@ -14,38 +14,34 @@ struct tint_array {
+     T elements[N];
+ };
+ 
+-struct tint_symbol_6 {
+-  float2x3 w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+ };
+ 
+-float2x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 2> in) {
+-  float2x3 result = float2x3(float3(in[0].elements), float3(in[1].elements));
++tint_array<tint_packed_vec3_f32_array_element, 2> tint_pack_vec3_in_composite(float2x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 2> result = tint_array<tint_packed_vec3_f32_array_element, 2>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup float2x3* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol) = float2x3(float3(0.0f), float3(0.0f));
++    *(tint_symbol) = tint_pack_vec3_in_composite(float2x3(float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup float2x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = float3((*(tint_symbol_2))[0].elements);
+-  (*(tint_symbol_1))[1] = float3((*(tint_symbol_2))[0].elements).zxy;
+-  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1].elements = (*(tint_symbol_2))[0].elements;
++  (*(tint_symbol_1))[1].elements = packed_float3(float3((*(tint_symbol_2))[0].elements).zxy);
++  (*(tint_symbol_1))[0].elements[1] = (*(tint_symbol_2))[1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup float2x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 2>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 2> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..54f78e4657
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.737378800 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat3x3_f16/to_workgroup.wgsl.expected.msl
+@@ -14,38 +14,34 @@ struct tint_array {
+     T elements[N];
+ };
+ 
+-struct tint_symbol_6 {
+-  half3x3 w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+ };
+ 
+-half3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 3> in) {
+-  half3x3 result = half3x3(half3(in[0].elements), half3(in[1].elements), half3(in[2].elements));
++tint_array<tint_packed_vec3_f16_array_element, 3> tint_pack_vec3_in_composite(half3x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 3> result = tint_array<tint_packed_vec3_f16_array_element, 3>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[2])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup half3x3* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f16_array_element, 3>* const tint_symbol) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol) = half3x3(half3(0.0h), half3(0.0h), half3(0.0h));
++    *(tint_symbol) = tint_pack_vec3_in_composite(half3x3(half3(0.0h), half3(0.0h), half3(0.0h)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup half3x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 3>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f16_array_element, 3>* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 3>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements);
+-  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements).zxy;
+-  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1].elements = (*(tint_symbol_2))[0].elements;
++  (*(tint_symbol_1))[1].elements = packed_half3(half3((*(tint_symbol_2))[0].elements).zxy);
++  (*(tint_symbol_1))[0].elements[1] = (*(tint_symbol_2))[1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup half3x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 3>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f16_array_element, 3> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..f4357ffbf5
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat3x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.741377600 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat3x3_f32/to_workgroup.wgsl.expected.msl
+@@ -14,38 +14,34 @@ struct tint_array {
+     T elements[N];
+ };
+ 
+-struct tint_symbol_6 {
+-  float3x3 w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+ };
+ 
+-float3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 3> in) {
+-  float3x3 result = float3x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements));
++tint_array<tint_packed_vec3_f32_array_element, 3> tint_pack_vec3_in_composite(float3x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 3> result = tint_array<tint_packed_vec3_f32_array_element, 3>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[2])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup float3x3* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol) = float3x3(float3(0.0f), float3(0.0f), float3(0.0f));
++    *(tint_symbol) = tint_pack_vec3_in_composite(float3x3(float3(0.0f), float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup float3x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = float3((*(tint_symbol_2))[0].elements);
+-  (*(tint_symbol_1))[1] = float3((*(tint_symbol_2))[0].elements).zxy;
+-  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1].elements = (*(tint_symbol_2))[0].elements;
++  (*(tint_symbol_1))[1].elements = packed_float3(float3((*(tint_symbol_2))[0].elements).zxy);
++  (*(tint_symbol_1))[0].elements[1] = (*(tint_symbol_2))[1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup float3x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 3>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 3> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f16_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f16_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..704c50cc88
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f16_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.753373600 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat4x3_f16/to_workgroup.wgsl.expected.msl
+@@ -14,38 +14,34 @@ struct tint_array {
+     T elements[N];
+ };
+ 
+-struct tint_symbol_6 {
+-  half4x3 w;
+-};
+-
+ struct tint_packed_vec3_f16_array_element {
+   /* 0x0000 */ packed_half3 elements;
+   /* 0x0006 */ tint_array<int8_t, 2> tint_pad;
+ };
+ 
+-half4x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f16_array_element, 4> in) {
+-  half4x3 result = half4x3(half3(in[0].elements), half3(in[1].elements), half3(in[2].elements), half3(in[3].elements));
++tint_array<tint_packed_vec3_f16_array_element, 4> tint_pack_vec3_in_composite(half4x3 in) {
++  tint_array<tint_packed_vec3_f16_array_element, 4> result = tint_array<tint_packed_vec3_f16_array_element, 4>{tint_packed_vec3_f16_array_element{.elements=packed_half3(in[0])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[1])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[2])}, tint_packed_vec3_f16_array_element{.elements=packed_half3(in[3])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup half4x3* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f16_array_element, 4>* const tint_symbol) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol) = half4x3(half3(0.0h), half3(0.0h), half3(0.0h), half3(0.0h));
++    *(tint_symbol) = tint_pack_vec3_in_composite(half4x3(half3(0.0h), half3(0.0h), half3(0.0h), half3(0.0h)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup half4x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 4>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f16_array_element, 4>* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f16_array_element, 4>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements);
+-  (*(tint_symbol_1))[1] = half3((*(tint_symbol_2))[0].elements).zxy;
+-  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1].elements = (*(tint_symbol_2))[0].elements;
++  (*(tint_symbol_1))[1].elements = packed_half3(half3((*(tint_symbol_2))[0].elements).zxy);
++  (*(tint_symbol_1))[0].elements[1] = (*(tint_symbol_2))[1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup half4x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_packed_vec3_f16_array_element, 4>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f16_array_element, 4> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f32_to__workgroup.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f32_to__workgroup.wgsl.expected.msl
new file mode 100644
index 0000000000..c13f4ff367
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_buffer_uniform_std140_unnested_mat4x3__f32_to__workgroup.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_workgroup.wgsl.expected.msl.orig	2024-10-18 12:38:01.757372400 +0000
++++ third_party/dawn/test/tint/buffer/uniform/std140/unnested/mat4x3_f32/to_workgroup.wgsl.expected.msl
+@@ -14,38 +14,34 @@ struct tint_array {
+     T elements[N];
+ };
+ 
+-struct tint_symbol_6 {
+-  float4x3 w;
+-};
+-
+ struct tint_packed_vec3_f32_array_element {
+   /* 0x0000 */ packed_float3 elements;
+   /* 0x000c */ tint_array<int8_t, 4> tint_pad;
+ };
+ 
+-float4x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 4> in) {
+-  float4x3 result = float4x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements), float3(in[3].elements));
++tint_array<tint_packed_vec3_f32_array_element, 4> tint_pack_vec3_in_composite(float4x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 4> result = tint_array<tint_packed_vec3_f32_array_element, 4>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[2])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[3])}};
+   return result;
+ }
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup float4x3* const tint_symbol) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f32_array_element, 4>* const tint_symbol) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol) = float4x3(float3(0.0f), float3(0.0f), float3(0.0f), float3(0.0f));
++    *(tint_symbol) = tint_pack_vec3_in_composite(float4x3(float3(0.0f), float3(0.0f), float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void f_inner(uint local_invocation_index, threadgroup float4x3* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f32_array_element, 4>* const tint_symbol_2) {
++void f_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f32_array_element, 4>* const tint_symbol_1, const constant tint_array<tint_packed_vec3_f32_array_element, 4>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
+-  *(tint_symbol_1) = tint_unpack_vec3_in_composite(*(tint_symbol_2));
+-  (*(tint_symbol_1))[1] = float3((*(tint_symbol_2))[0].elements);
+-  (*(tint_symbol_1))[1] = float3((*(tint_symbol_2))[0].elements).zxy;
+-  (*(tint_symbol_1))[0][1] = (*(tint_symbol_2))[1].elements[0];
++  *(tint_symbol_1) = *(tint_symbol_2);
++  (*(tint_symbol_1))[1].elements = (*(tint_symbol_2))[0].elements;
++  (*(tint_symbol_1))[1].elements = packed_float3(float3((*(tint_symbol_2))[0].elements).zxy);
++  (*(tint_symbol_1))[0].elements[1] = (*(tint_symbol_2))[1].elements[0];
+ }
+ 
+-kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol_5 [[buffer(0)]], threadgroup tint_symbol_6* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup float4x3* const tint_symbol_3 = &((*(tint_symbol_4)).w);
+-  f_inner(local_invocation_index, tint_symbol_3, tint_symbol_5);
++kernel void f(const constant tint_array<tint_packed_vec3_f32_array_element, 4>* tint_symbol_4 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 4> tint_symbol_3;
++  f_inner(local_invocation_index, &(tint_symbol_3), tint_symbol_4);
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl
index 173cc30c99..9b61660aed 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.orig	2025-01-19 14:12:04.115215816 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.orig	2025-02-15 09:43:46.458294667 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl
 @@ -0,0 +1,10 @@
 +// flags: --transform robustness
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl
index c6aa11e802..9580231280 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.dxc.hlsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.dxc.hlsl.orig	2025-01-19 14:12:04.115348834 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.dxc.hlsl.orig	2025-02-15 09:43:46.458449256 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.dxc.hlsl
 @@ -0,0 +1,13 @@
 +cbuffer cbuffer_level : register(b0) {
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl
index d673382bc3..2c2025c573 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.fxc.hlsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.fxc.hlsl.orig	2025-01-19 14:12:04.115470871 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.fxc.hlsl.orig	2025-02-15 09:43:46.458605840 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.fxc.hlsl
 @@ -0,0 +1,13 @@
 +cbuffer cbuffer_level : register(b0) {
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl
index a60f8a0990..7c5f2f7fa8 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.glsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.glsl.orig	2025-01-19 14:12:04.115591956 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.glsl.orig	2025-02-15 09:43:46.458756271 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.glsl
 @@ -0,0 +1,27 @@
 +#version 310 es
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl
index c79fba67ac..f2ab072cb9 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.dxc.hlsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.dxc.hlsl.orig	2025-01-19 14:12:04.115728591 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.dxc.hlsl.orig	2025-02-15 09:43:46.458907925 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.dxc.hlsl
 @@ -0,0 +1,22 @@
 +
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl
index f7251f23a7..853a000aca 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.fxc.hlsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.fxc.hlsl.orig	2025-01-19 14:12:04.115847261 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.fxc.hlsl.orig	2025-02-15 09:43:46.459059780 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.fxc.hlsl
 @@ -0,0 +1,22 @@
 +
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl
index 16f7c5d764..0de4b43922 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.ir.msl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.msl.orig	2025-01-19 14:12:04.115976703 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.msl.orig	2025-02-15 09:43:46.459222105 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.ir.msl
 @@ -0,0 +1,17 @@
 +#include <metal_stdlib>
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl
index 4bace5abe8..85fa52c27c 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.msl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.msl.orig	2025-01-19 14:12:04.116105242 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.msl.orig	2025-02-15 09:43:46.459371935 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.msl
 @@ -0,0 +1,9 @@
 +#include <metal_stdlib>
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm
index a9f2ba86bc..a2e0fa058e 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.spvasm
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.spvasm.orig	2025-01-19 14:12:04.116224013 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.spvasm.orig	2025-02-15 09:43:46.459522858 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.spvasm
 @@ -0,0 +1,70 @@
 +; SPIR-V
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl
index a57f41bfdd..a412fb7596 100644
--- a/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_chromium_378541479.wgsl.expected.wgsl
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.wgsl.orig	2025-01-19 14:12:04.116352803 +0000
+--- third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.wgsl.orig	2025-02-15 09:43:46.459678199 +0000
 +++ third_party/dawn/test/tint/bug/chromium/378541479.wgsl.expected.wgsl
 @@ -0,0 +1,10 @@
 +@group(0) @binding(0) var<uniform> level : u32;
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366037039.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366037039.wgsl.expected.msl
new file mode 100644
index 0000000000..a555885163
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366037039.wgsl.expected.msl
@@ -0,0 +1,94 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/bug/tint/366037039.wgsl.expected.msl.orig	2025-02-15 09:43:46.459840553 +0000
++++ third_party/dawn/test/tint/bug/tint/366037039.wgsl.expected.msl
+@@ -0,0 +1,85 @@
++#include <metal_stdlib>
++
++using namespace metal;
++
++template<typename T, size_t N>
++struct tint_array {
++    const constant T& operator[](size_t i) const constant { return elements[i]; }
++    device T& operator[](size_t i) device { return elements[i]; }
++    const device T& operator[](size_t i) const device { return elements[i]; }
++    thread T& operator[](size_t i) thread { return elements[i]; }
++    const thread T& operator[](size_t i) const thread { return elements[i]; }
++    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
++    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
++    T elements[N];
++};
++
++#define TINT_ISOLATE_UB(VOLATILE_NAME) \
++  {volatile bool VOLATILE_NAME = false; if (VOLATILE_NAME) break;}
++
++struct tint_packed_vec3_u32_array_element {
++  /* 0x0000 */ packed_uint3 elements;
++  /* 0x000c */ tint_array<int8_t, 4> tint_pad;
++};
++
++struct S_tint_packed_vec3 {
++  /* 0x0000 */ packed_uint3 a;
++  /* 0x000c */ uint b;
++  /* 0x0010 */ tint_array<tint_packed_vec3_u32_array_element, 4> c;
++};
++
++tint_array<uint3, 4> tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_u32_array_element, 4> in) {
++  tint_array<uint3, 4> result = tint_array<uint3, 4>{uint3(in[0].elements), uint3(in[1].elements), uint3(in[2].elements), uint3(in[3].elements)};
++  return result;
++}
++
++struct S {
++  uint3 a;
++  uint b;
++  tint_array<uint3, 4> c;
++};
++
++S tint_unpack_vec3_in_composite_1(S_tint_packed_vec3 in) {
++  S result = {};
++  result.a = uint3(in.a);
++  result.b = in.b;
++  result.c = tint_unpack_vec3_in_composite(in.c);
++  return result;
++}
++
++tint_array<tint_packed_vec3_u32_array_element, 4> tint_pack_vec3_in_composite(tint_array<uint3, 4> in) {
++  tint_array<tint_packed_vec3_u32_array_element, 4> result = tint_array<tint_packed_vec3_u32_array_element, 4>{tint_packed_vec3_u32_array_element{.elements=packed_uint3(in[0])}, tint_packed_vec3_u32_array_element{.elements=packed_uint3(in[1])}, tint_packed_vec3_u32_array_element{.elements=packed_uint3(in[2])}, tint_packed_vec3_u32_array_element{.elements=packed_uint3(in[3])}};
++  return result;
++}
++
++S_tint_packed_vec3 tint_pack_vec3_in_composite_1(S in) {
++  S_tint_packed_vec3 result = {};
++  result.a = packed_uint3(in.a);
++  result.b = in.b;
++  result.c = tint_pack_vec3_in_composite(in.c);
++  return result;
++}
++
++void assign_and_preserve_padding_1(device tint_array<tint_packed_vec3_u32_array_element, 4>* const dest, tint_array<uint3, 4> value) {
++  for(uint i = 0u; (i < 4u); i = (i + 1u)) {
++    TINT_ISOLATE_UB(tint_volatile_false);
++    (*(dest))[i].elements = packed_uint3(value[i]);
++  }
++}
++
++void assign_and_preserve_padding(device S_tint_packed_vec3* const dest, S value) {
++  (*(dest)).a = packed_uint3(value.a);
++  (*(dest)).b = value.b;
++  assign_and_preserve_padding_1(&((*(dest)).c), value.c);
++}
++
++void foo(const constant S_tint_packed_vec3* const tint_symbol_2, device S_tint_packed_vec3* const tint_symbol_3, threadgroup S_tint_packed_vec3* const tint_symbol_4) {
++  S const u = tint_unpack_vec3_in_composite_1(*(tint_symbol_2));
++  S const s = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
++  S const w = tint_unpack_vec3_in_composite_1(*(tint_symbol_3));
++  S const tint_symbol = S{};
++  assign_and_preserve_padding(tint_symbol_3, tint_symbol);
++  S const tint_symbol_1 = S{};
++  *(tint_symbol_4) = tint_pack_vec3_in_composite_1(tint_symbol_1);
++}
++
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366314931.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366314931.wgsl.expected.msl
new file mode 100644
index 0000000000..689e7786da
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_366314931.wgsl.expected.msl
@@ -0,0 +1,42 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/bug/tint/366314931.wgsl.expected.msl.orig	2025-02-15 09:43:46.460012907 +0000
++++ third_party/dawn/test/tint/bug/tint/366314931.wgsl.expected.msl
+@@ -0,0 +1,33 @@
++#include <metal_stdlib>
++
++using namespace metal;
++struct S_tint_packed_vec3 {
++  /* 0x0000 */ packed_uint3 v;
++  /* 0x000c */ atomic_uint u;
++};
++
++void tint_zero_workgroup_memory(uint local_idx, threadgroup S_tint_packed_vec3* const tint_symbol_1) {
++  if ((local_idx < 1u)) {
++    (*(tint_symbol_1)).v = packed_uint3(0u);
++    atomic_store_explicit(&((*(tint_symbol_1)).u), 0u, memory_order_relaxed);
++  }
++  threadgroup_barrier(mem_flags::mem_threadgroup);
++}
++
++struct S {
++  uint3 v;
++  atomic_uint u;
++};
++
++void tint_symbol_inner(uint local_invocation_index, threadgroup S_tint_packed_vec3* const tint_symbol_2, device S_tint_packed_vec3* const tint_symbol_3) {
++  tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
++  uint const x = atomic_load_explicit(&((*(tint_symbol_2)).u), memory_order_relaxed);
++  atomic_store_explicit(&((*(tint_symbol_3)).u), x, memory_order_relaxed);
++}
++
++kernel void tint_symbol(device S_tint_packed_vec3* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup S_tint_packed_vec3 tint_symbol_4;
++  tint_symbol_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
++  return;
++}
++
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_942.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_942.wgsl.expected.msl
new file mode 100644
index 0000000000..97a38529ad
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_bug_tint_942.wgsl.expected.msl
@@ -0,0 +1,62 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/bug/tint/942.wgsl.expected.msl.orig	2024-10-18 12:38:01.861338400 +0000
++++ third_party/dawn/test/tint/bug/tint/942.wgsl.expected.msl
+@@ -18,11 +18,15 @@ struct tint_array {
+   volatile bool VOLATILE_NAME = true; \
+   if (VOLATILE_NAME)
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<float3, 256>, 4>* const tint_symbol_1) {
++struct tint_packed_vec3_f32_array_element {
++  packed_float3 elements;
++};
++
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 256>, 4>* const tint_symbol_1) {
+   TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 1024u); idx = (idx + 64u)) {
+     uint const i_1 = (idx / 256u);
+     uint const i_2 = (idx % 256u);
+-    (*(tint_symbol_1))[i_1][i_2] = float3(0.0f);
++    (*(tint_symbol_1))[i_1][i_2].elements = packed_float3(0.0f);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+@@ -40,7 +44,7 @@ uint tint_div(uint lhs, uint rhs) {
+   return (lhs / select(rhs, 1u, (rhs == 0u)));
+ }
+ 
+-void tint_symbol_inner(uint3 WorkGroupID, uint3 LocalInvocationID, uint local_invocation_index, threadgroup tint_array<tint_array<float3, 256>, 4>* const tint_symbol_2, const constant Params* const tint_symbol_3, texture2d<float, access::sample> tint_symbol_4, const constant Flip* const tint_symbol_5, sampler tint_symbol_6, texture2d<float, access::write> tint_symbol_7) {
++void tint_symbol_inner(uint3 WorkGroupID, uint3 LocalInvocationID, uint local_invocation_index, threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 256>, 4>* const tint_symbol_2, const constant Params* const tint_symbol_3, texture2d<float, access::sample> tint_symbol_4, const constant Flip* const tint_symbol_5, sampler tint_symbol_6, texture2d<float, access::write> tint_symbol_7) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+   uint const filterOffset = tint_div(((*(tint_symbol_3)).filterDim - 1u), 2u);
+   uint2 const dims = uint2(tint_symbol_4.get_width(0), tint_symbol_4.get_height(0));
+@@ -51,7 +55,7 @@ void tint_symbol_inner(uint3 WorkGroupID
+       if (((*(tint_symbol_5)).value != 0u)) {
+         loadIndex = loadIndex.yx;
+       }
+-      (*(tint_symbol_2))[r][((4u * LocalInvocationID[0]) + c)] = tint_symbol_4.sample(tint_symbol_6, ((float2(loadIndex) + float2(0.25f)) / float2(dims)), level(0.0f)).rgb;
++      (*(tint_symbol_2))[r][((4u * LocalInvocationID[0]) + c)].elements = packed_float3(tint_symbol_4.sample(tint_symbol_6, ((float2(loadIndex) + float2(0.25f)) / float2(dims)), level(0.0f)).rgb);
+     }
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+@@ -66,7 +70,7 @@ void tint_symbol_inner(uint3 WorkGroupID
+         float3 acc = float3(0.0f);
+         TINT_ISOLATE_UB(tint_volatile_true_5) for(uint f = 0u; (f < (*(tint_symbol_3)).filterDim); f = (f + 1u)) {
+           uint i = ((center + f) - filterOffset);
+-          acc = (acc + ((1.0f / float((*(tint_symbol_3)).filterDim)) * (*(tint_symbol_2))[r][i]));
++          acc = (acc + ((1.0f / float((*(tint_symbol_3)).filterDim)) * float3((*(tint_symbol_2))[r][i].elements)));
+         }
+         tint_symbol_7.write(float4(acc, 1.0f), uint2(writeIndex));
+       }
+@@ -75,7 +79,7 @@ void tint_symbol_inner(uint3 WorkGroupID
+ }
+ 
+ kernel void tint_symbol(const constant Params* tint_symbol_9 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_10 [[texture(0)]], const constant Flip* tint_symbol_11 [[buffer(1)]], sampler tint_symbol_12 [[sampler(0)]], texture2d<float, access::write> tint_symbol_13 [[texture(1)]], uint3 WorkGroupID [[threadgroup_position_in_grid]], uint3 LocalInvocationID [[thread_position_in_threadgroup]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup tint_array<tint_array<float3, 256>, 4> tint_symbol_8;
++  threadgroup tint_array<tint_array<tint_packed_vec3_f32_array_element, 256>, 4> tint_symbol_8;
+   tint_symbol_inner(WorkGroupID, LocalInvocationID, local_invocation_index, &(tint_symbol_8), tint_symbol_9, tint_symbol_10, tint_symbol_11, tint_symbol_12, tint_symbol_13);
+   return;
+ }
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_matrix.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_matrix.wgsl.expected.msl
new file mode 100644
index 0000000000..ae9e624915
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_matrix.wgsl.expected.msl
@@ -0,0 +1,48 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/builtins/workgroupUniformLoad/matrix.wgsl.expected.msl.orig	2024-10-18 12:38:05.975993900 +0000
++++ third_party/dawn/test/tint/builtins/workgroupUniformLoad/matrix.wgsl.expected.msl
+@@ -1,14 +1,36 @@
+ #include <metal_stdlib>
+ 
+ using namespace metal;
+-float3x3 tint_workgroupUniformLoad(threadgroup float3x3* const p) {
++
++template<typename T, size_t N>
++struct tint_array {
++    const constant T& operator[](size_t i) const constant { return elements[i]; }
++    device T& operator[](size_t i) device { return elements[i]; }
++    const device T& operator[](size_t i) const device { return elements[i]; }
++    thread T& operator[](size_t i) thread { return elements[i]; }
++    const thread T& operator[](size_t i) const thread { return elements[i]; }
++    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
++    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
++    T elements[N];
++};
++
++struct tint_packed_vec3_f32_array_element {
++  packed_float3 elements;
++};
++
++float3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 3> in) {
++  float3x3 result = float3x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements));
++  return result;
++}
++
++float3x3 tint_workgroupUniformLoad(threadgroup tint_array<tint_packed_vec3_f32_array_element, 3>* const p) {
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+-  float3x3 const result = *(p);
++  float3x3 const result = tint_unpack_vec3_in_composite(*(p));
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+   return result;
+ }
+ 
+-float3x3 foo(threadgroup float3x3* const tint_symbol) {
++float3x3 foo(threadgroup tint_array<tint_packed_vec3_f32_array_element, 3>* const tint_symbol) {
+   return tint_workgroupUniformLoad(tint_symbol);
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_structures.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_structures.wgsl.expected.msl
new file mode 100644
index 0000000000..2b64cdf7c4
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_builtins_workgroupUniformLoad_structures.wgsl.expected.msl
@@ -0,0 +1,74 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/builtins/workgroupUniformLoad/structures.wgsl.expected.msl.orig	2024-10-18 12:38:05.975993900 +0000
++++ third_party/dawn/test/tint/builtins/workgroupUniformLoad/structures.wgsl.expected.msl
+@@ -14,24 +14,62 @@ struct tint_array {
+     T elements[N];
+ };
+ 
++struct tint_packed_vec3_f32_array_element {
++  packed_float3 elements;
++};
++
++struct Inner_tint_packed_vec3 {
++  bool b;
++  int4 v;
++  tint_array<tint_packed_vec3_f32_array_element, 3> m;
++};
++
++struct Outer_tint_packed_vec3 {
++  tint_array<Inner_tint_packed_vec3, 4> a;
++};
++
++float3x3 tint_unpack_vec3_in_composite(tint_array<tint_packed_vec3_f32_array_element, 3> in) {
++  float3x3 result = float3x3(float3(in[0].elements), float3(in[1].elements), float3(in[2].elements));
++  return result;
++}
++
+ struct Inner {
+   bool b;
+   int4 v;
+   float3x3 m;
+ };
+ 
++Inner tint_unpack_vec3_in_composite_1(Inner_tint_packed_vec3 in) {
++  Inner result = {};
++  result.b = in.b;
++  result.v = in.v;
++  result.m = tint_unpack_vec3_in_composite(in.m);
++  return result;
++}
++
++tint_array<Inner, 4> tint_unpack_vec3_in_composite_2(tint_array<Inner_tint_packed_vec3, 4> in) {
++  tint_array<Inner, 4> result = tint_array<Inner, 4>{tint_unpack_vec3_in_composite_1(in[0]), tint_unpack_vec3_in_composite_1(in[1]), tint_unpack_vec3_in_composite_1(in[2]), tint_unpack_vec3_in_composite_1(in[3])};
++  return result;
++}
++
+ struct Outer {
+   tint_array<Inner, 4> a;
+ };
+ 
+-Outer tint_workgroupUniformLoad(threadgroup Outer* const p) {
++Outer tint_unpack_vec3_in_composite_3(Outer_tint_packed_vec3 in) {
++  Outer result = {};
++  result.a = tint_unpack_vec3_in_composite_2(in.a);
++  return result;
++}
++
++Outer tint_workgroupUniformLoad(threadgroup Outer_tint_packed_vec3* const p) {
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+-  Outer const result = *(p);
++  Outer const result = tint_unpack_vec3_in_composite_3(*(p));
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+   return result;
+ }
+ 
+-Outer foo(threadgroup Outer* const tint_symbol) {
++Outer foo(threadgroup Outer_tint_packed_vec3* const tint_symbol) {
+   return tint_workgroupUniformLoad(tint_symbol);
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_matrix.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_matrix.wgsl.expected.msl
new file mode 100644
index 0000000000..8725d05b27
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_matrix.wgsl.expected.msl
@@ -0,0 +1,59 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/var/initialization/workgroup/matrix.wgsl.expected.msl.orig	2024-10-18 12:38:07.343547600 +0000
++++ third_party/dawn/test/tint/var/initialization/workgroup/matrix.wgsl.expected.msl
+@@ -1,24 +1,42 @@
+ #include <metal_stdlib>
+ 
+ using namespace metal;
+-struct tint_symbol_5 {
+-  float2x3 v;
++
++template<typename T, size_t N>
++struct tint_array {
++    const constant T& operator[](size_t i) const constant { return elements[i]; }
++    device T& operator[](size_t i) device { return elements[i]; }
++    const device T& operator[](size_t i) const device { return elements[i]; }
++    thread T& operator[](size_t i) thread { return elements[i]; }
++    const thread T& operator[](size_t i) const thread { return elements[i]; }
++    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
++    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
++    T elements[N];
++};
++
++struct tint_packed_vec3_f32_array_element {
++  packed_float3 elements;
+ };
+ 
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup float2x3* const tint_symbol_1) {
++tint_array<tint_packed_vec3_f32_array_element, 2> tint_pack_vec3_in_composite(float2x3 in) {
++  tint_array<tint_packed_vec3_f32_array_element, 2> result = tint_array<tint_packed_vec3_f32_array_element, 2>{tint_packed_vec3_f32_array_element{.elements=packed_float3(in[0])}, tint_packed_vec3_f32_array_element{.elements=packed_float3(in[1])}};
++  return result;
++}
++
++void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_1) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol_1) = float2x3(float3(0.0f), float3(0.0f));
++    *(tint_symbol_1) = tint_pack_vec3_in_composite(float2x3(float3(0.0f), float3(0.0f)));
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void tint_symbol_inner(uint local_invocation_index, threadgroup float2x3* const tint_symbol_2) {
++void tint_symbol_inner(uint local_invocation_index, threadgroup tint_array<tint_packed_vec3_f32_array_element, 2>* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+ }
+ 
+-kernel void tint_symbol(threadgroup tint_symbol_5* tint_symbol_4 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup float2x3* const tint_symbol_3 = &((*(tint_symbol_4)).v);
+-  tint_symbol_inner(local_invocation_index, tint_symbol_3);
++kernel void tint_symbol(uint local_invocation_index [[thread_index_in_threadgroup]]) {
++  threadgroup tint_array<tint_packed_vec3_f32_array_element, 2> tint_symbol_3;
++  tint_symbol_inner(local_invocation_index, &(tint_symbol_3));
+   return;
+ }
+ 
diff --git a/electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_vector.wgsl.expected.msl b/electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_vector.wgsl.expected.msl
new file mode 100644
index 0000000000..b44af909db
--- /dev/null
+++ b/electron32/patches/patch-third__party_dawn_test_tint_var_initialization_workgroup_vector.wgsl.expected.msl
@@ -0,0 +1,32 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/dawn/test/tint/var/initialization/workgroup/vector.wgsl.expected.msl.orig	2024-10-18 12:38:07.355543600 +0000
++++ third_party/dawn/test/tint/var/initialization/workgroup/vector.wgsl.expected.msl
+@@ -1,19 +1,19 @@
+ #include <metal_stdlib>
+ 
+ using namespace metal;
+-void tint_zero_workgroup_memory(uint local_idx, threadgroup int3* const tint_symbol_1) {
++void tint_zero_workgroup_memory(uint local_idx, threadgroup packed_int3* const tint_symbol_1) {
+   if ((local_idx < 1u)) {
+-    *(tint_symbol_1) = int3(0);
++    *(tint_symbol_1) = packed_int3(0);
+   }
+   threadgroup_barrier(mem_flags::mem_threadgroup);
+ }
+ 
+-void tint_symbol_inner(uint local_invocation_index, threadgroup int3* const tint_symbol_2) {
++void tint_symbol_inner(uint local_invocation_index, threadgroup packed_int3* const tint_symbol_2) {
+   tint_zero_workgroup_memory(local_invocation_index, tint_symbol_2);
+ }
+ 
+ kernel void tint_symbol(uint local_invocation_index [[thread_index_in_threadgroup]]) {
+-  threadgroup int3 tint_symbol_3;
++  threadgroup packed_int3 tint_symbol_3;
+   tint_symbol_inner(local_invocation_index, &(tint_symbol_3));
+   return;
+ }
diff --git a/electron32/patches/patch-third__party_skia_src_gpu_ganesh_ops_AAHairLinePathRenderer.cpp b/electron32/patches/patch-third__party_skia_src_gpu_ganesh_ops_AAHairLinePathRenderer.cpp
new file mode 100644
index 0000000000..f3b1d51c04
--- /dev/null
+++ b/electron32/patches/patch-third__party_skia_src_gpu_ganesh_ops_AAHairLinePathRenderer.cpp
@@ -0,0 +1,50 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- third_party/skia/src/gpu/ganesh/ops/AAHairLinePathRenderer.cpp.orig	2024-10-18 12:42:56.942844400 +0000
++++ third_party/skia/src/gpu/ganesh/ops/AAHairLinePathRenderer.cpp
+@@ -10,6 +10,7 @@
+ #include "include/core/SkPoint3.h"
+ #include "include/private/base/SkFloatingPoint.h"
+ #include "include/private/base/SkTemplates.h"
++#include "src/base/SkSafeMath.h"
+ #include "src/core/SkGeometry.h"
+ #include "src/core/SkMatrixPriv.h"
+ #include "src/core/SkPointPriv.h"
+@@ -1179,16 +1180,28 @@ void AAHairlineOp::onPrepareDraws(GrMesh
+ 
+     int instanceCount = fPaths.size();
+     bool convertConicsToQuads = !target->caps().shaderCaps()->fFloatIs32Bits;
+-    for (int i = 0; i < instanceCount; i++) {
++    SkSafeMath safeMath;
++    for (int i = 0; i < instanceCount && safeMath.ok(); i++) {
+         const PathData& args = fPaths[i];
+-        quadCount += gather_lines_and_quads(args.fPath, args.fViewMatrix, args.fDevClipBounds,
+-                                            args.fCapLength, convertConicsToQuads, &lines, &quads,
+-                                            &conics, &qSubdivs, &cWeights);
++        quadCount = safeMath.addInt(quadCount,
++                                    gather_lines_and_quads(args.fPath,
++                                                           args.fViewMatrix,
++                                                           args.fDevClipBounds,
++                                                           args.fCapLength,
++                                                           convertConicsToQuads,
++                                                           &lines,
++                                                           &quads,
++                                                           &conics,
++                                                           &qSubdivs,
++                                                           &cWeights));
+     }
+ 
+     int lineCount = lines.size() / 2;
+     int conicCount = conics.size() / 3;
+-    int quadAndConicCount = conicCount + quadCount;
++    int quadAndConicCount = safeMath.addInt(conicCount, quadCount);
++    if (!safeMath.ok()) {
++        return;
++    }
+ 
+     static constexpr int kMaxLines = SK_MaxS32 / kLineSegNumVertices;
+     static constexpr int kMaxQuadsAndConics = SK_MaxS32 / kQuadNumVertices;
diff --git a/electron32/patches/patch-third__party_speech-dispatcher_libspeechd__version.h b/electron32/patches/patch-third__party_speech-dispatcher_libspeechd__version.h
index f2a9f27811..442b95ae5e 100644
--- a/electron32/patches/patch-third__party_speech-dispatcher_libspeechd__version.h
+++ b/electron32/patches/patch-third__party_speech-dispatcher_libspeechd__version.h
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- third_party/speech-dispatcher/libspeechd_version.h.orig	2025-01-19 14:12:04.155208747 +0000
+--- third_party/speech-dispatcher/libspeechd_version.h.orig	2025-02-15 09:43:46.499540979 +0000
 +++ third_party/speech-dispatcher/libspeechd_version.h
 @@ -0,0 +1,29 @@
 +/*
diff --git a/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc b/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc
index a68c13a027..70ce8bfd54 100644
--- a/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc
+++ b/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.cc
@@ -6,16 +6,64 @@ $NetBSD$
 
 --- ui/shell_dialogs/select_file_dialog_linux_portal.cc.orig	2024-10-18 12:35:12.788244700 +0000
 +++ ui/shell_dialogs/select_file_dialog_linux_portal.cc
-@@ -39,7 +39,7 @@ constexpr char kMethodStartServiceByName
+@@ -7,6 +7,7 @@
+ #include <string_view>
+ 
+ #include "base/containers/contains.h"
++#include "base/command_line.h"
+ #include "base/functional/bind.h"
+ #include "base/logging.h"
+ #include "base/no_destructor.h"
+@@ -39,6 +40,8 @@ constexpr char kMethodStartServiceByName
  constexpr char kXdgPortalService[] = "org.freedesktop.portal.Desktop";
  constexpr char kXdgPortalObject[] = "/org/freedesktop/portal/desktop";
  
--constexpr int kXdgPortalRequiredVersion = 3;
-+constexpr int kXdgPortalRequiredVersion = 4;
++// Version 4 includes support for current_folder option to the OpenFile method via
++// https://github.com/flatpak/xdg-desktop-portal/commit/71165a5.
+ constexpr int kXdgPortalRequiredVersion = 3;
  
  constexpr char kXdgPortalRequestInterfaceName[] =
-     "org.freedesktop.portal.Request";
-@@ -216,6 +216,8 @@ void SelectFileDialogLinuxPortal::Select
+@@ -67,6 +70,7 @@ constexpr char kFileUriPrefix[] = "file:
+ 
+ // Time to wait for the notification service to start, in milliseconds.
+ constexpr base::TimeDelta kStartServiceTimeout = base::Seconds(1);
++const char kXdgPortalRequiredVersionFlag[] = "xdg-portal-required-version";
+ 
+ struct FileChooserProperties : dbus::PropertySet {
+   dbus::Property<uint32_t> version;
+@@ -173,10 +177,18 @@ void SelectFileDialogLinuxPortal::StartA
+   if (GetAvailabilityTestCompletionFlag()->IsSet())
+     return;
+ 
++  auto* cmd = base::CommandLine::ForCurrentProcess();
++  unsigned int xdg_portal_required_version;
++  if (!base::StringToUint(cmd->GetSwitchValueASCII(kXdgPortalRequiredVersionFlag),
++                          &xdg_portal_required_version)) {
++    xdg_portal_required_version = kXdgPortalRequiredVersion;
++  }
++
+   dbus_thread_linux::GetTaskRunner()->PostTask(
+       FROM_HERE,
+       base::BindOnce(
+-          &SelectFileDialogLinuxPortal::CheckPortalAvailabilityOnBusThread));
++          &SelectFileDialogLinuxPortal::CheckPortalAvailabilityOnBusThread,
++          xdg_portal_required_version));
+ }
+ 
+ // static
+@@ -188,6 +200,11 @@ bool SelectFileDialogLinuxPortal::IsPort
+ }
+ 
+ // static
++int SelectFileDialogLinuxPortal::GetPortalVersion() {
++  return available_portal_version_;
++}
++
++// static
+ void SelectFileDialogLinuxPortal::DestroyPortalConnection() {
+   dbus_thread_linux::GetTaskRunner()->PostTask(
+       FROM_HERE, base::BindOnce(&DestroyBusOnBusThread));
+@@ -216,6 +233,8 @@ void SelectFileDialogLinuxPortal::Select
                       weak_factory_.GetWeakPtr()));
    info_->type = type;
    info_->main_task_runner = base::SequencedTaskRunner::GetCurrentDefault();
@@ -24,7 +72,37 @@ $NetBSD$
  
    if (owning_window) {
      if (auto* root = owning_window->GetRootWindow()) {
-@@ -552,7 +554,9 @@ void SelectFileDialogLinuxPortal::Dialog
+@@ -262,7 +281,8 @@ bool SelectFileDialogLinuxPortal::HasMul
+ }
+ 
+ // static
+-void SelectFileDialogLinuxPortal::CheckPortalAvailabilityOnBusThread() {
++void SelectFileDialogLinuxPortal::CheckPortalAvailabilityOnBusThread(
++    unsigned int xdg_portal_required_version) {
+   DCHECK(dbus_thread_linux::GetTaskRunner()->RunsTasksInCurrentSequence());
+   base::AtomicFlag* availability_test_complete =
+       GetAvailabilityTestCompletionFlag();
+@@ -283,11 +303,18 @@ void SelectFileDialogLinuxPortal::CheckP
+     FileChooserProperties properties(portal);
+     if (!properties.GetAndBlock(&properties.version)) {
+       LOG(ERROR) << "Failed to read portal version property";
+-    } else if (properties.version.value() >= kXdgPortalRequiredVersion) {
++    } else if (properties.version.value() >= xdg_portal_required_version) {
+       is_portal_available_ = true;
++      available_portal_version_ = properties.version.value();
++    } else {
++      VLOG(1) << "File chooser portal available version: "
++              << properties.version.value();
++      available_portal_version_ = properties.version.value();
+     }
+   }
+ 
++  VLOG(1) << "File chooser portal expected version: "
++          << xdg_portal_required_version;
+   VLOG(1) << "File chooser portal available: "
+           << (is_portal_available_ ? "yes" : "no");
+   availability_test_complete->Set();
+@@ -552,7 +579,9 @@ void SelectFileDialogLinuxPortal::Dialog
                       response_handle_token);
  
    if (type == SelectFileDialog::Type::SELECT_UPLOAD_FOLDER) {
@@ -35,7 +113,7 @@ $NetBSD$
                         l10n_util::GetStringUTF8(
                             IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON));
    }
-@@ -561,12 +565,13 @@ void SelectFileDialogLinuxPortal::Dialog
+@@ -561,6 +590,8 @@ void SelectFileDialogLinuxPortal::Dialog
        type == SelectFileDialog::Type::SELECT_UPLOAD_FOLDER ||
        type == SelectFileDialog::Type::SELECT_EXISTING_FOLDER) {
      AppendBoolOption(&options_writer, kFileChooserOptionDirectory, true);
@@ -44,10 +122,11 @@ $NetBSD$
    } else if (type == SelectFileDialog::Type::SELECT_OPEN_MULTI_FILE) {
      AppendBoolOption(&options_writer, kFileChooserOptionMultiple, true);
    }
+@@ -874,6 +905,7 @@ SelectFileDialogLinuxPortal::DialogInfo:
+ }
+ 
+ bool SelectFileDialogLinuxPortal::is_portal_available_ = false;
++unsigned int SelectFileDialogLinuxPortal::available_portal_version_ = 0;
+ int SelectFileDialogLinuxPortal::handle_token_counter_ = 0;
  
--  if (type == SelectFileDialog::Type::SELECT_SAVEAS_FILE &&
--      !default_path.empty()) {
-+  if (!default_path.empty()) {
-     if (default_path_exists) {
-       // If this is an existing directory, navigate to that directory, with no
-       // filename.
+ }  // namespace ui
diff --git a/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.h b/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.h
index 24cfcac1a7..7869714fc7 100644
--- a/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.h
+++ b/electron32/patches/patch-ui_shell__dialogs_select__file__dialog__linux__portal.h
@@ -6,7 +6,17 @@ $NetBSD$
 
 --- ui/shell_dialogs/select_file_dialog_linux_portal.h.orig	2024-10-18 12:35:12.788244700 +0000
 +++ ui/shell_dialogs/select_file_dialog_linux_portal.h
-@@ -117,6 +117,8 @@ class SelectFileDialogLinuxPortal : publ
+@@ -44,6 +44,9 @@ class SelectFileDialogLinuxPortal : publ
+   // test from above has not yet completed (which should generally not happen).
+   static bool IsPortalAvailable();
+ 
++  // Get version of portal if available.
++  static int GetPortalVersion();
++
+   // Destroys the connection to the bus.
+   static void DestroyPortalConnection();
+ 
+@@ -117,6 +120,8 @@ class SelectFileDialogLinuxPortal : publ
      Type type;
      // The task runner the SelectFileImpl method was called on.
      scoped_refptr<base::SequencedTaskRunner> main_task_runner;
@@ -15,3 +25,23 @@ $NetBSD$
  
     private:
      friend class base::RefCountedThreadSafe<DialogInfo>;
+@@ -173,7 +178,8 @@ class SelectFileDialogLinuxPortal : publ
+   };
+ 
+   // D-Bus configuration and initialization.
+-  static void CheckPortalAvailabilityOnBusThread();
++  static void CheckPortalAvailabilityOnBusThread(
++      unsigned int xdg_portal_required_version);
+   static bool IsPortalRunningOnBusThread(dbus::ObjectProxy* dbus_proxy);
+   static bool IsPortalActivatableOnBusThread(dbus::ObjectProxy* dbus_proxy);
+ 
+@@ -207,6 +213,9 @@ class SelectFileDialogLinuxPortal : publ
+   // Written by the D-Bus thread and read by the UI thread.
+   static bool is_portal_available_;
+ 
++  // Written by the D-Bus thread and read by the UI thread.
++  static unsigned int available_portal_version_;
++
+   // Used by the D-Bus thread to generate unique handle tokens.
+   static int handle_token_counter_;
+ 
diff --git a/electron32/patches/patch-v8_src_builtins_builtins-object-gen.cc b/electron32/patches/patch-v8_src_builtins_builtins-object-gen.cc
new file mode 100644
index 0000000000..5d522f33eb
--- /dev/null
+++ b/electron32/patches/patch-v8_src_builtins_builtins-object-gen.cc
@@ -0,0 +1,22 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/builtins/builtins-object-gen.cc.orig	2024-10-18 12:48:35.148423200 +0000
++++ v8/src/builtins/builtins-object-gen.cc
+@@ -486,6 +486,13 @@ TF_BUILTIN(ObjectAssign, ObjectBuiltinsA
+     GotoIfNot(TaggedEqual(LoadElements(CAST(to)), EmptyFixedArrayConstant()),
+               &slow_path);
+ 
++    // Ensure the properties field is not used to store a hash.
++    TNode<Object> properties = LoadJSReceiverPropertiesOrHash(to);
++    GotoIf(TaggedIsSmi(properties), &slow_path);
++    CSA_DCHECK(this,
++               Word32Or(TaggedEqual(properties, EmptyFixedArrayConstant()),
++                        IsPropertyArray(CAST(properties))));
++
+     // Check if our particular source->target combination is fast clonable.
+     // E.g., this ensures that we only have fast properties and in general that
+     // the binary layout is compatible for `FastCloneJSObject`.
diff --git a/electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.cc b/electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.cc
new file mode 100644
index 0000000000..46ab97ae32
--- /dev/null
+++ b/electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.cc
@@ -0,0 +1,76 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/compiler/turboshaft/wasm-gc-typed-optimization-reducer.cc.orig	2024-10-18 12:48:35.276422500 +0000
++++ v8/src/compiler/turboshaft/wasm-gc-typed-optimization-reducer.cc
+@@ -45,9 +45,23 @@ void WasmGCTypeAnalyzer::Run() {
+         // defines more precise types than the previous iteration).
+         if (needs_revisit) {
+           block_to_snapshot_[loop_header.index()] = MaybeSnapshot(snapshot);
+-          // This will push the successors of the loop header to the iterator
+-          // stack, so the loop body will be visited in the next iteration.
+-          iterator.MarkLoopForRevisitSkipHeader();
++          if (block.index() != loop_header.index()) {
++            // This will push the successors of the loop header to the iterator
++            // stack, so the loop body will be visited in the next iteration.
++            iterator.MarkLoopForRevisitSkipHeader();
++          } else {
++            // A single-block loop doesn't have any successors which would be
++            // re-evaluated and which might trigger another re-evaluation of the
++            // loop header.
++            // TODO(mliedtke): This is not a great design: We don't just
++            // schedule revisiting the loop header but afterwards we revisit it
++            // once again to evaluate whether we need to revisit it more times,
++            // so for single block loops the revisitation count will always be a
++            // multiple of 2. While this is inefficient, single-block loops are
++            // rare and are either endless loops or need to trigger an exception
++            // (e.g. a wasm trap) to terminate.
++            iterator.MarkLoopForRevisit();
++          }
+         }
+       }
+     }
+@@ -269,6 +283,25 @@ void WasmGCTypeAnalyzer::ProcessAllocate
+                       wasm::ValueType::Ref(type_index));
+ }
+ 
++wasm::ValueType WasmGCTypeAnalyzer::GetTypeForPhiInput(const PhiOp& phi,
++                                                       int input_index) {
++  OpIndex phi_id = graph_.Index(phi);
++  OpIndex input = ResolveAliases(phi.input(input_index));
++  // If the input of the phi is in the same block as the phi and appears
++  // before the phi, don't use the predecessor value.
++
++  if (current_block_->begin().id() <= input.id() && input.id() < phi_id.id()) {
++    // Phi instructions have to be at the beginning of the block, so this can
++    // only happen for inputs that are also phis. Furthermore, this is only
++    // possible in loop headers of loops and only for the backedge-input.
++    DCHECK(graph_.Get(input).Is<PhiOp>());
++    DCHECK(current_block_->IsLoop());
++    DCHECK_EQ(input_index, 1);
++    return types_table_.Get(input);
++  }
++  return types_table_.GetPredecessorValue(input, input_index);
++}
++
+ void WasmGCTypeAnalyzer::ProcessPhi(const PhiOp& phi) {
+   // The result type of a phi is the union of all its input types.
+   // If any of the inputs is the default value ValueType(), there isn't any type
+@@ -281,12 +314,10 @@ void WasmGCTypeAnalyzer::ProcessPhi(cons
+     RefineTypeKnowledge(graph_.Index(phi), GetResolvedType((phi.input(0))));
+     return;
+   }
+-  wasm::ValueType union_type =
+-      types_table_.GetPredecessorValue(ResolveAliases(phi.input(0)), 0);
++  wasm::ValueType union_type = GetTypeForPhiInput(phi, 0);
+   if (union_type == wasm::ValueType()) return;
+   for (int i = 1; i < phi.input_count; ++i) {
+-    wasm::ValueType input_type =
+-        types_table_.GetPredecessorValue(ResolveAliases(phi.input(i)), i);
++    wasm::ValueType input_type = GetTypeForPhiInput(phi, i);
+     if (input_type == wasm::ValueType()) return;
+     // <bottom> types have to be skipped as an unreachable predecessor doesn't
+     // change our type knowledge.
diff --git a/electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.h b/electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.h
new file mode 100644
index 0000000000..3da4bb3235
--- /dev/null
+++ b/electron32/patches/patch-v8_src_compiler_turboshaft_wasm-gc-typed-optimization-reducer.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/compiler/turboshaft/wasm-gc-typed-optimization-reducer.h.orig	2024-10-18 12:48:35.276422500 +0000
++++ v8/src/compiler/turboshaft/wasm-gc-typed-optimization-reducer.h
+@@ -80,6 +80,8 @@ class WasmGCTypeAnalyzer {
+   void ProcessPhi(const PhiOp& phi);
+   void ProcessTypeAnnotation(const WasmTypeAnnotationOp& type_annotation);
+ 
++  wasm::ValueType GetTypeForPhiInput(const PhiOp& phi, int input_index);
++
+   void CreateMergeSnapshot(const Block& block);
+   bool CreateMergeSnapshot(base::Vector<const Snapshot> predecessors,
+                            base::Vector<const bool> reachable);
diff --git a/electron32/patches/patch-v8_src_interpreter_bytecode-generator.cc b/electron32/patches/patch-v8_src_interpreter_bytecode-generator.cc
new file mode 100644
index 0000000000..d9356f3848
--- /dev/null
+++ b/electron32/patches/patch-v8_src_interpreter_bytecode-generator.cc
@@ -0,0 +1,60 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/interpreter/bytecode-generator.cc.orig	2024-10-18 12:48:35.364422000 +0000
++++ v8/src/interpreter/bytecode-generator.cc
+@@ -2353,6 +2353,9 @@ void BytecodeGenerator::VisitSwitchState
+   // Are we still using any if-else bytecodes to evaluate the switch?
+   bool use_jumps = n_comp_cases != 0;
+ 
++  // Does the comparison for non-jump table jumps need an elision scope?
++  bool jump_comparison_needs_hole_check_elision_scope = false;
++
+   SwitchBuilder switch_builder(builder(), block_coverage_builder_, stmt,
+                                n_comp_cases, jump_table);
+   ControlScopeForBreakable scope(this, stmt, &switch_builder);
+@@ -2410,6 +2413,10 @@ void BytecodeGenerator::VisitSwitchState
+                                          info.covered_cases);
+ 
+     if (use_jumps) {
++      // When using a jump table, the first jump comparison is conditionally
++      // executed if the discriminant wasn't matched by anything in the jump
++      // table, and so needs its own elision scope.
++      jump_comparison_needs_hole_check_elision_scope = true;
+       builder()->LoadAccumulatorWithRegister(r1);
+     }
+   }
+@@ -2430,16 +2437,14 @@ void BytecodeGenerator::VisitSwitchState
+       // The comparisons linearly dominate, so no need to open a new elision
+       // scope for each one.
+       base::Optional<HoleCheckElisionScope> elider;
+-      bool first_jump_emitted = false;
+       for (int i = 0; i < clauses->length(); ++i) {
+         CaseClause* clause = clauses->at(i);
+         if (clause->is_default()) {
+           info.default_case = i;
+         } else if (!info.CaseExists(clause->label())) {
+-          // The first non-default label is
+-          // unconditionally executed, so we only need to emplace it before
+-          // visiting the second non-default label.
+-          if (first_jump_emitted) elider.emplace(this);
++          if (jump_comparison_needs_hole_check_elision_scope && !elider) {
++            elider.emplace(this);
++          }
+ 
+           // Perform label comparison as if via '===' with tag.
+           VisitForAccumulatorValue(clause->label());
+@@ -2450,7 +2455,9 @@ void BytecodeGenerator::VisitSwitchState
+ #endif
+           switch_builder.JumpToCaseIfTrue(ToBooleanMode::kAlreadyBoolean,
+                                           case_compare_ctr++);
+-          first_jump_emitted = true;
++          // The second and subsequent non-default comparisons are always
++          // conditionally executed, and need an elision scope.
++          jump_comparison_needs_hole_check_elision_scope = true;
+         }
+       }
+     }
diff --git a/electron32/patches/patch-v8_src_maglev_maglev-phi-representation-selector.cc b/electron32/patches/patch-v8_src_maglev_maglev-phi-representation-selector.cc
new file mode 100644
index 0000000000..6412db7e56
--- /dev/null
+++ b/electron32/patches/patch-v8_src_maglev_maglev-phi-representation-selector.cc
@@ -0,0 +1,18 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/maglev/maglev-phi-representation-selector.cc.orig	2024-10-18 12:48:35.384421800 +0000
++++ v8/src/maglev/maglev-phi-representation-selector.cc
+@@ -329,7 +329,8 @@ void MaglevPhiRepresentationSelector::En
+   // should be tagged. We'll thus insert tagging operation on the untagged phi
+   // inputs of {phi}.
+ 
+-  for (int i = 0; i < phi->input_count(); i++) {
++  const int skip_backedge = phi->is_loop_phi() ? 1 : 0;
++  for (int i = 0; i < phi->input_count() - skip_backedge; i++) {
+     ValueNode* input = phi->input(i).node();
+     if (Phi* phi_input = input->TryCast<Phi>()) {
+       phi->change_input(i, EnsurePhiTagged(phi_input, phi->predecessor_at(i),
diff --git a/electron32/patches/patch-v8_src_wasm_baseline_arm_liftoff-assembler-arm-inl.h b/electron32/patches/patch-v8_src_wasm_baseline_arm_liftoff-assembler-arm-inl.h
new file mode 100644
index 0000000000..6c4a75dde1
--- /dev/null
+++ b/electron32/patches/patch-v8_src_wasm_baseline_arm_liftoff-assembler-arm-inl.h
@@ -0,0 +1,46 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/wasm/baseline/arm/liftoff-assembler-arm-inl.h.orig	2024-10-18 12:48:35.480421300 +0000
++++ v8/src/wasm/baseline/arm/liftoff-assembler-arm-inl.h
+@@ -496,21 +496,23 @@ void LiftoffAssembler::CallFrameSetupStu
+ 
+ void LiftoffAssembler::PrepareTailCall(int num_callee_stack_params,
+                                        int stack_param_delta) {
+-  UseScratchRegisterScope temps(this);
+-  Register scratch = temps.Acquire();
++  {
++    UseScratchRegisterScope temps(this);
++    Register scratch = temps.Acquire();
+ 
+-  // Push the return address and frame pointer to complete the stack frame.
+-  sub(sp, sp, Operand(8));
+-  ldr(scratch, MemOperand(fp, 4));
+-  str(scratch, MemOperand(sp, 4));
+-  ldr(scratch, MemOperand(fp, 0));
+-  str(scratch, MemOperand(sp, 0));
+-
+-  // Shift the whole frame upwards.
+-  int slot_count = num_callee_stack_params + 2;
+-  for (int i = slot_count - 1; i >= 0; --i) {
+-    ldr(scratch, MemOperand(sp, i * 4));
+-    str(scratch, MemOperand(fp, (i - stack_param_delta) * 4));
++    // Push the return address and frame pointer to complete the stack frame.
++    sub(sp, sp, Operand(8));
++    ldr(scratch, MemOperand(fp, 4));
++    str(scratch, MemOperand(sp, 4));
++    ldr(scratch, MemOperand(fp, 0));
++    str(scratch, MemOperand(sp, 0));
++
++    // Shift the whole frame upwards.
++    int slot_count = num_callee_stack_params + 2;
++    for (int i = slot_count - 1; i >= 0; --i) {
++      ldr(scratch, MemOperand(sp, i * 4));
++      str(scratch, MemOperand(fp, (i - stack_param_delta) * 4));
++    }
+   }
+ 
+   // Set the new stack and frame pointer.
diff --git a/electron32/patches/patch-v8_src_wasm_baseline_x64_liftoff-assembler-x64-inl.h b/electron32/patches/patch-v8_src_wasm_baseline_x64_liftoff-assembler-x64-inl.h
new file mode 100644
index 0000000000..cc291bbcb3
--- /dev/null
+++ b/electron32/patches/patch-v8_src_wasm_baseline_x64_liftoff-assembler-x64-inl.h
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/src/wasm/baseline/x64/liftoff-assembler-x64-inl.h.orig	2024-10-18 12:48:35.488421200 +0000
++++ v8/src/wasm/baseline/x64/liftoff-assembler-x64-inl.h
+@@ -51,6 +51,8 @@ constexpr Operand kInstanceDataOperand =
+ 
+ constexpr Operand kOSRTargetSlot = GetStackSlot(kOSRTargetOffset);
+ 
++// Note: The returned Operand might contain {kScratchRegister2}; make sure not
++// to clobber that until after the last use of the Operand.
+ inline Operand GetMemOp(LiftoffAssembler* assm, Register addr,
+                         Register offset_reg, uintptr_t offset_imm,
+                         ScaleFactor scale_factor = times_1) {
+@@ -61,7 +63,7 @@ inline Operand GetMemOp(LiftoffAssembler
+                : Operand(addr, offset_reg, scale_factor, offset_imm32);
+   }
+   // Offset immediate does not fit in 31 bits.
+-  Register scratch = kScratchRegister;
++  Register scratch = kScratchRegister2;
+   assm->MacroAssembler::Move(scratch, offset_imm);
+   if (offset_reg != no_reg) assm->addq(scratch, offset_reg);
+   return Operand(addr, scratch, scale_factor, 0);
diff --git a/electron32/patches/patch-v8_test_mjsunit_maglev_regress-382190919.js b/electron32/patches/patch-v8_test_mjsunit_maglev_regress-382190919.js
new file mode 100644
index 0000000000..5c4c44dc85
--- /dev/null
+++ b/electron32/patches/patch-v8_test_mjsunit_maglev_regress-382190919.js
@@ -0,0 +1,48 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/test/mjsunit/maglev/regress-382190919.js.orig	2025-02-15 09:43:46.595426596 +0000
++++ v8/test/mjsunit/maglev/regress-382190919.js
+@@ -0,0 +1,39 @@
++// Copyright 2024 the V8 project authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++// Flags: --allow-natives-syntax --no-maglev-loop-peeling
++
++function g() { }
++%NeverOptimizeFunction(g);
++
++function foo(b) {
++  let phi1 = 0;
++  for (let i = 0; i < 10; i++) {
++    phi1++; // Int32 use so that {phi1} gets untagged.
++  }
++
++  let phi2 = undefined; // Not untaggable.
++  let j = 0;
++
++  if (b) {
++    g(phi1); // Triggering retagging of {phi1}.
++  }
++
++  // Nothing between the `if` and the loop header, so that the loop header ends
++  // up having 2 incoming forward edges.
++
++  for (; j < 5; j++) {
++    phi2 = phi1; // New retagging of {phi1} since previous one is not available
++                 // in all predecessors.
++  }
++
++  return phi2;
++}
++
++%PrepareFunctionForOptimization(foo);
++foo(true);
++foo(false);
++
++%OptimizeMaglevOnNextCall(foo);
++foo(true);
diff --git a/electron32/patches/patch-v8_test_mjsunit_regress_regress-374627491.js b/electron32/patches/patch-v8_test_mjsunit_regress_regress-374627491.js
new file mode 100644
index 0000000000..4749c62b57
--- /dev/null
+++ b/electron32/patches/patch-v8_test_mjsunit_regress_regress-374627491.js
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/test/mjsunit/regress/regress-374627491.js.orig	2025-02-15 09:43:46.595561627 +0000
++++ v8/test/mjsunit/regress/regress-374627491.js
+@@ -0,0 +1,26 @@
++// Copyright 2024 the V8 project authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++class B { }
++class C extends B {
++  constructor() {
++    let x = 0;
++    switch (0) {
++      case 0:
++      case 1:
++      case 2:
++      case 3:
++      case 4:
++      case 5:
++      case 6:
++      case 7:
++      case 8:
++      case 9:
++        x += this;
++        break;
++      case this:
++    }
++  }
++}
++assertThrows(() => { new C(); }, ReferenceError);
diff --git a/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-366635354.js b/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-366635354.js
index 36d35a44d7..98110351f1 100644
--- a/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-366635354.js
+++ b/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-366635354.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- v8/test/mjsunit/regress/wasm/regress-366635354.js.orig	2025-01-19 14:12:04.266732299 +0000
+--- v8/test/mjsunit/regress/wasm/regress-366635354.js.orig	2025-02-15 09:43:46.595694215 +0000
 +++ v8/test/mjsunit/regress/wasm/regress-366635354.js
 @@ -0,0 +1,32 @@
 +// Copyright 2024 the V8 project authors. All rights reserved.
diff --git a/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-378779897.js b/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-378779897.js
new file mode 100644
index 0000000000..fd3f39eb13
--- /dev/null
+++ b/electron32/patches/patch-v8_test_mjsunit_regress_wasm_regress-378779897.js
@@ -0,0 +1,31 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, and
+  FreeBSD's electron patches
+
+--- v8/test/mjsunit/regress/wasm/regress-378779897.js.orig	2025-02-15 09:43:46.595828896 +0000
++++ v8/test/mjsunit/regress/wasm/regress-378779897.js
+@@ -0,0 +1,22 @@
++// Copyright 2024 the V8 project authors. All rights reserved.
++// Use of this source code is governed by a BSD-style license that can be
++// found in the LICENSE file.
++
++d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
++
++const builder = new WasmModuleBuilder();
++builder.addMemory(49149);
++
++builder.addFunction('main', kSig_i_v).addBody([
++  ...wasmI32Const(-1118406780),
++  ...wasmI32Const(-1),
++  kAtomicPrefix, kExprI32AtomicOr8U, 0, 0
++]).exportFunc();
++
++let instance;
++try {
++  instance = builder.instantiate();
++} catch (e) {
++  assertException(e, RangeError, /Out of memory/);
++}
++if (instance) instance.exports.main();
diff --git a/electron32/patches/patch-v8_test_mjsunit_wasm_regress-367818758.js b/electron32/patches/patch-v8_test_mjsunit_wasm_regress-367818758.js
index 4fba4349ff..139d641656 100644
--- a/electron32/patches/patch-v8_test_mjsunit_wasm_regress-367818758.js
+++ b/electron32/patches/patch-v8_test_mjsunit_wasm_regress-367818758.js
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- v8/test/mjsunit/wasm/regress-367818758.js.orig	2025-01-19 14:12:04.266838696 +0000
+--- v8/test/mjsunit/wasm/regress-367818758.js.orig	2025-02-15 09:43:46.595960962 +0000
 +++ v8/test/mjsunit/wasm/regress-367818758.js
 @@ -0,0 +1,221 @@
 +// Copyright 2024 the V8 project authors. All rights reserved.
diff --git a/electron32/patches/patch-v8_tools_run-paxctl.py b/electron32/patches/patch-v8_tools_run-paxctl.py
index 4711fabae4..02bf39a162 100644
--- a/electron32/patches/patch-v8_tools_run-paxctl.py
+++ b/electron32/patches/patch-v8_tools_run-paxctl.py
@@ -4,7 +4,7 @@ $NetBSD$
 * Based on OpenBSD's chromium patches, and
   FreeBSD's electron patches
 
---- v8/tools/run-paxctl.py.orig	2025-01-19 14:12:04.266972075 +0000
+--- v8/tools/run-paxctl.py.orig	2025-02-15 09:43:46.596110902 +0000
 +++ v8/tools/run-paxctl.py
 @@ -0,0 +1,16 @@
 +#!@PYTHONBIN@


Home | Main Index | Thread Index | Old Index