electron/shell/app/node_main.cc
electron-roller[bot] 08ccc81574
chore: bump chromium to 107.0.5274.0 (main) (#35375)
* chore: bump chromium in DEPS to 106.0.5247.1

* chore: update can_create_window.patch

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

content/renderer/render_view_impl.cc was removed

* chore: update patches/chromium/printing.patch

Normal code shear.

* chore: update patches/chromium/add_contentgpuclient_precreatemessageloop_callback.patch

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

fix minor code shear that caused the patch to not apply

* chore: update patches/chromium/picture-in-picture.patch

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

Normal code shear.

* chore: update patches/chromium/allow_disabling_blink_scheduler_throttling_per_renderview.patch

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

content/renderer/render_view_impl.cc was removed

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

Normal code shear.

* chore: update patches/chromium/feat_add_streaming-protocol_registry_to_multibuffer_data_source.patch

Normal code shear.

* chore: update patches/chromium/fix_patch_out_profile_refs_in_accessibility_ui.patch

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

Normal code shear.

* chore: update patches/chromium/build_disable_print_content_analysis.patch

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

Normal code shear.

* chore: short-circuit_permissions_checks_in_mediastreamdevicescontroller.patch

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

Normal code shear.

* chore: update patches

* chore: bump chromium in DEPS to 106.0.5249.0

* chore: bump chromium in DEPS to 107.0.5250.0

* chore: bump chromium in DEPS to 107.0.5252.0

* chore: bump chromium in DEPS to 107.0.5254.0

* chore: bump chromium in DEPS to 107.0.5256.1

* chore: update v8 patches

* chore: update chromium patches

* [CodeHealthRotation] base::Value::Dict (v2) migration for //c/b/ui/zoom

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

* Add support for snapped window states for lacros

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

* webui: Migrate /chrome/browser/ui/webui URLDataSources to GetMimeType(GURL)

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

* Provide explicit template arguments to blink::AssociatedInterfaceRegistry::AddInterface

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

* Make WebScriptExecutionCallback base::OnceCallback

Refs
https://chromium-review.googlesource.com/c/chromium/src/+/3676532
https://chromium-review.googlesource.com/c/chromium/src/+/3724623
https://chromium-review.googlesource.com/c/chromium/src/+/3675752

* Add implementation of reduce accept language service

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

* Add PermissionResult in //content/public.

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

* [Extensions] Add new Webstore domain to extension URLs and clients

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

* chore: update node patches

* chore: fix lint

* chore: update filenames.libcxx.gni

* fixup! Make WebScriptExecutionCallback base::OnceCallback

* chore: bump chromium in DEPS to 107.0.5266.1

* chore: bump chromium in DEPS to 107.0.5268.0

* chore: bump chromium in DEPS to 107.0.5270.1

* chore: update patches

* 3848842: [DevTools] Added 'printing-in-progress' error code.

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

* 3855766: PA: Move the allocator shim files into partition_allocator/shim/ | https://chromium-review.googlesource.com/c/chromium/src/+/3855766

* Change gfx::Rect to blink::mojom::WindowFeatures in AddNewContents and some related functions.

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

* Use base::FunctionRef for the various ForEachRenderFrameHost helpers.

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

* [loader] Send cached metadata as part of OnReceiveResponse

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

* 3832927: [json-schema-compiler] Support abs::optional<int>

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

* Use unique_ptr for BrowserPluginGuestDelegate::CreateNewGuestWindow

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

* 3847044: [Android] Dismiss select popup upon entering fullscreen

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

* chore: update patches

* chore: add missing header

* Migration of chrome/ BrowserContextKeyedServiceFactory to ProfileKeyedServiceFactory Part 12

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

* 3786946: cast pwrite64 arg to long to avoid compilation error on arm

https://chromium-review.googlesource.com/c/linux-syscall-support/+/3786946

* chore: update patches after rebase

* 3846114: float: Implement for lacros p2.

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

* 3825237: Enable -Wunqualified-std-cast-call

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

* chore: bump chromium in DEPS to 107.0.5272.0

* chore: update patches

* 3835746: Rename PepperPluginInfo to ContentPluginInfo

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

* 3852542: Plumb drag-image rect from blink to browser to RenderWidgetHostImpl

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

* 3826169: [json-schema-compiler] Support abs::optional<bool>

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

Also 3840687: [json-schema-compiler] Support abs::optional<double>

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

* 3857319: Reland "Remove PrefService::Get"

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

* 3854614: Rework LinuxUi ownership and creation

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

* chore: bump chromium in DEPS to 107.0.5274.0

* 3866104: [DownloadBubble] Change download notifications in exclusive_access

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

* chore: update patches

* chore: disable optimization guide for preconnect feature

* 3860569: Enable -Wshadow on Linux.

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

* chore: update patches after rebase

* fixup: update to accomodate Wc++98-compat-extra-semi flag

* Revert "fixup! Make WebScriptExecutionCallback base::OnceCallback"

This reverts commit 0866fe8648671f04e4ea45ceed85db6e4a3b260b.

* fixup! Make WebScriptExecutionCallback base::OnceCallback

* fixup! Make WebScriptExecutionCallback base::OnceCallback

* 3840937: [sandbox] Merge V8_SANDBOXED_POINTERS into V8_ENABLE_SANDBOX

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

* fixup! chore: update can_create_window.patch

* chore: update patches

* 53946: Track SSL_ERROR_ZERO_RETURN explicitly.

https://boringssl-review.googlesource.com/c/boringssl/+/53946

* fixup: Migration of chrome/ BrowserContextKeyedServiceFactory to ProfileKeyedServiceFactory Part 12

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

* 3805932: [headless] Added print compositor support for OOPIF printing.

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

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: deepak1556 <hop2deep@gmail.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
2022-09-07 09:46:37 +02:00

305 lines
9.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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/app/node_main.h"
#include <map>
#include <memory>
#include <string>
#include <unordered_set>
#include <utility>
#include <vector>
#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/thread_pool/thread_pool_instance.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/public/common/content_switches.h"
#include "electron/electron_version.h"
#include "gin/array_buffer.h"
#include "gin/public/isolate_holder.h"
#include "gin/v8_initializer.h"
#include "shell/app/uv_task_runner.h"
#include "shell/browser/javascript_environment.h"
#include "shell/common/api/electron_bindings.h"
#include "shell/common/gin_helper/dictionary.h"
#include "shell/common/node_bindings.h"
#include "shell/common/node_includes.h"
#if BUILDFLAG(IS_LINUX)
#include "components/crash/core/app/breakpad_linux.h"
#endif
#if BUILDFLAG(IS_WIN)
#include "chrome/child/v8_crashpad_support_win.h"
#endif
#if !defined(MAS_BUILD)
#include "components/crash/core/app/crashpad.h" // nogncheck
#include "shell/app/electron_crash_reporter_client.h"
#include "shell/browser/api/electron_api_crash_reporter.h"
#include "shell/common/crash_keys.h"
#endif
namespace {
// Initialize Node.js cli options to pass to Node.js
// See https://nodejs.org/api/cli.html#cli_options
int SetNodeCliFlags() {
// Options that are unilaterally disallowed
const std::unordered_set<base::StringPiece, base::StringPieceHash>
disallowed = {"--openssl-config", "--use-bundled-ca", "--use-openssl-ca",
"--force-fips", "--enable-fips"};
const auto argv = base::CommandLine::ForCurrentProcess()->argv();
std::vector<std::string> args;
// TODO(codebytere): We need to set the first entry in args to the
// process name owing to src/node_options-inl.h#L286-L290 but this is
// redundant and so should be refactored upstream.
args.reserve(argv.size() + 1);
args.emplace_back("electron");
for (const auto& arg : argv) {
#if BUILDFLAG(IS_WIN)
const auto& option = base::WideToUTF8(arg);
#else
const auto& option = arg;
#endif
const auto stripped = base::StringPiece(option).substr(0, option.find('='));
if (disallowed.count(stripped) != 0) {
LOG(ERROR) << "The Node.js cli flag " << stripped
<< " is not supported in Electron";
// Node.js returns 9 from ProcessGlobalArgs for any errors encountered
// when setting up cli flags and env vars. Since we're outlawing these
// flags (making them errors) return 9 here for consistency.
return 9;
} else {
args.push_back(option);
}
}
std::vector<std::string> errors;
// Node.js itself will output parsing errors to
// console so we don't need to handle that ourselves
return ProcessGlobalArgs(&args, nullptr, &errors,
node::kDisallowedInEnvironment);
}
#if defined(MAS_BUILD)
void SetCrashKeyStub(const std::string& key, const std::string& value) {}
void ClearCrashKeyStub(const std::string& key) {}
#endif
} // namespace
namespace electron {
#if BUILDFLAG(IS_LINUX)
void CrashReporterStart(gin_helper::Dictionary options) {
std::string submit_url;
bool upload_to_server = true;
bool ignore_system_crash_handler = false;
bool rate_limit = false;
bool compress = false;
std::map<std::string, std::string> global_extra;
std::map<std::string, std::string> extra;
options.Get("submitURL", &submit_url);
options.Get("uploadToServer", &upload_to_server);
options.Get("ignoreSystemCrashHandler", &ignore_system_crash_handler);
options.Get("rateLimit", &rate_limit);
options.Get("compress", &compress);
options.Get("extra", &extra);
options.Get("globalExtra", &global_extra);
std::string product_name;
if (options.Get("productName", &product_name))
global_extra["_productName"] = product_name;
std::string company_name;
if (options.Get("companyName", &company_name))
global_extra["_companyName"] = company_name;
api::crash_reporter::Start(submit_url, upload_to_server,
ignore_system_crash_handler, rate_limit, compress,
global_extra, extra, true);
}
#endif
v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
std::map<std::string, std::string> keys;
#if !defined(MAS_BUILD)
electron::crash_keys::GetCrashKeys(&keys);
#endif
return gin::ConvertToV8(isolate, keys);
}
int NodeMain(int argc, char* argv[]) {
base::CommandLine::Init(argc, argv);
#if BUILDFLAG(IS_WIN)
v8_crashpad_support::SetUp();
#endif
#if !defined(MAS_BUILD)
ElectronCrashReporterClient::Create();
#endif
#if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_MAC) && !defined(MAS_BUILD))
crash_reporter::InitializeCrashpad(false, "node");
#endif
#if !defined(MAS_BUILD)
crash_keys::SetCrashKeysFromCommandLine(
*base::CommandLine::ForCurrentProcess());
crash_keys::SetPlatformCrashKey();
#endif
int exit_code = 1;
{
// Feed gin::PerIsolateData with a task runner.
uv_loop_t* loop = uv_default_loop();
auto uv_task_runner = base::MakeRefCounted<UvTaskRunner>(loop);
base::ThreadTaskRunnerHandle handle(uv_task_runner);
// Initialize feature list.
auto feature_list = std::make_unique<base::FeatureList>();
feature_list->InitializeFromCommandLine("", "");
base::FeatureList::SetInstance(std::move(feature_list));
// Explicitly register electron's builtin modules.
NodeBindings::RegisterBuiltinModules();
// Parse and set Node.js cli flags.
int flags_exit_code = SetNodeCliFlags();
if (flags_exit_code != 0)
exit(flags_exit_code);
node::InitializationSettingsFlags flags = node::kRunPlatformInit;
node::InitializationResult result =
node::InitializeOncePerProcess(argc, argv, flags);
if (result.early_return)
exit(result.exit_code);
gin::V8Initializer::LoadV8Snapshot(
gin::V8SnapshotFileType::kWithAdditionalContext);
// V8 requires a task scheduler.
base::ThreadPoolInstance::CreateAndStartWithDefaultParams("Electron");
// Allow Node.js to track the amount of time the event loop has spent
// idle in the kernels event provider .
uv_loop_configure(loop, UV_METRICS_IDLE_TIME);
// Initialize gin::IsolateHolder.
JavascriptEnvironment gin_env(loop);
v8::Isolate* isolate = gin_env.isolate();
v8::Isolate::Scope isolate_scope(isolate);
v8::Locker locker(isolate);
node::Environment* env = nullptr;
node::IsolateData* isolate_data = nullptr;
{
v8::HandleScope scope(isolate);
isolate_data = node::CreateIsolateData(isolate, loop, gin_env.platform());
CHECK_NE(nullptr, isolate_data);
uint64_t env_flags = node::EnvironmentFlags::kDefaultFlags |
node::EnvironmentFlags::kHideConsoleWindows;
env = node::CreateEnvironment(
isolate_data, gin_env.context(), result.args, result.exec_args,
static_cast<node::EnvironmentFlags::Flags>(env_flags));
CHECK_NE(nullptr, env);
node::IsolateSettings is;
node::SetIsolateUpForNode(isolate, is);
gin_helper::Dictionary process(isolate, env->process_object());
process.SetMethod("crash", &ElectronBindings::Crash);
// Setup process.crashReporter in child node processes
gin_helper::Dictionary reporter = gin::Dictionary::CreateEmpty(isolate);
#if BUILDFLAG(IS_LINUX)
reporter.SetMethod("start", &CrashReporterStart);
#endif
reporter.SetMethod("getParameters", &GetParameters);
#if defined(MAS_BUILD)
reporter.SetMethod("addExtraParameter", &SetCrashKeyStub);
reporter.SetMethod("removeExtraParameter", &ClearCrashKeyStub);
#else
reporter.SetMethod("addExtraParameter",
&electron::crash_keys::SetCrashKey);
reporter.SetMethod("removeExtraParameter",
&electron::crash_keys::ClearCrashKey);
#endif
process.Set("crashReporter", reporter);
gin_helper::Dictionary versions;
if (process.Get("versions", &versions)) {
versions.SetReadOnly(ELECTRON_PROJECT_NAME, ELECTRON_VERSION_STRING);
}
}
v8::HandleScope scope(isolate);
node::LoadEnvironment(env, node::StartExecutionCallback{});
env->set_trace_sync_io(env->options()->trace_sync_io);
{
v8::SealHandleScope seal(isolate);
bool more;
env->performance_state()->Mark(
node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_START);
do {
uv_run(env->event_loop(), UV_RUN_DEFAULT);
gin_env.platform()->DrainTasks(isolate);
more = uv_loop_alive(env->event_loop());
if (more && !env->is_stopping())
continue;
if (!uv_loop_alive(env->event_loop())) {
EmitBeforeExit(env);
}
// Emit `beforeExit` if the loop became alive either after emitting
// event, or after running some callbacks.
more = uv_loop_alive(env->event_loop());
} while (more && !env->is_stopping());
env->performance_state()->Mark(
node::performance::NODE_PERFORMANCE_MILESTONE_LOOP_EXIT);
}
env->set_trace_sync_io(false);
exit_code = node::EmitExit(env);
node::ResetStdio();
node::Stop(env);
node::FreeEnvironment(env);
node::FreeIsolateData(isolate_data);
}
// According to "src/gin/shell/gin_main.cc":
//
// gin::IsolateHolder waits for tasks running in ThreadPool in its
// destructor and thus must be destroyed before ThreadPool starts skipping
// CONTINUE_ON_SHUTDOWN tasks.
base::ThreadPoolInstance::Get()->Shutdown();
v8::V8::Dispose();
return exit_code;
}
} // namespace electron