electron/shell/common/gin_converters/osr_converter.cc

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

178 lines
6.2 KiB
C++
Raw Normal View History


// Copyright (c) 2024 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/osr_converter.h"
#include "gin/dictionary.h"
#include "v8-external.h"
#include "v8-function.h"
#include <string>
#include "base/containers/to_vector.h"
chore: bump chromium to 139.0.7256.0 (38-x-y) (#47615) * chore: bump chromium in DEPS to 139.0.7242.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: update render_widget_host_view_mac.patch no code changes; just updating patch context Do a cleanup pass on the history swiper code | https://chromium-review.googlesource.com/c/chromium/src/+/6604367 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update mas_avoid_private_macos_api_usage.patch.patch no code changes; just updating patch context [tracing] Delete base/trace_event/base_tracing.h | https://chromium-review.googlesource.com/c/chromium/src/+/6624012 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update chore_provide_iswebcontentscreationoverridden_with_full_params.patch no manual changes; just updating patch context [ActorFramework] Refactor Actor Task Management | https://chromium-review.googlesource.com/c/chromium/src/+/6618684 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update fix_move_autopipsettingshelper_behind_branding_buildflag.patch [pip] Tuck picture-in-picture windows when a file dialog is open | https://chromium-review.googlesource.com/c/chromium/src/+/6449682 Reland "[document pip] Restrict the size that a website can request" | https://chromium-review.googlesource.com/c/chromium/src/+/6372104 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update feat_corner_smoothing_css_rule_and_blink_painting.patch Xref: corner-shape: constraint radii based on opposite corner overlap | https://chromium-review.googlesource.com/c/chromium/src/+/6592572 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update revert_code_health_clean_up_stale_macwebcontentsocclusion.patch no manual changes; just updating patch context Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update fix_rename_sqlite_win32_exports_to_avoid_conflicts_with_node_js.patch no code changes; just updating patch context Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * Plumb Verify2QwacBinding and hook it up in QwacWebContentsObserver https://chromium-review.googlesource.com/c/chromium/src/+/6624719 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Remove host delegate OnMainFrameCreatedForBackgroundPage https://chromium-review.googlesource.com/c/chromium/src/+/6631123 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Extensions: Rename GetResourceURL to ResolveExtensionURL https://chromium-review.googlesource.com/c/chromium/src/+/6625053 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Consolidate NativeFrameViewMac https://chromium-review.googlesource.com/c/chromium/src/+/6614239 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * ICWYU Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Remove dead code WidgetAXTreeIDMap https://chromium-review.googlesource.com/c/chromium/src/+/6619701 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Reland "extensions: Add `WillPrepareForEvaluation` to setup MojoJS" https://chromium-review.googlesource.com/c/chromium/src/+/6630056 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * NavigationThrottleRunner2: Remove MaybeAddThrottle https://chromium-review.googlesource.com/c/chromium/src/+/6628079 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Tuck picture-in-picture windows when a file dialog is open https://chromium-review.googlesource.com/c/chromium/src/+/6449682 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * build: fix snapshot_blob.bin build error xref: https://issues.chromium.org/issues/416540976 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * build: freeup disk space on macos Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: bump chromium in DEPS to 139.0.7244.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: update printing.patch no manual changes; just updating patch context Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: remove upstreamed ignore_parse_errors_for_resolveshortcutproperties.patch Prevent Windows crash on unexpected shortcut type | https://chromium-review.googlesource.com/c/chromium/src/+/6633298 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * Revert "Reland "extensions: Add `WillPrepareForEvaluation` to setup MojoJS"" This reverts commit 77c4f967a637f7e8970114f91311f9fddede0f7c. Revert CL for the high confidence crash culprit for http://crash/28f897bb9743dfe0 | https://chromium-review.googlesource.com/c/chromium/src/+/6641819 Co-authored-by: Charles Kerr <charles@charleskerr.com> * Fix spec's expected base64-encoded PNG strings to match upstream changes. [rust png] Enable by default. | https://chromium-review.googlesource.com/c/chromium/src/+/6085801 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: bump chromium in DEPS to 139.0.7246.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: bump chromium in DEPS to 139.0.7248.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: update patches Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * siso: Enable Siso by default for non-Google builds https://chromium-review.googlesource.com/c/chromium/src/+/6638830 Disabling for now until we are ready to build siso on all platforms. Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Revert "revert Don't use static variable for UseExternalPopupMenus" This reverts commit e91e3894e6c34cc0ffe69ed45417c0ebec882fb1. Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Update mac_sdk_min to match minimum required SDK version https://chromium-review.googlesource.com/c/chromium/src/+/6493969 (cherry picked from commit 3e7cbe912d8fe1062d68ed06968aaee22013985f) Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Use default window styling on Mac https://chromium-review.googlesource.com/c/chromium/src/+/6648665 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Reland "Force the unintentional renderer process creation check by default" https://chromium-review.googlesource.com/c/chromium/src/+/6626905 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * fixup: Reland "Force the unintentional renderer process creation check by default https://chromium-review.googlesource.com/c/chromium/src/+/6626905 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: bump chromium in DEPS to 139.0.7249.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * fixup: Reland "Force the unintentional renderer process creation check by default https://chromium-review.googlesource.com/c/chromium/src/+/6626905 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: update patches Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: bump chromium in DEPS to 139.0.7250.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: bump chromium in DEPS to 139.0.7252.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: bump chromium in DEPS to 139.0.7254.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * 6638187: browser level TOCTOU check for coordinate target https://chromium-review.googlesource.com/c/chromium/src/+/6638187 Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: fixup patch indices Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: add missing base/notimplemented includes Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * 6652910: [Frame Cleanup] Push down/hide implementation-specific API https://chromium-review.googlesource.com/c/chromium/src/+/6652910 Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: bump chromium in DEPS to 139.0.7256.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: fix lint Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * fixup! 6652910: [Frame Cleanup] Push down/hide implementation-specific API Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * fix: move HandleScope location Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: bump chromium in DEPS to 139.0.7258.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * fixup! [NonClientFrameView] Consolidate NativeFrameViewMac Co-authored-by: deepak1556 <hop2deep@gmail.com> * Revert "chore: bump chromium in DEPS to 139.0.7258.0" This reverts commit 264b2e934f4b2705c47d9761010052b95d9dd5de. Co-authored-by: deepak1556 <hop2deep@gmail.com> * chore: update patches --------- 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: Charles Kerr <charles@charleskerr.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: patchup[bot] <73610968+patchup[bot]@users.noreply.github.com>
2025-06-30 12:29:54 -04:00
#if BUILDFLAG(IS_LINUX)
#include "base/strings/string_number_conversions.h"
#endif
#include "shell/common/gin_converters/gfx_converter.h"
#include "shell/common/gin_converters/optional_converter.h"
#include "shell/common/node_includes.h"
#include "shell/common/node_util.h"
namespace gin {
namespace {
std::string OsrVideoPixelFormatToString(media::VideoPixelFormat format) {
switch (format) {
case media::PIXEL_FORMAT_ARGB:
return "bgra";
case media::PIXEL_FORMAT_ABGR:
return "rgba";
default:
NOTREACHED();
}
}
std::string OsrWidgetTypeToString(content::WidgetType type) {
switch (type) {
case content::WidgetType::kPopup:
return "popup";
case content::WidgetType::kFrame:
return "frame";
default:
NOTREACHED();
}
}
struct OffscreenReleaseHolderMonitor {
explicit OffscreenReleaseHolderMonitor(
electron::OffscreenReleaserHolder* holder)
: holder_(holder) {
CHECK(holder);
}
void ReleaseTexture() {
delete holder_;
holder_ = nullptr;
}
[[nodiscard]] bool IsTextureReleased() const { return holder_ == nullptr; }
v8::Persistent<v8::Value>* CreatePersistent(v8::Isolate* isolate,
v8::Local<v8::Value> value) {
persistent_ = std::make_unique<v8::Persistent<v8::Value>>(isolate, value);
return persistent_.get();
}
void ResetPersistent() const { persistent_->Reset(); }
private:
raw_ptr<electron::OffscreenReleaserHolder> holder_;
std::unique_ptr<v8::Persistent<v8::Value>> persistent_;
};
} // namespace
// static
v8::Local<v8::Value> Converter<electron::OffscreenSharedTextureValue>::ToV8(
v8::Isolate* isolate,
const electron::OffscreenSharedTextureValue& val) {
gin::Dictionary root(isolate, v8::Object::New(isolate));
// Create a monitor to hold the releaser holder, which enables us to
// monitor whether the user explicitly released the texture before
// GC collects the object.
auto* monitor = new OffscreenReleaseHolderMonitor(val.releaser_holder);
auto releaserHolder = v8::External::New(isolate, monitor);
auto releaserFunc = [](const v8::FunctionCallbackInfo<v8::Value>& info) {
auto* holder = static_cast<OffscreenReleaseHolderMonitor*>(
info.Data().As<v8::External>()->Value());
// Release the shared texture, so that future frames can be generated.
holder->ReleaseTexture();
};
auto releaser = v8::Function::New(isolate->GetCurrentContext(), releaserFunc,
releaserHolder)
.ToLocalChecked();
root.Set("release", releaser);
gin::Dictionary dict(isolate, v8::Object::New(isolate));
dict.Set("pixelFormat", OsrVideoPixelFormatToString(val.pixel_format));
dict.Set("codedSize", val.coded_size);
dict.Set("visibleRect", val.visible_rect);
dict.Set("contentRect", val.content_rect);
dict.Set("timestamp", val.timestamp);
dict.Set("widgetType", OsrWidgetTypeToString(val.widget_type));
gin::Dictionary metadata(isolate, v8::Object::New(isolate));
metadata.Set("captureUpdateRect", val.capture_update_rect);
metadata.Set("regionCaptureRect", val.region_capture_rect);
metadata.Set("sourceSize", val.source_size);
metadata.Set("frameCount", val.frame_count);
dict.Set("metadata", ConvertToV8(isolate, metadata));
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
dict.Set("sharedTextureHandle",
electron::Buffer::Copy(
isolate, base::byte_span_from_ref(val.shared_texture_handle))
.ToLocalChecked());
#elif BUILDFLAG(IS_LINUX)
auto v8_planes = base::ToVector(val.planes, [isolate](const auto& plane) {
gin::Dictionary v8_plane(isolate, v8::Object::New(isolate));
v8_plane.Set("stride", plane.stride);
v8_plane.Set("offset", plane.offset);
v8_plane.Set("size", plane.size);
v8_plane.Set("fd", plane.fd);
return v8_plane;
});
dict.Set("planes", v8_planes);
dict.Set("modifier", base::NumberToString(val.modifier));
#endif
root.Set("textureInfo", ConvertToV8(isolate, dict));
auto root_local = ConvertToV8(isolate, root);
// Create a persistent reference of the object, so that we can check the
// monitor again when GC collects this object.
auto* tex_persistent = monitor->CreatePersistent(isolate, root_local);
tex_persistent->SetWeak(
monitor,
[](const v8::WeakCallbackInfo<OffscreenReleaseHolderMonitor>& data) {
auto* monitor = data.GetParameter();
if (!monitor->IsTextureReleased()) {
// Emit a warning when user didn't properly manually release the
// texture, output it in second pass callback.
data.SetSecondPassCallback([](const v8::WeakCallbackInfo<
OffscreenReleaseHolderMonitor>& data) {
// Emit warning only once
static std::once_flag flag;
std::call_once(flag, [=] {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce([] {
electron::util::EmitWarning(
"Offscreen rendering shared texture was garbage "
"collected before calling `release()`. When using OSR "
"with `useSharedTexture: true`, `texture.release()` "
"must be called explicitly as soon as the texture is "
"copied to your rendering system. Otherwise, it will "
"soon drain the underlying frame pool and prevent "
"future frames from being sent.",
"OSRSharedTextureNotReleased");
}));
});
});
}
// We are responsible for resetting the persistent handle.
monitor->ResetPersistent();
// Finally, release the holder monitor.
delete monitor;
},
v8::WeakCallbackType::kParameter);
return root_local;
}
} // namespace gin