![electron-roller[bot]](/assets/img/avatar_default.png)
* chore: bump chromium in DEPS to 141.0.7352.0 * chore: update patches * 6830573: Revert 'Migrate WrappableWithNamedPropertyInterceptor to gin::Wrappable' | https://chromium-review.googlesource.com/c/chromium/src/+/6830573 * chore: bump chromium in DEPS to 141.0.7354.0 * chore: bump chromium in DEPS to 141.0.7356.0 * chore: bump chromium in DEPS to 141.0.7357.0 * chore: bump chromium in DEPS to 141.0.7359.0 * chore: bump chromium in DEPS to 141.0.7361.0 * 6838518: [Mac] Correctly deallocate sandbox error buffers and prevent crash resulting from nullptr assignment | https://chromium-review.googlesource.com/c/chromium/src/+/6838518 * 6850973: Reland "Use base::ByteCount in base::SysInfo." | https://chromium-review.googlesource.com/c/chromium/src/+/6850973 * 6506565: [FPF-CI] Create initial NoiseHash in the browser. | https://chromium-review.googlesource.com/c/chromium/src/+/6506565 * chore: update patches * fixup! 6850973: Reland "Use base::ByteCount in base::SysInfo." | https://chromium-review.googlesource.com/c/chromium/src/+/6850973 * fixup! 6506565: [FPF-CI] Create initial NoiseHash in the browser. | https://chromium-review.googlesource.com/c/chromium/src/+/6506565 * fix: unsafe buffer warning in fix_properly_honor_printing_page_ranges.patch * fix: FTBFS in src_remove_dependency_on_wrapper-descriptor-based_cppheap.patch This change should be upstreamed. Fixes this error: ../../third_party/electron_node/src/env.cc:606:3: error: no matching function for call to 'Wrap' 606 | v8::Object::Wrap<v8::CppHeapPointerTag::kDefaultTag>( | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../v8/include/v8-object.h:1076:14: note: candidate function template not viable: cannot convert argument of incomplete type 'void *' to 'v8::Object::Wrappable *' for 3rd argument 1076 | void Object::Wrap(v8::Isolate* isolate, const v8::Local<v8::Object>& wrapper, | ^ 1077 | v8::Object::Wrappable* wrappable) { | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../v8/include/v8-object.h:1084:14: note: candidate function template not viable: no known conversion from 'Local<Object>' to 'const PersistentBase<Object>' for 2nd argument 1084 | void Object::Wrap(v8::Isolate* isolate, const PersistentBase<Object>& wrapper, | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../v8/include/v8-object.h:1093:14: note: candidate function template not viable: no known conversion from 'Local<Object>' to 'const BasicTracedReference<Object>' for 2nd argument 1093 | void Object::Wrap(v8::Isolate* isolate, | ^ 1094 | const BasicTracedReference<Object>& wrapper, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. * [v8-init] Access crash key only from main thread | https://chromium-review.googlesource.com/c/chromium/src/+/6827167 * chore: e patches all * chore: remove chore_restore_some_deprecated_wrapper_utility_in_gin.patch from patches this remove line got re-added when rebasing roller/chromium/main * chore: e patches all * fix: include base/time/time.h when using base::Time * chore: update patches * Make --host-rules an alias for --host-resolver-rules. Refs https://chromium-review.googlesource.com/c/chromium/src/+/4867872 * ci: update BUILD_TOOLS_SHA Refs https://github.com/electron/build-tools/pull/746 * [Fontations] Remove Fontations suffix from font names Refs https://chromium-review.googlesource.com/c/chromium/src/+/6835930 * temp: debug macOS addon build failure * Revert "temp: debug macOS addon build failure" This reverts commit 40bc8abab65dc83e17c4ab97cb6e7522a193fb44. * test: run tests with Xcode 16.4 * ci: fix tccdb update for macOS 15 * spec: disable opening external application for loadURL on macOS opening unknown external application will bring up dialog to choose apps from application store which will break our other test suites that want to capture screen for pixel matching. The loadURL spec that tests bad-scheme://foo is sufficient that we hit the permission handler for openExternal since at that point we already know the runtime gave up on handling the scheme. * chore: rebase patches * chore: disable codesiging tests * ci: update ScreenCaptureApprovals.plist for /bin/bash * ci: try updating tcc permissions * ci: update TCC permissions Refs https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive * chore: test with 1st quadrant of the window * chore: adjust for macOS 15 menubar height --------- Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Keeley Hammond <khammond@slack-corp.com> Co-authored-by: Keeley Hammond <vertedinde@electronjs.org> Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
196 lines
6.4 KiB
JavaScript
196 lines
6.4 KiB
JavaScript
const { app, protocol } = require('electron');
|
|
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
const v8 = require('node:v8');
|
|
|
|
const FAILURE_STATUS_KEY = 'Electron_Spec_Runner_Failures';
|
|
|
|
// We want to terminate on errors, not throw up a dialog
|
|
process.on('uncaughtException', (err) => {
|
|
console.error('Unhandled exception in main spec runner:', err);
|
|
process.exit(1);
|
|
});
|
|
|
|
// Tell ts-node which tsconfig to use
|
|
process.env.TS_NODE_PROJECT = path.resolve(__dirname, '../tsconfig.spec.json');
|
|
process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = 'true';
|
|
|
|
// Some Linux machines have broken hardware acceleration support.
|
|
if (process.env.ELECTRON_TEST_DISABLE_HARDWARE_ACCELERATION) {
|
|
app.disableHardwareAcceleration();
|
|
}
|
|
|
|
v8.setFlagsFromString('--expose_gc');
|
|
app.commandLine.appendSwitch('js-flags', '--expose_gc');
|
|
// Prevent the spec runner quitting when the first window closes
|
|
app.on('window-all-closed', () => null);
|
|
|
|
// Use fake device for Media Stream to replace actual camera and microphone.
|
|
app.commandLine.appendSwitch('use-fake-device-for-media-stream');
|
|
app.commandLine.appendSwitch('host-resolver-rules', [
|
|
'MAP localhost2 127.0.0.1',
|
|
'MAP ipv4.localhost2 10.0.0.1',
|
|
'MAP ipv6.localhost2 [::1]',
|
|
'MAP notfound.localhost2 ~NOTFOUND'
|
|
].join(', '));
|
|
|
|
// Enable features required by tests.
|
|
app.commandLine.appendSwitch('enable-features', [
|
|
// spec/api-web-frame-main-spec.ts
|
|
'DocumentPolicyIncludeJSCallStacksInCrashReports'
|
|
].join(','));
|
|
|
|
global.standardScheme = 'app';
|
|
global.zoomScheme = 'zoom';
|
|
global.serviceWorkerScheme = 'sw';
|
|
protocol.registerSchemesAsPrivileged([
|
|
{ scheme: global.standardScheme, privileges: { standard: true, secure: true, stream: false } },
|
|
{ scheme: global.zoomScheme, privileges: { standard: true, secure: true } },
|
|
{ scheme: global.serviceWorkerScheme, privileges: { allowServiceWorkers: true, standard: true, secure: true } },
|
|
{ scheme: 'http-like', privileges: { standard: true, secure: true, corsEnabled: true, supportFetchAPI: true } },
|
|
{ scheme: 'cors-blob', privileges: { corsEnabled: true, supportFetchAPI: true } },
|
|
{ scheme: 'cors', privileges: { corsEnabled: true, supportFetchAPI: true } },
|
|
{ scheme: 'no-cors', privileges: { supportFetchAPI: true } },
|
|
{ scheme: 'no-fetch', privileges: { corsEnabled: true } },
|
|
{ scheme: 'stream', privileges: { standard: true, stream: true } },
|
|
{ scheme: 'foo', privileges: { standard: true } },
|
|
{ scheme: 'bar', privileges: { standard: true } }
|
|
]);
|
|
|
|
app.whenReady().then(async () => {
|
|
require('ts-node/register');
|
|
|
|
const argv = require('yargs')
|
|
.boolean('ci')
|
|
.array('files')
|
|
.string('g').alias('g', 'grep')
|
|
.boolean('i').alias('i', 'invert')
|
|
.argv;
|
|
|
|
const Mocha = require('mocha');
|
|
const mochaOptions = {
|
|
forbidOnly: process.env.CI
|
|
};
|
|
if (process.env.CI) {
|
|
mochaOptions.retries = 3;
|
|
}
|
|
if (process.env.MOCHA_REPORTER) {
|
|
mochaOptions.reporter = process.env.MOCHA_REPORTER;
|
|
}
|
|
if (process.env.MOCHA_MULTI_REPORTERS) {
|
|
mochaOptions.reporterOptions = {
|
|
reporterEnabled: process.env.MOCHA_MULTI_REPORTERS
|
|
};
|
|
}
|
|
// The MOCHA_GREP and MOCHA_INVERT are used in some vendor builds for sharding
|
|
// tests.
|
|
if (process.env.MOCHA_GREP) {
|
|
mochaOptions.grep = process.env.MOCHA_GREP;
|
|
}
|
|
if (process.env.MOCHA_INVERT) {
|
|
mochaOptions.invert = process.env.MOCHA_INVERT === 'true';
|
|
}
|
|
const mocha = new Mocha(mochaOptions);
|
|
|
|
// Add a root hook on mocha to skip any tests that are disabled
|
|
const disabledTests = new Set(
|
|
JSON.parse(
|
|
fs.readFileSync(path.join(__dirname, 'disabled-tests.json'), 'utf8')
|
|
)
|
|
);
|
|
mocha.suite.beforeEach(function () {
|
|
// TODO(clavin): add support for disabling *suites* by title, not just tests
|
|
if (disabledTests.has(this.currentTest?.fullTitle())) {
|
|
this.skip();
|
|
}
|
|
});
|
|
|
|
// The cleanup method is registered this way rather than through an
|
|
// `afterEach` at the top level so that it can run before other `afterEach`
|
|
// methods.
|
|
//
|
|
// The order of events is:
|
|
// 1. test completes,
|
|
// 2. `defer()`-ed methods run, in reverse order,
|
|
// 3. regular `afterEach` hooks run.
|
|
const { runCleanupFunctions } = require('./lib/spec-helpers');
|
|
mocha.suite.on('suite', function attach (suite) {
|
|
suite.afterEach('cleanup', runCleanupFunctions);
|
|
suite.on('suite', attach);
|
|
});
|
|
|
|
if (!process.env.MOCHA_REPORTER) {
|
|
mocha.ui('bdd').reporter('tap');
|
|
}
|
|
const mochaTimeout = process.env.MOCHA_TIMEOUT || 30000;
|
|
mocha.timeout(mochaTimeout);
|
|
|
|
if (argv.grep) mocha.grep(argv.grep);
|
|
if (argv.invert) mocha.invert();
|
|
|
|
const baseElectronDir = path.resolve(__dirname, '..');
|
|
const validTestPaths = argv.files && argv.files.map(file =>
|
|
path.isAbsolute(file)
|
|
? path.relative(baseElectronDir, file)
|
|
: path.normalize(file));
|
|
const filter = (file) => {
|
|
if (!/-spec\.[tj]s$/.test(file)) {
|
|
return false;
|
|
}
|
|
|
|
// This allows you to run specific modules only:
|
|
// npm run test -match=menu
|
|
const moduleMatch = process.env.npm_config_match
|
|
? new RegExp(process.env.npm_config_match, 'g')
|
|
: null;
|
|
if (moduleMatch && !moduleMatch.test(file)) {
|
|
return false;
|
|
}
|
|
|
|
if (validTestPaths && !validTestPaths.includes(path.relative(baseElectronDir, file))) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
const { getFiles } = require('./get-files');
|
|
const testFiles = await getFiles(__dirname, filter);
|
|
for (const file of testFiles.sort()) {
|
|
mocha.addFile(file);
|
|
}
|
|
|
|
if (validTestPaths && validTestPaths.length > 0 && testFiles.length === 0) {
|
|
console.error('Test files were provided, but they did not match any searched files');
|
|
console.error('provided file paths (relative to electron/):', validTestPaths);
|
|
process.exit(1);
|
|
}
|
|
|
|
const cb = () => {
|
|
// Ensure the callback is called after runner is defined
|
|
process.nextTick(() => {
|
|
if (process.env.ELECTRON_FORCE_TEST_SUITE_EXIT === 'true') {
|
|
console.log(`${FAILURE_STATUS_KEY}: ${runner.failures}`);
|
|
process.kill(process.pid);
|
|
} else {
|
|
process.exit(runner.failures);
|
|
}
|
|
});
|
|
};
|
|
|
|
// Set up chai in the correct order
|
|
const chai = require('chai');
|
|
chai.use(require('chai-as-promised'));
|
|
chai.use(require('dirty-chai'));
|
|
|
|
// Show full object diff
|
|
// https://github.com/chaijs/chai/issues/469
|
|
chai.config.truncateThreshold = 0;
|
|
|
|
const runner = mocha.run(cb);
|
|
}).catch((err) => {
|
|
console.error('An error occurred while running the spec runner');
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|