mirror of
https://github.com/electron/electron.git
synced 2026-01-08 23:18:06 -05:00
* chore: upgrade Node.js to v24.10.0 * chore: fixup crypto patch * chore: fixup crypto test patch * src: prepare for v8 sandboxing https://github.com/nodejs/node/pull/58376 * esm: fix module.exports export on CJS modules https://github.com/nodejs/node/pull/57366 * chore: fixup lazyload fs patch * esm: Source Phase Imports for WebAssembly https://github.com/nodejs/node/pull/56919 * module: remove --experimental-default-type https://github.com/nodejs/node/pull/56092 * lib,src: refactor assert to load error source from memory https://github.com/nodejs/node/pull/59751 * src: add source location to v8::TaskRunner https://github.com/nodejs/node/pull/54077 * src: remove dependency on wrapper-descriptor-based CppHeap https://github.com/nodejs/node/pull/54077 * src: do not use soon-to-be-deprecated V8 API https://github.com/nodejs/node/pull/53174 * src: stop using deprecated fields of v8::FastApiCallbackOptions https://github.com/nodejs/node/pull/54077 * test: update v8-stats test for V8 12.6 https://github.com/nodejs/node/pull/54077 * esm: unflag --experimental-wasm-modules https://github.com/nodejs/node/pull/57038 * test: adapt assert tests to stack trace changes https://github.com/nodejs/node/pull/58070 * src,test: unregister the isolate after disposal and before freeing https://github.com/nodejs/node/pull/58070 * src: use cppgc to manage ContextifyContext https://github.com/nodejs/node/pull/56522 * src: replace uses of FastApiTypedArray https://github.com/nodejs/node/pull/58070 * module: integrate TypeScript into compile cache https://github.com/nodejs/node/pull/56629 * deps: update ada to 3.2.7 https://github.com/nodejs/node/pull/59336 * src: make minor cleanups in encoding_binding.cc https://github.com/nodejs/node/pull/57448 * src: switch from `Get/SetPrototype` to `Get/SetPrototypeV2` https://github.com/nodejs/node/pull/55453 * src: use non-deprecated Get/SetPrototype methods https://github.com/nodejs/node/pull/59671 * src: simplify string_bytes with views https://github.com/nodejs/node/pull/54876 * src: improve utf8 string generation performance https://github.com/nodejs/node/pull/54873 * src: use non-deprecated Utf8LengthV2() method https://github.com/nodejs/node/pull/58070 * src: use non-deprecated WriteUtf8V2() method https://github.com/nodejs/node/pull/58070 * src: refactor WriteUCS2 and remove flags argument https://github.com/nodejs/node/pull/58163 * src: use String::WriteV2() in TwoByteValue https://github.com/nodejs/node/pull/58164 * node-api: use WriteV2 in napi_get_value_string_utf16 https://github.com/nodejs/node/pull/58165 * node-api: use WriteOneByteV2 in napi_get_value_string_latin1 https://github.com/nodejs/node/pull/58325 * src: migrate WriteOneByte to WriteOneByteV2 https://github.com/nodejs/node/pull/59634 * fs: introduce dirent\.parentPath https://github.com/nodejs/node/pull/50976 * src: avoid copy by using std::views::keys https://github.com/nodejs/node/pull/56080 * chore: fixup patch indices * fix: errant use of context->GetIsolate() * fix: tweak BoringSSL compat patch for new changes * fix: add back missing isolate dtor declaration * fixup! esm: fix module.exports export on CJS modules * cli: remove --no-experimental-fetch flag https://github.com/nodejs/node/pull/52611/files * esm: Source Phase Imports for WebAssembly https://github.com/nodejs/node/pull/56919 * fixup! src: prepare for v8 sandboxing * chore: bump @types/node to v24 * chore: fix const assignment in crypto test * fix: sandbox pointer patch issues * chore: rework source phase import patch * src: add percentage support to --max-old-space-size https://github.com/nodejs/node/pull/59082 * chore: fixup crypto tests * chore: HostImportModuleWithPhaseDynamically todo * fix: cjs esm failures * fix: v8::Object::Wrappable issues -b72a615754-490bac2496-4896a0dd69* chore: remove deleted specs * src: use v8::ExternalMemoryAccounter https://github.com/nodejs/node/pull/58070 * fs: port SonicBoom module to fs module as FastUtf8Stream https://github.com/nodejs/node/pull/58897 * chore: tweak sandboxed pr patch * test: disable parallel/test-os-checked-function * test: use WHATWG URL instead of url.parse * fix: OPENSSL_secure_zalloc doesn't work in BoringSSL * chore: fix accidental extra line * 7017517: [defer-import-eval] Parse import defer syntax https://chromium-review.googlesource.com/c/v8/v8/+/7017517
207 lines
7.0 KiB
TypeScript
207 lines
7.0 KiB
TypeScript
import type * as defaultMenuModule from '@electron/internal/browser/default-menu';
|
|
|
|
import { EventEmitter } from 'events';
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
import type * as url from 'url';
|
|
import type * as v8 from 'v8';
|
|
|
|
const Module = require('module') as NodeJS.ModuleInternal;
|
|
|
|
// We modified the original process.argv to let node.js load the init.js,
|
|
// we need to restore it here.
|
|
process.argv.splice(1, 1);
|
|
|
|
// Import common settings.
|
|
require('@electron/internal/common/init');
|
|
|
|
process._linkedBinding('electron_browser_event_emitter').setEventEmitterPrototype(EventEmitter.prototype);
|
|
|
|
// Don't quit on fatal error.
|
|
process.on('uncaughtException', function (error) {
|
|
// Do nothing if the user has a custom uncaught exception handler.
|
|
if (process.listenerCount('uncaughtException') > 1) {
|
|
return;
|
|
}
|
|
|
|
// Show error in GUI.
|
|
// We can't import { dialog } at the top of this file as this file is
|
|
// responsible for setting up the require hook for the "electron" module
|
|
// so we import it inside the handler down here
|
|
import('electron')
|
|
.then(({ dialog }) => {
|
|
const stack = error.stack ? error.stack : `${error.name}: ${error.message}`;
|
|
const message = 'Uncaught Exception:\n' + stack;
|
|
dialog.showErrorBox('A JavaScript error occurred in the main process', message);
|
|
});
|
|
});
|
|
|
|
// Emit 'exit' event on quit.
|
|
const { app } = require('electron');
|
|
|
|
app.on('quit', (_event: any, exitCode: number) => {
|
|
process.emit('exit', exitCode);
|
|
});
|
|
|
|
if (process.platform === 'win32') {
|
|
// If we are a Squirrel.Windows-installed app, set app user model ID
|
|
// so that users don't have to do this.
|
|
//
|
|
// Squirrel packages are always of the form:
|
|
//
|
|
// PACKAGE-NAME
|
|
// - Update.exe
|
|
// - app-VERSION
|
|
// - OUREXE.exe
|
|
//
|
|
// Squirrel itself will always set the shortcut's App User Model ID to the
|
|
// form `com.squirrel.PACKAGE-NAME.OUREXE`. We need to call
|
|
// app.setAppUserModelId with a matching identifier so that renderer processes
|
|
// will inherit this value.
|
|
const updateDotExe = path.join(path.dirname(process.execPath), '..', 'update.exe');
|
|
|
|
if (fs.existsSync(updateDotExe)) {
|
|
const packageDir = path.dirname(path.resolve(updateDotExe));
|
|
const packageName = path.basename(packageDir).replaceAll(/\s/g, '');
|
|
const exeName = path.basename(process.execPath).replace(/\.exe$/i, '').replaceAll(/\s/g, '');
|
|
|
|
app.setAppUserModelId(`com.squirrel.${packageName}.${exeName}`);
|
|
}
|
|
}
|
|
|
|
// Map process.exit to app.exit, which quits gracefully.
|
|
process.exit = app.exit as () => never;
|
|
|
|
// Load the RPC server.
|
|
require('@electron/internal/browser/rpc-server');
|
|
|
|
// Load the guest view manager.
|
|
require('@electron/internal/browser/guest-view-manager');
|
|
|
|
// Now we try to load app's package.json.
|
|
const v8Util = process._linkedBinding('electron_common_v8_util');
|
|
let packagePath = null;
|
|
let packageJson = null;
|
|
const searchPaths: string[] = v8Util.getHiddenValue(global, 'appSearchPaths');
|
|
const searchPathsOnlyLoadASAR: boolean = v8Util.getHiddenValue(global, 'appSearchPathsOnlyLoadASAR');
|
|
// Borrow the _getOrCreateArchive asar helper
|
|
const getOrCreateArchive = process._getOrCreateArchive;
|
|
delete process._getOrCreateArchive;
|
|
|
|
if (process.resourcesPath) {
|
|
for (packagePath of searchPaths) {
|
|
try {
|
|
packagePath = path.join(process.resourcesPath, packagePath);
|
|
if (searchPathsOnlyLoadASAR) {
|
|
if (!getOrCreateArchive?.(packagePath)) {
|
|
continue;
|
|
}
|
|
}
|
|
packageJson = Module._load(path.join(packagePath, 'package.json'));
|
|
break;
|
|
} catch {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (packageJson == null) {
|
|
process.nextTick(function () {
|
|
return process.exit(1);
|
|
});
|
|
throw new Error('Unable to find a valid app');
|
|
}
|
|
|
|
// Set application's version.
|
|
if (packageJson.version != null) {
|
|
app.setVersion(packageJson.version);
|
|
}
|
|
|
|
// Set application's name.
|
|
if (packageJson.productName != null) {
|
|
app.name = `${packageJson.productName}`.trim();
|
|
} else if (packageJson.name != null) {
|
|
app.name = `${packageJson.name}`.trim();
|
|
}
|
|
|
|
// Set application's desktop name.
|
|
if (packageJson.desktopName != null) {
|
|
app.setDesktopName(packageJson.desktopName);
|
|
} else {
|
|
app.setDesktopName(`${app.name}.desktop`);
|
|
}
|
|
|
|
// Set v8 flags, deliberately lazy load so that apps that do not use this
|
|
// feature do not pay the price
|
|
if (packageJson.v8Flags != null) {
|
|
(require('v8') as typeof v8).setFlagsFromString(packageJson.v8Flags);
|
|
}
|
|
|
|
app.setAppPath(packagePath);
|
|
|
|
// Load the chrome devtools support.
|
|
require('@electron/internal/browser/devtools');
|
|
|
|
// Load protocol module to ensure it is populated on app ready
|
|
require('@electron/internal/browser/api/protocol');
|
|
|
|
// Load service-worker-main module to ensure it is populated on app ready
|
|
require('@electron/internal/browser/api/service-worker-main');
|
|
|
|
// Load web-contents module to ensure it is populated on app ready
|
|
require('@electron/internal/browser/api/web-contents');
|
|
|
|
// Load web-frame-main module to ensure it is populated on app ready
|
|
require('@electron/internal/browser/api/web-frame-main');
|
|
|
|
// Required because `new BrowserWindow` calls some WebContentsView stuff, so
|
|
// the inheritance needs to be set up before that happens.
|
|
require('@electron/internal/browser/api/web-contents-view');
|
|
|
|
// Set main startup script of the app.
|
|
const mainStartupScript = packageJson.main || 'index.js';
|
|
|
|
// Quit when all windows are closed and no other one is listening to this.
|
|
app.on('window-all-closed', () => {
|
|
if (app.listenerCount('window-all-closed') === 1) {
|
|
app.quit();
|
|
}
|
|
});
|
|
|
|
const { setDefaultApplicationMenu } = require('@electron/internal/browser/default-menu') as typeof defaultMenuModule;
|
|
|
|
// Create default menu.
|
|
//
|
|
// The |will-finish-launching| event is emitted before |ready| event, so default
|
|
// menu is set before any user window is created.
|
|
app.once('will-finish-launching', setDefaultApplicationMenu);
|
|
|
|
const { appCodeLoaded } = process;
|
|
delete process.appCodeLoaded;
|
|
|
|
if (packagePath) {
|
|
// Finally load app's main.js and transfer control to C++.
|
|
if ((packageJson.type === 'module' && !mainStartupScript.endsWith('.cjs')) || mainStartupScript.endsWith('.mjs')) {
|
|
const { runEntryPointWithESMLoader } = __non_webpack_require__('internal/modules/run_main') as typeof import('@node/lib/internal/modules/run_main');
|
|
const main = (require('url') as typeof url).pathToFileURL(path.join(packagePath, mainStartupScript));
|
|
runEntryPointWithESMLoader(async (cascadedLoader: any) => {
|
|
try {
|
|
await cascadedLoader.import(main.toString(), undefined, Object.create(null));
|
|
appCodeLoaded!();
|
|
} catch (err) {
|
|
appCodeLoaded!();
|
|
process.emit('uncaughtException', err as Error);
|
|
}
|
|
});
|
|
} else {
|
|
// Call appCodeLoaded before just for safety, it doesn't matter here as _load is synchronous
|
|
appCodeLoaded!();
|
|
Module._load(path.join(packagePath, mainStartupScript), Module, true);
|
|
}
|
|
} else {
|
|
console.error('Failed to locate a valid package to load (app, app.asar or default_app.asar)');
|
|
console.error('This normally means you\'ve damaged the Electron package somehow');
|
|
appCodeLoaded!();
|
|
}
|