
* chore: bump chromium in DEPS to 115.0.5772.0 * chore: update disable_color_correct_rendering.patch no manual changes; patch succeeded with fuzz 2. * chore: update chromium/build_libc_as_static_library.patch no manual changes; patch succeeded with fuzz 2 (offset 1 line). * chore: update chromium/feat_configure_launch_options_for_service_process.patch Xref:4518747
patch manually reapplied due to upstream code shear * chore: update chromium/chore_patch_out_profile_methods_in_profile_selections_cc.patch4502965
patch manually reapplied due to upstream code shear * chore: update bundle_locations #include location Xref:4525355
* chore: Remove `extension_name` from DesktopStreamsRegistry Xref:4514081
* chore: bump chromium in DEPS to 115.0.5778.0 * chore: add chromium/chore_patch_out_profile_methods_in_chrome_browser_pdf.patch Xref:4482679
Another instance of patching out upstream references to Profile code * refactor: add WebViewGuestDelegate::GetGuestDelegateWeakPtr() Xref:4515455
This approach copied from GuestViewBase::GetGuestDelegateWeakPtr() approach in that same commit. * fixup! chore: update bundle_locations #include location Xref:4525355
Sync namespace use to upstream base::mac -> base::apple changes * fixup! chore: update bundle_locations #include location Xref:4525355
Sync namespace use to upstream base::mac -> base::apple changes * chore: update chromium/mas_disable_remote_accessibility.patch Xref:4530546
patch manually reapplied due to upstream code shear * chore: update chromium/printing.patch no manual changes; patch succeeded with fuzz * chore: update chromium/build_add_electron_tracing_category.patch Xref:4517872
no manual changes; patch succeeded with fuzz * chore: update chromium/feat_ensure_mas_builds_of_the_same_application_can_use_safestorage.patch Xref:4529098
patch manually reapplied due to upstream code shear * chromium/build_only_use_the_mas_build_config_in_the_required_components.patch4529098
patch manually reapplied due to upstream code shear * chore: update chromium/mas-cgdisplayusesforcetogray.patch Xref:4529475
no manual changes; patch succeeded with fuzz * chore: update chromium/build_only_use_the_mas_build_config_in_the_required_components.patch Xref:4429011
no manual changes; patch succeeded with fuzz * chore: remove chromium/cherry-pick-48a136e77e6d.patch already present upstream * chore: remove chromium/cherry-pick-e6e23ba00379.patch already present upstream * [Code Health] Remove value based RegisterPref for Dict and List Xref:4533537
* Remove `cxx17_backports.h` and adjust unittest file Xref:4534916
Notes: mostly just removing #include and s/base::clamp/std::clamp/ * refactor: add FakeBrowserProcess helper class Xref:4424072
Used in ElectronBrowserMainParts' fake_browser_process_ field. Previously this was an BrowserProcessImpl instance, but upstream 4424072 makes that an abstract base class. `FakeBrowserProcess` is a thin subclass with the minimum code needed to make it concrete. `ElectronBrowserMainParts::fake_browser_process_` is now a `shared_ptr` instead of a `unique_ptr` so we can avoid exposing `FakeBrowserProcess` in the header. * fixup! refactor: add FakeBrowserProcess helper class remove unnecessary unique_ptr * fix: Browser::SetDockIcon() when !Browser.is_ready() Xref:4410741
An alternative fix for https://github.com/electron/electron/pull/36279 . The previous fix was to call `SetSupportedScales()` ourselves (1b1609a
), but upstream has removed this API. CC @codebytere * fixup! chore: remove chromium/cherry-pick-e6e23ba00379.patch * chore: update chromium/export_gin_v8platform_pageallocator_for_usage_outside_of_the_gin.patch Xref:4517404
patch manually reapplied due to upstream code shear * chore: update patches * chore: add dep: resource_coordinator:mojo_bindings Xref:4521464
* fixup! chore: add dep: resource_coordinator:mojo_bindings chore: make lint happy * chore: patch out Profile methods in titlebar_config Xref:4508143
(primary) Xref:4534461
(followup) * chore: bump chromium in DEPS to 115.0.5780.0 * chore: update chromium/disable_hidden.patch no manual changes; patch succeeded with fuzz * chore: update chromium/sysroot.patch Xref:4535715
no manual changes; patch succeeded with fuzz * chore: update chromium/feat_enable_offscreen_rendering_with_viz_compositor.patch Xref:4403623
patch manually reapplied due to upstream code shear * chore: update chromium/refactor_expose_cursor_changes_to_the_webcontentsobserver.patch Xref:4547380
patch manually reapplied due to upstream code shear * chore: update patches * fixup! fix: Browser::SetDockIcon() when !Browser.is_ready() chore: iwyu image.h * chore: bump chromium in DEPS to 115.0.5782.0 * chore: bump chromium in DEPS to 115.0.5784.0 * 4514181: CR2023: Update filled cr-input styles.4514181
* 4521894: Remove SiteInstanceDeleting usage outside of tests.4521894
* 4525355: Move backup_util and bundle_locations to base/apple4525355
* 4484743: webauthn: add underlying support for calling iCloud Keychain on macOS.4484743
* chore: fixup patch indices * 4546398: Convert /chrome/browser to use ARC4546398
* chore: bump chromium in DEPS to 115.0.5786.0 * chore: update patches * 4540682: Initialize PDF SDK with policy in chrome_pdf::RenderPDFPageToDC()4540682
* Don't import ObjC++ fn headers into electron_api_app * 4535715: Refactor sysroot-creator.sh4535715
* fixup! refactor: add FakeBrowserProcess helper class * 4531903: [string][test] Create/Copy strings to old space before externalization4531903
* 59645: Add APIs to support RSA keys with large e. https://boringssl-review.googlesource.com/c/boringssl/+/59645 --------- Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
154 lines
5 KiB
C++
154 lines
5 KiB
C++
// Copyright (c) 2019 GitHub, Inc. All rights reserved.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "shell/common/gin_helper/callback.h"
|
|
|
|
#include "content/public/browser/browser_thread.h"
|
|
#include "gin/dictionary.h"
|
|
#include "shell/common/process_util.h"
|
|
|
|
namespace gin_helper {
|
|
|
|
namespace {
|
|
|
|
struct TranslaterHolder {
|
|
explicit TranslaterHolder(v8::Isolate* isolate)
|
|
: handle(isolate, v8::External::New(isolate, this)) {
|
|
handle.SetWeak(this, &GC, v8::WeakCallbackType::kParameter);
|
|
}
|
|
~TranslaterHolder() {
|
|
if (!handle.IsEmpty()) {
|
|
handle.ClearWeak();
|
|
handle.Reset();
|
|
}
|
|
}
|
|
|
|
static void GC(const v8::WeakCallbackInfo<TranslaterHolder>& data) {
|
|
delete data.GetParameter();
|
|
}
|
|
|
|
v8::Global<v8::External> handle;
|
|
Translater translater;
|
|
};
|
|
|
|
// Cached JavaScript version of |CallTranslater|.
|
|
v8::Persistent<v8::FunctionTemplate> g_call_translater;
|
|
|
|
void CallTranslater(v8::Local<v8::External> external,
|
|
v8::Local<v8::Object> state,
|
|
gin::Arguments* args) {
|
|
// Whether the callback should only be called once.
|
|
v8::Isolate* isolate = args->isolate();
|
|
auto context = isolate->GetCurrentContext();
|
|
bool one_time =
|
|
state->Has(context, gin::StringToSymbol(isolate, "oneTime")).ToChecked();
|
|
|
|
// Check if the callback has already been called.
|
|
if (one_time) {
|
|
auto called_symbol = gin::StringToSymbol(isolate, "called");
|
|
if (state->Has(context, called_symbol).ToChecked()) {
|
|
args->ThrowTypeError("One-time callback was called more than once");
|
|
return;
|
|
} else {
|
|
state->Set(context, called_symbol, v8::Boolean::New(isolate, true))
|
|
.ToChecked();
|
|
}
|
|
}
|
|
|
|
auto* holder = static_cast<TranslaterHolder*>(external->Value());
|
|
holder->translater.Run(args);
|
|
|
|
// Free immediately for one-time callback.
|
|
if (one_time)
|
|
delete holder;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
// Destroy the class on UI thread when possible.
|
|
struct DeleteOnUIThread {
|
|
template <typename T>
|
|
static void Destruct(const T* x) {
|
|
if (electron::IsBrowserProcess() &&
|
|
!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
|
|
content::BrowserThread::DeleteSoon(content::BrowserThread::UI, FROM_HERE,
|
|
x);
|
|
} else {
|
|
delete x;
|
|
}
|
|
}
|
|
};
|
|
|
|
// Like v8::Global, but ref-counted.
|
|
template <typename T>
|
|
class RefCountedGlobal
|
|
: public base::RefCountedThreadSafe<RefCountedGlobal<T>, DeleteOnUIThread> {
|
|
public:
|
|
RefCountedGlobal(v8::Isolate* isolate, v8::Local<v8::Value> value)
|
|
: handle_(isolate, value.As<T>()) {}
|
|
|
|
bool IsAlive() const { return !handle_.IsEmpty(); }
|
|
|
|
v8::Local<T> NewHandle(v8::Isolate* isolate) const {
|
|
return v8::Local<T>::New(isolate, handle_);
|
|
}
|
|
|
|
private:
|
|
v8::Global<T> handle_;
|
|
};
|
|
|
|
SafeV8Function::SafeV8Function(v8::Isolate* isolate, v8::Local<v8::Value> value)
|
|
: v8_function_(new RefCountedGlobal<v8::Function>(isolate, value)) {}
|
|
|
|
SafeV8Function::SafeV8Function(const SafeV8Function& other) = default;
|
|
|
|
SafeV8Function::~SafeV8Function() = default;
|
|
|
|
bool SafeV8Function::IsAlive() const {
|
|
return v8_function_.get() && v8_function_->IsAlive();
|
|
}
|
|
|
|
v8::Local<v8::Function> SafeV8Function::NewHandle(v8::Isolate* isolate) const {
|
|
return v8_function_->NewHandle(isolate);
|
|
}
|
|
|
|
v8::Local<v8::Value> CreateFunctionFromTranslater(v8::Isolate* isolate,
|
|
const Translater& translater,
|
|
bool one_time) {
|
|
// The FunctionTemplate is cached.
|
|
if (g_call_translater.IsEmpty())
|
|
g_call_translater.Reset(
|
|
isolate,
|
|
CreateFunctionTemplate(isolate, base::BindRepeating(&CallTranslater)));
|
|
|
|
v8::Local<v8::FunctionTemplate> call_translater =
|
|
v8::Local<v8::FunctionTemplate>::New(isolate, g_call_translater);
|
|
auto* holder = new TranslaterHolder(isolate);
|
|
holder->translater = translater;
|
|
gin::Dictionary state = gin::Dictionary::CreateEmpty(isolate);
|
|
if (one_time)
|
|
state.Set("oneTime", true);
|
|
auto context = isolate->GetCurrentContext();
|
|
return BindFunctionWith(
|
|
isolate, context, call_translater->GetFunction(context).ToLocalChecked(),
|
|
holder->handle.Get(isolate), gin::ConvertToV8(isolate, state));
|
|
}
|
|
|
|
// func.bind(func, arg1).
|
|
// NB(zcbenz): Using C++11 version crashes VS.
|
|
v8::Local<v8::Value> BindFunctionWith(v8::Isolate* isolate,
|
|
v8::Local<v8::Context> context,
|
|
v8::Local<v8::Function> func,
|
|
v8::Local<v8::Value> arg1,
|
|
v8::Local<v8::Value> arg2) {
|
|
v8::MaybeLocal<v8::Value> bind =
|
|
func->Get(context, gin::StringToV8(isolate, "bind"));
|
|
CHECK(!bind.IsEmpty());
|
|
v8::Local<v8::Function> bind_func = bind.ToLocalChecked().As<v8::Function>();
|
|
v8::Local<v8::Value> converted[] = {func, arg1, arg2};
|
|
return bind_func->Call(context, func, std::size(converted), converted)
|
|
.ToLocalChecked();
|
|
}
|
|
|
|
} // namespace gin_helper
|