electron/shell/common/gin_converters/content_converter.cc
trop[bot] c2939ef9af
chore: bump chromium to 128.0.6558.0 (32-x-y) (#42746)
* chore: bump chromium to 128.0.6558.0 32-x-y

* chore: bump chromium in DEPS to 127.0.6526.0

* chore: update network_service_allow_remote_certificate_verification_logic.patch

manually apply patch due to minor upstream shear

Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5598454

* chore: update fix_move_autopipsettingshelper_behind_branding_buildflag.patch

No manual changes; patch applied with fuzz 1

* chore: update refactor_expose_file_system_access_blocklist.patch

No manual changes; patch applied with fuzz 2

* chore: update revert_heap_add_checks_position_info.patch

No manual changes; patch applied with fuzz 1

* chore: e patches all

* chore: bump chromium in DEPS to 127.0.6527.0

* chore: update patches

* chore: bump chromium in DEPS to 127.0.6529.0

* chore: bump chromium in DEPS to 127.0.6531.0

* chore: update patches

* 5596349: Remove PDF OCR toggle from settings.

https://chromium-review.googlesource.com/c/chromium/src/+/5596349

* 5585932: [video-pip] Add minimize button to video picture-in-picture window

https://chromium-review.googlesource.com/c/chromium/src/+/5585932

* 5604487: Reland "[api] Deprecate v8::FunctionCallbackInfo::Holder() for real"

https://chromium-review.googlesource.com/c/v8/v8/+/5604487

* 5581721: [DEPS] Update clang-format location

https://chromium-review.googlesource.com/c/chromium/src/+/5581721

* 5597904: [Windows] Remove ConvertToLongPath from Sandbox Utilities.

https://chromium-review.googlesource.com/c/chromium/src/+/5597904

ResolveNTFunctionPtr was removed in this CL.

* fix: visibility state specs on macOS

Refs https://chromium-review.googlesource.com/c/chromium/src/+/5605407

* Revert "fix: visibility state specs on macOS"

This reverts commit 1eee30a33dfafeec86cdd09526a07b01abca2ed6.

* temp: disable occlusion checker on macOS

* chore: bump chromium in DEPS to 128.0.6535.0

* chore: update patches

* [Extensions] Move some scriptings files out of the API directory.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/5606682

* fix[node]: do not use soon-to-be-deprecated V8 API

* fix: update api_remove_allcan_read_write.patch

* chore: update patches

* chore: update patches

* chore: fix lf mismatch in api_remove_allcan_read_write.patch

* chore: update patches

* chore: bump chromium in DEPS to 128.0.6538.0

* chore: update v8 patches

* chore: update patches

* ui/gl/features.gni: Set use_egl=true unconditionally.

Refs https://chromium-review.googlesource.com/c/chromium/src/+/5569748
Refs https://issues.chromium.org/issues/344606399

* chore: bump chromium in DEPS to 128.0.6540.0

* chore: bump chromium in DEPS to 128.0.6541.0

* chore: update patches

* chore: fix nan read/write patch

* chore: bump chromium in DEPS to 128.0.6543.0

* 5626254: Use sandbox_type instead of process_type | https://chromium-review.googlesource.com/c/chromium/src/+/5626254

* chore: update patches

* rework nan patches

* 5621488: Apply consistent naming conventions to zoom values | https://chromium-review.googlesource.com/c/chromium/src/+/5621488

* chore: bump chromium in DEPS to 128.0.6544.0

* 5605693: Remove files from third_party/ninja | https://chromium-review.googlesource.com/c/chromium/src/+/5605693

* chore: update patches

* chore: maybe fix nan patch, part 3

* chore: delete nan patch

* chore: re-add nan patch (attempt 2)

* chore: add test patch

* fixup! add test patch

* chore: bump chromium in DEPS to 128.0.6549.0

* chore: bump chromium in DEPS to 128.0.6551.0

* 5637699: Add command line to ASAN Additional Info section | https://chromium-review.googlesource.com/c/chromium/src/+/5637699

* chore: update patches

* chore: bump chromium in DEPS to 128.0.6553.0

* chore: bump chromium in DEPS to 128.0.6555.0

* fix: add property query interceptors

* chore: bump chromium in DEPS to 128.0.6557.0

* 5583182: Automatic Fullscreen: Prototype Permissions API query support | https://chromium-review.googlesource.com/c/chromium/src/+/5583182

* 5613297: Move render input router and related dependencies to //components/input | https://chromium-review.googlesource.com/c/chromium/src/+/5613297

* chore: update patches

* test: skip methodswithdata-test.js nan test

* chore: bump chromium in DEPS to 128.0.6558.0

* chore: update patches

* build: reference correct ninja cipd ref

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/5605693

* update libcxx filenames

* refactor: CursorManager moved to //components/input

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/5613297

* refactor: spanify mojo Read/WriteData methods

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/5619291

* refactor: remove constexpr from KeyboardCodeFromKeyIdentifier

Ref: unknown

Added TODO to investigate after

* chore: update patches

* refactor: improve type safety of a11y ids

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/5614590

* chore: disable tls node tests that don't apply given boringssl tls configuration

Ref: https://boringssl-review.googlesource.com/c/boringssl/+/68487

* chore: add patch to fix nan v8 incompat with NamedPropertyHandlerConfiguration and IndexedPropertyHandlerConfiguration

Ref: https://chromium-review.googlesource.com/c/v8/v8/+/5630388

* fix: limit subspan length per feedback

* Fix incorrect CalculateInsetsInDIP check

* 5645742: Reland "Reland "Add toolchains without PartitionAlloc-Everywhere for dump_syms et al""

https://chromium-review.googlesource.com/c/chromium/src/+/5645742

* chore: more Windows logging

* 5617471: Add NPU blocking to chromium blocklist

https://chromium-review.googlesource.com/c/chromium/src/+/5617471

---------

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Charles Kerr <charles@charleskerr.com>
Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
Co-authored-by: deepak1556 <hop2deep@gmail.com>
Co-authored-by: Keeley Hammond <khammond@slack-corp.com>
Co-authored-by: Alice Zhao <alice@makenotion.com>
Co-authored-by: Samuel Attard <marshallofsound@electronjs.org>
Co-authored-by: VerteDinde <vertedinde@electronjs.org>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: cleanup .patches after trop

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2024-07-03 10:54:21 -04:00

329 lines
13 KiB
C++

// Copyright (c) 2015 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/common/gin_converters/content_converter.h"
#include <string>
#include <string_view>
#include "base/containers/fixed_flat_map.h"
#include "components/input/native_web_keyboard_event.h"
#include "content/public/browser/context_menu_params.h"
#include "content/public/browser/web_contents.h"
#include "shell/browser/api/electron_api_web_contents.h"
#include "shell/browser/web_contents_permission_helper.h"
#include "shell/common/gin_converters/blink_converter.h"
#include "shell/common/gin_converters/callback_converter.h"
#include "shell/common/gin_converters/frame_converter.h"
#include "shell/common/gin_converters/gfx_converter.h"
#include "shell/common/gin_converters/gurl_converter.h"
#include "shell/common/gin_helper/dictionary.h"
#include "third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/keycodes/keyboard_code_conversion.h"
namespace gin {
static constexpr auto MenuSourceTypes =
base::MakeFixedFlatMap<std::string_view, ui::MenuSourceType>({
{"adjustSelection", ui::MENU_SOURCE_ADJUST_SELECTION},
{"adjustSelectionReset", ui::MENU_SOURCE_ADJUST_SELECTION_RESET},
{"keyboard", ui::MENU_SOURCE_KEYBOARD},
{"longPress", ui::MENU_SOURCE_LONG_PRESS},
{"longTap", ui::MENU_SOURCE_LONG_TAP},
{"mouse", ui::MENU_SOURCE_MOUSE},
{"none", ui::MENU_SOURCE_NONE},
{"stylus", ui::MENU_SOURCE_STYLUS},
{"touch", ui::MENU_SOURCE_TOUCH},
{"touchHandle", ui::MENU_SOURCE_TOUCH_HANDLE},
{"touchMenu", ui::MENU_SOURCE_TOUCH_EDIT_MENU},
});
// let us know when upstream changes & we need to update MenuSourceTypes
static_assert(std::size(MenuSourceTypes) == ui::MENU_SOURCE_TYPE_LAST + 1U);
// static
v8::Local<v8::Value> Converter<ui::MenuSourceType>::ToV8(
v8::Isolate* isolate,
const ui::MenuSourceType& in) {
for (auto const& [key, val] : MenuSourceTypes)
if (in == val)
return StringToV8(isolate, key);
return {};
}
// static
bool Converter<ui::MenuSourceType>::FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
ui::MenuSourceType* out) {
return FromV8WithLookup(isolate, val, MenuSourceTypes, out);
}
// static
v8::Local<v8::Value> Converter<blink::mojom::MenuItem::Type>::ToV8(
v8::Isolate* isolate,
const blink::mojom::MenuItem::Type& val) {
switch (val) {
case blink::mojom::MenuItem::Type::kCheckableOption:
return StringToV8(isolate, "checkbox");
case blink::mojom::MenuItem::Type::kGroup:
return StringToV8(isolate, "radio");
case blink::mojom::MenuItem::Type::kSeparator:
return StringToV8(isolate, "separator");
case blink::mojom::MenuItem::Type::kSubMenu:
return StringToV8(isolate, "submenu");
case blink::mojom::MenuItem::Type::kOption:
default:
return StringToV8(isolate, "normal");
}
}
// static
v8::Local<v8::Value> Converter<ContextMenuParamsWithRenderFrameHost>::ToV8(
v8::Isolate* isolate,
const ContextMenuParamsWithRenderFrameHost& val) {
const auto& params = val.first;
content::RenderFrameHost* render_frame_host = val.second;
auto dict = gin_helper::Dictionary::CreateEmpty(isolate);
dict.SetGetter("frame", render_frame_host, v8::DontEnum);
dict.Set("x", params.x);
dict.Set("y", params.y);
dict.Set("linkURL", params.link_url);
dict.Set("linkText", params.link_text);
dict.Set("pageURL", params.page_url);
dict.Set("frameURL", params.frame_url);
dict.Set("srcURL", params.src_url);
dict.Set("mediaType", params.media_type);
dict.Set("mediaFlags", MediaFlagsToV8(isolate, params.media_flags));
bool has_image_contents =
(params.media_type == blink::mojom::ContextMenuDataMediaType::kImage) &&
params.has_image_contents;
dict.Set("hasImageContents", has_image_contents);
dict.Set("isEditable", params.is_editable);
dict.Set("editFlags", EditFlagsToV8(isolate, params.edit_flags));
dict.Set("selectionText", params.selection_text);
dict.Set("titleText", params.title_text);
dict.Set("altText", params.alt_text);
dict.Set("suggestedFilename", params.suggested_filename);
dict.Set("misspelledWord", params.misspelled_word);
dict.Set("selectionRect", params.selection_rect);
#if BUILDFLAG(ENABLE_BUILTIN_SPELLCHECKER)
dict.Set("dictionarySuggestions", params.dictionary_suggestions);
dict.Set("spellcheckEnabled", params.spellcheck_enabled);
#else
dict.Set("spellcheckEnabled", false);
#endif
dict.Set("frameCharset", params.frame_charset);
dict.Set("referrerPolicy", params.referrer_policy);
dict.Set("formControlType", params.form_control_type);
dict.Set("menuSourceType", params.source_type);
return gin::ConvertToV8(isolate, dict);
}
// static
bool Converter<blink::mojom::PermissionStatus>::FromV8(
v8::Isolate* isolate,
v8::Local<v8::Value> val,
blink::mojom::PermissionStatus* out) {
bool result;
if (!ConvertFromV8(isolate, val, &result))
return false;
if (result)
*out = blink::mojom::PermissionStatus::GRANTED;
else
*out = blink::mojom::PermissionStatus::DENIED;
return true;
}
// static
v8::Local<v8::Value> Converter<blink::PermissionType>::ToV8(
v8::Isolate* isolate,
const blink::PermissionType& val) {
using PermissionType = electron::WebContentsPermissionHelper::PermissionType;
// Based on mappings from content/browser/devtools/protocol/browser_handler.cc
// Not all permissions are currently used by Electron but this will future
// proof these conversions.
switch (val) {
case blink::PermissionType::ACCESSIBILITY_EVENTS:
return StringToV8(isolate, "accessibility-events");
case blink::PermissionType::AUTOMATIC_FULLSCREEN:
return StringToV8(isolate, "automatic-fullscreen");
case blink::PermissionType::AR:
return StringToV8(isolate, "ar");
case blink::PermissionType::BACKGROUND_FETCH:
return StringToV8(isolate, "background-fetch");
case blink::PermissionType::BACKGROUND_SYNC:
return StringToV8(isolate, "background-sync");
case blink::PermissionType::CLIPBOARD_READ_WRITE:
return StringToV8(isolate, "clipboard-read");
case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE:
return StringToV8(isolate, "clipboard-sanitized-write");
case blink::PermissionType::LOCAL_FONTS:
return StringToV8(isolate, "local-fonts");
case blink::PermissionType::IDLE_DETECTION:
return StringToV8(isolate, "idle-detection");
case blink::PermissionType::MIDI_SYSEX:
return StringToV8(isolate, "midiSysex");
case blink::PermissionType::NFC:
return StringToV8(isolate, "nfc");
case blink::PermissionType::NOTIFICATIONS:
return StringToV8(isolate, "notifications");
case blink::PermissionType::PAYMENT_HANDLER:
return StringToV8(isolate, "payment-handler");
case blink::PermissionType::PERIODIC_BACKGROUND_SYNC:
return StringToV8(isolate, "periodic-background-sync");
case blink::PermissionType::DURABLE_STORAGE:
return StringToV8(isolate, "persistent-storage");
case blink::PermissionType::GEOLOCATION:
return StringToV8(isolate, "geolocation");
case blink::PermissionType::CAMERA_PAN_TILT_ZOOM:
case blink::PermissionType::AUDIO_CAPTURE:
case blink::PermissionType::VIDEO_CAPTURE:
return StringToV8(isolate, "media");
case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
return StringToV8(isolate, "mediaKeySystem");
case blink::PermissionType::MIDI:
return StringToV8(isolate, "midi");
case blink::PermissionType::WAKE_LOCK_SCREEN:
return StringToV8(isolate, "screen-wake-lock");
case blink::PermissionType::SENSORS:
return StringToV8(isolate, "sensors");
case blink::PermissionType::STORAGE_ACCESS_GRANT:
return StringToV8(isolate, "storage-access");
case blink::PermissionType::VR:
return StringToV8(isolate, "vr");
case blink::PermissionType::WAKE_LOCK_SYSTEM:
return StringToV8(isolate, "system-wake-lock");
case blink::PermissionType::WINDOW_MANAGEMENT:
return StringToV8(isolate, "window-management");
case blink::PermissionType::DISPLAY_CAPTURE:
return StringToV8(isolate, "display-capture");
case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS:
return StringToV8(isolate, "top-level-storage-access");
case blink::PermissionType::CAPTURED_SURFACE_CONTROL:
return StringToV8(isolate, "captured-surface-control");
case blink::PermissionType::SMART_CARD:
return StringToV8(isolate, "smart-card");
case blink::PermissionType::WEB_PRINTING:
return StringToV8(isolate, "web-printing");
case blink::PermissionType::SPEAKER_SELECTION:
return StringToV8(isolate, "speaker-selection");
case blink::PermissionType::POINTER_LOCK:
return StringToV8(isolate, "pointerLock");
case blink::PermissionType::KEYBOARD_LOCK:
return StringToV8(isolate, "keyboardLock");
case blink::PermissionType::NUM:
break;
}
switch (static_cast<PermissionType>(val)) {
case PermissionType::FULLSCREEN:
return StringToV8(isolate, "fullscreen");
case PermissionType::OPEN_EXTERNAL:
return StringToV8(isolate, "openExternal");
case PermissionType::SERIAL:
return StringToV8(isolate, "serial");
case PermissionType::HID:
return StringToV8(isolate, "hid");
case PermissionType::USB:
return StringToV8(isolate, "usb");
case PermissionType::FILE_SYSTEM:
return StringToV8(isolate, "fileSystem");
default:
return StringToV8(isolate, "unknown");
}
}
// static
bool Converter<content::StopFindAction>::FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
content::StopFindAction* out) {
using Val = content::StopFindAction;
static constexpr auto Lookup = base::MakeFixedFlatMap<std::string_view, Val>({
{"activateSelection", Val::STOP_FIND_ACTION_ACTIVATE_SELECTION},
{"clearSelection", Val::STOP_FIND_ACTION_CLEAR_SELECTION},
{"keepSelection", Val::STOP_FIND_ACTION_KEEP_SELECTION},
});
return FromV8WithLookup(isolate, val, Lookup, out);
}
// static
v8::Local<v8::Value> Converter<content::WebContents*>::ToV8(
v8::Isolate* isolate,
content::WebContents* val) {
if (!val)
return v8::Null(isolate);
return electron::api::WebContents::FromOrCreate(isolate, val).ToV8();
}
// static
bool Converter<content::WebContents*>::FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
content::WebContents** out) {
if (!val->IsObject())
return false;
// gin's unwrapping converter doesn't expect the pointer inside to ever be
// nullptr, so we check here first before attempting to unwrap.
if (gin_helper::Destroyable::IsDestroyed(val.As<v8::Object>()))
return false;
electron::api::WebContents* web_contents = nullptr;
if (!gin::ConvertFromV8(isolate, val, &web_contents) || !web_contents)
return false;
*out = web_contents->web_contents();
return true;
}
// static
v8::Local<v8::Value> Converter<content::Referrer>::ToV8(
v8::Isolate* isolate,
const content::Referrer& val) {
auto dict = gin_helper::Dictionary::CreateEmpty(isolate);
dict.Set("url", ConvertToV8(isolate, val.url));
dict.Set("policy", ConvertToV8(isolate, val.policy));
return gin::ConvertToV8(isolate, dict);
}
// static
bool Converter<content::Referrer>::FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
content::Referrer* out) {
gin_helper::Dictionary dict;
if (!ConvertFromV8(isolate, val, &dict))
return false;
if (!dict.Get("url", &out->url))
return false;
if (!dict.Get("policy", &out->policy))
return false;
return true;
}
// static
bool Converter<input::NativeWebKeyboardEvent>::FromV8(
v8::Isolate* isolate,
v8::Local<v8::Value> val,
input::NativeWebKeyboardEvent* out) {
gin_helper::Dictionary dict;
if (!ConvertFromV8(isolate, val, &dict))
return false;
if (!ConvertFromV8(isolate, val, static_cast<blink::WebKeyboardEvent*>(out)))
return false;
dict.Get("skipIfUnhandled", &out->skip_if_unhandled);
return true;
}
// static
v8::Local<v8::Value> Converter<input::NativeWebKeyboardEvent>::ToV8(
v8::Isolate* isolate,
const input::NativeWebKeyboardEvent& in) {
return ConvertToV8(isolate, static_cast<blink::WebKeyboardEvent>(in));
}
} // namespace gin