mirror of
https://github.com/electron/electron.git
synced 2026-02-19 03:14:51 -05:00
Compare commits
1 Commits
try-fix-ap
...
miniak/pre
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
484f368ee8 |
@@ -55,22 +55,29 @@ BrowserWindow.prototype._init = function (this: BWT) {
|
||||
|
||||
const warn = deprecate.warnOnceMessage('\'scroll-touch-{begin,end,edge}\' are deprecated and will be removed. Please use the WebContents \'input-event\' event instead.');
|
||||
this.webContents.on('input-event', (_, e) => {
|
||||
if (e.type === 'gestureScrollBegin') {
|
||||
if (this.listenerCount('scroll-touch-begin') !== 0) {
|
||||
warn();
|
||||
this.emit('scroll-touch-edge');
|
||||
this.emit('scroll-touch-begin');
|
||||
switch (e.type) {
|
||||
case 'gestureScrollBegin': {
|
||||
if (this.listenerCount('scroll-touch-begin') !== 0) {
|
||||
warn();
|
||||
this.emit('scroll-touch-edge');
|
||||
this.emit('scroll-touch-begin');
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (e.type === 'gestureScrollUpdate') {
|
||||
if (this.listenerCount('scroll-touch-edge') !== 0) {
|
||||
warn();
|
||||
this.emit('scroll-touch-edge');
|
||||
case 'gestureScrollUpdate': {
|
||||
if (this.listenerCount('scroll-touch-edge') !== 0) {
|
||||
warn();
|
||||
this.emit('scroll-touch-edge');
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (e.type === 'gestureScrollEnd') {
|
||||
if (this.listenerCount('scroll-touch-end') !== 0) {
|
||||
warn();
|
||||
this.emit('scroll-touch-edge');
|
||||
this.emit('scroll-touch-end');
|
||||
case 'gestureScrollEnd': {
|
||||
if (this.listenerCount('scroll-touch-end') !== 0) {
|
||||
warn();
|
||||
this.emit('scroll-touch-edge');
|
||||
this.emit('scroll-touch-end');
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -461,31 +461,39 @@ export class ClientRequest extends Writable implements Electron.ClientRequest {
|
||||
|
||||
this._urlLoader.on('redirect', (event, redirectInfo, headers) => {
|
||||
const { statusCode, newMethod, newUrl } = redirectInfo;
|
||||
if (this._redirectPolicy === 'error') {
|
||||
this._die(new Error('Attempted to redirect, but redirect policy was \'error\''));
|
||||
} else if (this._redirectPolicy === 'manual') {
|
||||
let _followRedirect = false;
|
||||
this._followRedirectCb = () => { _followRedirect = true; };
|
||||
try {
|
||||
this.emit('redirect', statusCode, newMethod, newUrl, headers);
|
||||
} finally {
|
||||
this._followRedirectCb = undefined;
|
||||
if (!_followRedirect && !this._aborted) {
|
||||
this._die(new Error('Redirect was cancelled'));
|
||||
}
|
||||
switch (this._redirectPolicy) {
|
||||
case 'error': {
|
||||
this._die(new Error('Attempted to redirect, but redirect policy was \'error\''));
|
||||
break;
|
||||
}
|
||||
} else if (this._redirectPolicy === 'follow') {
|
||||
case 'manual': {
|
||||
let _followRedirect = false;
|
||||
this._followRedirectCb = () => { _followRedirect = true; };
|
||||
try {
|
||||
this.emit('redirect', statusCode, newMethod, newUrl, headers);
|
||||
} finally {
|
||||
this._followRedirectCb = undefined;
|
||||
if (!_followRedirect && !this._aborted) {
|
||||
this._die(new Error('Redirect was cancelled'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'follow': {
|
||||
// Calling followRedirect() when the redirect policy is 'follow' is
|
||||
// allowed but does nothing. (Perhaps it should throw an error
|
||||
// though...? Since the redirect will happen regardless.)
|
||||
try {
|
||||
this._followRedirectCb = () => {};
|
||||
this.emit('redirect', statusCode, newMethod, newUrl, headers);
|
||||
} finally {
|
||||
this._followRedirectCb = undefined;
|
||||
try {
|
||||
this._followRedirectCb = () => {};
|
||||
this.emit('redirect', statusCode, newMethod, newUrl, headers);
|
||||
} finally {
|
||||
this._followRedirectCb = undefined;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this._die(new Error(`Unexpected redirect policy '${this._redirectPolicy}'`));
|
||||
}
|
||||
} else {
|
||||
this._die(new Error(`Unexpected redirect policy '${this._redirectPolicy}'`));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -48,12 +48,25 @@ function convertToRequestBody (uploadData: ProtocolRequest['uploadData']): Reque
|
||||
} else {
|
||||
if (!chunks.length) { return controller.close(); }
|
||||
const chunk = chunks.shift()!;
|
||||
if (chunk.type === 'rawData') { controller.enqueue(chunk.bytes); } else if (chunk.type === 'file') {
|
||||
current = Readable.toWeb(createReadStream(chunk.filePath, { start: chunk.offset ?? 0, end: chunk.length >= 0 ? chunk.offset + chunk.length : undefined })).getReader();
|
||||
this.pull!(controller);
|
||||
} else if (chunk.type === 'stream') {
|
||||
current = makeStreamFromPipe(chunk.body).getReader();
|
||||
this.pull!(controller);
|
||||
switch (chunk.type) {
|
||||
case 'rawData': {
|
||||
controller.enqueue(chunk.bytes);
|
||||
break;
|
||||
}
|
||||
case 'file': {
|
||||
const stream = createReadStream(chunk.filePath, {
|
||||
start: chunk.offset ?? 0,
|
||||
end: chunk.length >= 0 ? chunk.offset + chunk.length : undefined
|
||||
});
|
||||
current = Readable.toWeb(stream).getReader();
|
||||
this.pull!(controller);
|
||||
break;
|
||||
}
|
||||
case 'stream': {
|
||||
current = makeStreamFromPipe(chunk.body).getReader();
|
||||
this.pull!(controller);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -591,22 +591,34 @@ describe('BrowserWindow module', () => {
|
||||
let url = null as unknown as string;
|
||||
before(async () => {
|
||||
server = http.createServer((req, res) => {
|
||||
if (req.url === '/navigate-top') {
|
||||
res.end('<a target=_top href="/">navigate _top</a>');
|
||||
} else if (req.url === '/navigate-iframe') {
|
||||
res.end('<a href="/test">navigate iframe</a>');
|
||||
} else if (req.url === '/navigate-iframe?navigated') {
|
||||
res.end('Successfully navigated');
|
||||
} else if (req.url === '/navigate-iframe-immediately') {
|
||||
res.end(`
|
||||
switch (req.url) {
|
||||
case '/navigate-top': {
|
||||
res.end('<a target=_top href="/">navigate _top</a>');
|
||||
break;
|
||||
}
|
||||
case '/navigate-iframe': {
|
||||
res.end('<a href="/test">navigate iframe</a>');
|
||||
break;
|
||||
}
|
||||
case '/navigate-iframe?navigated': {
|
||||
res.end('Successfully navigated');
|
||||
break;
|
||||
}
|
||||
case '/navigate-iframe-immediately': {
|
||||
res.end(`
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
location.href += '?navigated'
|
||||
</script>
|
||||
`);
|
||||
} else if (req.url === '/navigate-iframe-immediately?navigated') {
|
||||
res.end('Successfully navigated');
|
||||
} else {
|
||||
res.end('');
|
||||
break;
|
||||
}
|
||||
case '/navigate-iframe-immediately?navigated': {
|
||||
res.end('Successfully navigated');
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
res.end('');
|
||||
}
|
||||
}
|
||||
});
|
||||
url = (await listen(server)).url;
|
||||
@@ -882,18 +894,28 @@ describe('BrowserWindow module', () => {
|
||||
];
|
||||
before(async () => {
|
||||
server = http.createServer((req, res) => {
|
||||
if (req.url === '/navigate') {
|
||||
res.end('<a href="/">navigate</a>');
|
||||
} else if (req.url === '/redirect') {
|
||||
res.end('<a href="/redirect2">redirect</a>');
|
||||
} else if (req.url === '/redirect2') {
|
||||
res.statusCode = 302;
|
||||
res.setHeader('location', url);
|
||||
res.end();
|
||||
} else if (req.url === '/in-page') {
|
||||
res.end('<a href="#in-page">redirect</a><div id="in-page"></div>');
|
||||
} else {
|
||||
res.end('');
|
||||
switch (req.url) {
|
||||
case '/navigate': {
|
||||
res.end('<a href="/">navigate</a>');
|
||||
break;
|
||||
}
|
||||
case '/redirect': {
|
||||
res.end('<a href="/redirect2">redirect</a>');
|
||||
break;
|
||||
}
|
||||
case '/redirect2': {
|
||||
res.statusCode = 302;
|
||||
res.setHeader('location', url);
|
||||
res.end();
|
||||
break;
|
||||
}
|
||||
case '/in-page': {
|
||||
res.end('<a href="#in-page">redirect</a><div id="in-page"></div>');
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
res.end('');
|
||||
}
|
||||
}
|
||||
});
|
||||
url = (await listen(server)).url;
|
||||
|
||||
@@ -501,33 +501,38 @@ ifdescribe(!isLinuxOnArm && !process.mas && !process.env.DISABLE_CRASH_REPORTER_
|
||||
});
|
||||
|
||||
function crash (processType: string, remotely: Function) {
|
||||
if (processType === 'main') {
|
||||
return remotely(() => {
|
||||
setTimeout().then(() => { process.crash(); });
|
||||
});
|
||||
} else if (processType === 'renderer') {
|
||||
return remotely(() => {
|
||||
const { BrowserWindow } = require('electron');
|
||||
const bw = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true, contextIsolation: false } });
|
||||
bw.loadURL('about:blank');
|
||||
bw.webContents.executeJavaScript('process.crash()');
|
||||
});
|
||||
} else if (processType === 'sandboxed-renderer') {
|
||||
const preloadPath = path.join(__dirname, 'fixtures', 'apps', 'crash', 'sandbox-preload.js');
|
||||
return remotely((preload: string) => {
|
||||
const { BrowserWindow } = require('electron');
|
||||
const bw = new BrowserWindow({ show: false, webPreferences: { sandbox: true, preload, contextIsolation: false } });
|
||||
bw.loadURL('about:blank');
|
||||
}, preloadPath);
|
||||
} else if (processType === 'node') {
|
||||
const crashScriptPath = path.join(__dirname, 'fixtures', 'apps', 'crash', 'node-crash.js');
|
||||
return remotely((crashScriptPath: string) => {
|
||||
const { app } = require('electron');
|
||||
const childProcess = require('node:child_process');
|
||||
const version = app.getVersion();
|
||||
const url = 'http://127.0.0.1';
|
||||
childProcess.fork(crashScriptPath, [url, version], { silent: true });
|
||||
}, crashScriptPath);
|
||||
switch (processType) {
|
||||
case 'main': {
|
||||
return remotely(() => {
|
||||
setTimeout().then(() => { process.crash(); });
|
||||
});
|
||||
}
|
||||
case 'renderer': {
|
||||
return remotely(() => {
|
||||
const { BrowserWindow } = require('electron');
|
||||
const bw = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true, contextIsolation: false } });
|
||||
bw.loadURL('about:blank');
|
||||
bw.webContents.executeJavaScript('process.crash()');
|
||||
});
|
||||
}
|
||||
case 'sandboxed-renderer': {
|
||||
const preloadPath = path.join(__dirname, 'fixtures', 'apps', 'crash', 'sandbox-preload.js');
|
||||
return remotely((preload: string) => {
|
||||
const { BrowserWindow } = require('electron');
|
||||
const bw = new BrowserWindow({ show: false, webPreferences: { sandbox: true, preload, contextIsolation: false } });
|
||||
bw.loadURL('about:blank');
|
||||
}, preloadPath);
|
||||
}
|
||||
case 'node': {
|
||||
const crashScriptPath = path.join(__dirname, 'fixtures', 'apps', 'crash', 'node-crash.js');
|
||||
return remotely((crashScriptPath: string) => {
|
||||
const { app } = require('electron');
|
||||
const childProcess = require('node:child_process');
|
||||
const version = app.getVersion();
|
||||
const url = 'http://127.0.0.1';
|
||||
childProcess.fork(crashScriptPath, [url, version], { silent: true });
|
||||
}, crashScriptPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1415,18 +1415,28 @@ describe('webContents module', () => {
|
||||
before(async () => {
|
||||
server = http.createServer((req, res) => {
|
||||
const respond = () => {
|
||||
if (req.url === '/redirect-cross-site') {
|
||||
res.setHeader('Location', `${crossSiteUrl}/redirected`);
|
||||
res.statusCode = 302;
|
||||
res.end();
|
||||
} else if (req.url === '/redirected') {
|
||||
res.end('<html><script>window.localStorage</script></html>');
|
||||
} else if (req.url === '/first-window-open') {
|
||||
res.end(`<html><script>window.open('${serverUrl}/second-window-open', 'first child');</script></html>`);
|
||||
} else if (req.url === '/second-window-open') {
|
||||
res.end('<html><script>window.open(\'wrong://url\', \'second child\');</script></html>');
|
||||
} else {
|
||||
res.end();
|
||||
switch (req.url) {
|
||||
case '/redirect-cross-site': {
|
||||
res.setHeader('Location', `${crossSiteUrl}/redirected`);
|
||||
res.statusCode = 302;
|
||||
res.end();
|
||||
break;
|
||||
}
|
||||
case '/redirected': {
|
||||
res.end('<html><script>window.localStorage</script></html>');
|
||||
break;
|
||||
}
|
||||
case '/first-window-open': {
|
||||
res.end(`<html><script>window.open('${serverUrl}/second-window-open', 'first child');</script></html>`);
|
||||
break;
|
||||
}
|
||||
case '/second-window-open': {
|
||||
res.end('<html><script>window.open(\'wrong://url\', \'second child\');</script></html>');
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
res.end();
|
||||
}
|
||||
}
|
||||
};
|
||||
setTimeout().then(respond);
|
||||
|
||||
@@ -628,15 +628,22 @@ describe('chromium features', () => {
|
||||
}
|
||||
});
|
||||
w.webContents.on('ipc-message', (event, channel, message) => {
|
||||
if (channel === 'reload') {
|
||||
w.webContents.reload();
|
||||
} else if (channel === 'error') {
|
||||
done(message);
|
||||
} else if (channel === 'response') {
|
||||
expect(message).to.equal('Hello from serviceWorker!');
|
||||
session.fromPartition('sw-file-scheme-spec').clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => done());
|
||||
switch (channel) {
|
||||
case 'reload': {
|
||||
w.webContents.reload();
|
||||
break;
|
||||
}
|
||||
case 'error': {
|
||||
done(message);
|
||||
break;
|
||||
}
|
||||
case 'response': {
|
||||
expect(message).to.equal('Hello from serviceWorker!');
|
||||
session.fromPartition('sw-file-scheme-spec').clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => done());
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
w.webContents.on('render-process-gone', () => done(new Error('WebContents crashed.')));
|
||||
@@ -666,18 +673,25 @@ describe('chromium features', () => {
|
||||
}
|
||||
});
|
||||
w.webContents.on('ipc-message', (event, channel, message) => {
|
||||
if (channel === 'reload') {
|
||||
w.webContents.reload();
|
||||
} else if (channel === 'error') {
|
||||
done(`unexpected error : ${message}`);
|
||||
} else if (channel === 'response') {
|
||||
expect(message).to.equal('Hello from serviceWorker!');
|
||||
customSession.clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => {
|
||||
customSession.protocol.uninterceptProtocol('file');
|
||||
done();
|
||||
});
|
||||
switch (channel) {
|
||||
case 'reload': {
|
||||
w.webContents.reload();
|
||||
break;
|
||||
}
|
||||
case 'error': {
|
||||
done(`unexpected error : ${message}`);
|
||||
break;
|
||||
}
|
||||
case 'response': {
|
||||
expect(message).to.equal('Hello from serviceWorker!');
|
||||
customSession.clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => {
|
||||
customSession.protocol.uninterceptProtocol('file');
|
||||
done();
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
w.webContents.on('render-process-gone', () => done(new Error('WebContents crashed.')));
|
||||
@@ -702,18 +716,25 @@ describe('chromium features', () => {
|
||||
}
|
||||
});
|
||||
w.webContents.on('ipc-message', (event, channel, message) => {
|
||||
if (channel === 'reload') {
|
||||
w.webContents.reload();
|
||||
} else if (channel === 'error') {
|
||||
done(`unexpected error : ${message}`);
|
||||
} else if (channel === 'response') {
|
||||
expect(message).to.equal('Hello from serviceWorker!');
|
||||
customSession.clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => {
|
||||
customSession.protocol.uninterceptProtocol(serviceWorkerScheme);
|
||||
done();
|
||||
});
|
||||
switch (channel) {
|
||||
case 'reload': {
|
||||
w.webContents.reload();
|
||||
break;
|
||||
}
|
||||
case 'error': {
|
||||
done(`unexpected error : ${message}`);
|
||||
break;
|
||||
}
|
||||
case 'response': {
|
||||
expect(message).to.equal('Hello from serviceWorker!');
|
||||
customSession.clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => {
|
||||
customSession.protocol.uninterceptProtocol(serviceWorkerScheme);
|
||||
done();
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
w.webContents.on('render-process-gone', () => done(new Error('WebContents crashed.')));
|
||||
@@ -2431,12 +2452,19 @@ describe('font fallback', () => {
|
||||
const fonts = await getRenderedFonts(html);
|
||||
expect(fonts).to.be.an('array');
|
||||
expect(fonts).to.have.length(1);
|
||||
if (process.platform === 'win32') {
|
||||
expect(fonts[0].familyName).to.equal('Arial');
|
||||
} else if (process.platform === 'darwin') {
|
||||
expect(fonts[0].familyName).to.equal('Helvetica');
|
||||
} else if (process.platform === 'linux') {
|
||||
expect(fonts[0].familyName).to.equal('DejaVu Sans');
|
||||
switch (process.platform) {
|
||||
case 'win32': {
|
||||
expect(fonts[0].familyName).to.equal('Arial');
|
||||
break;
|
||||
}
|
||||
case 'darwin': {
|
||||
expect(fonts[0].familyName).to.equal('Helvetica');
|
||||
break;
|
||||
}
|
||||
case 'linux': {
|
||||
expect(fonts[0].familyName).to.equal('DejaVu Sans');
|
||||
break;
|
||||
}
|
||||
} // I think this depends on the distro? We don't specify a default.
|
||||
});
|
||||
|
||||
@@ -2909,16 +2937,23 @@ ifdescribe((process.platform !== 'linux' || app.isUnityRunning()))('navigator.se
|
||||
|
||||
it('setAppBadge can be called in a ServiceWorker', (done) => {
|
||||
w.webContents.on('ipc-message', (event, channel, message) => {
|
||||
if (channel === 'reload') {
|
||||
w.webContents.reload();
|
||||
} else if (channel === 'error') {
|
||||
done(message);
|
||||
} else if (channel === 'response') {
|
||||
expect(message).to.equal('SUCCESS setting app badge');
|
||||
expect(waitForBadgeCount(expectedBadgeCount)).to.eventually.equal(expectedBadgeCount);
|
||||
session.fromPartition('sw-file-scheme-spec').clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => done());
|
||||
switch (channel) {
|
||||
case 'reload': {
|
||||
w.webContents.reload();
|
||||
break;
|
||||
}
|
||||
case 'error': {
|
||||
done(message);
|
||||
break;
|
||||
}
|
||||
case 'response': {
|
||||
expect(message).to.equal('SUCCESS setting app badge');
|
||||
expect(waitForBadgeCount(expectedBadgeCount)).to.eventually.equal(expectedBadgeCount);
|
||||
session.fromPartition('sw-file-scheme-spec').clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => done());
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
w.webContents.on('render-process-gone', () => done(new Error('WebContents crashed.')));
|
||||
@@ -2927,19 +2962,28 @@ ifdescribe((process.platform !== 'linux' || app.isUnityRunning()))('navigator.se
|
||||
|
||||
it('clearAppBadge can be called in a ServiceWorker', (done) => {
|
||||
w.webContents.on('ipc-message', (event, channel, message) => {
|
||||
if (channel === 'reload') {
|
||||
w.webContents.reload();
|
||||
} else if (channel === 'setAppBadge') {
|
||||
expect(message).to.equal('SUCCESS setting app badge');
|
||||
expect(waitForBadgeCount(expectedBadgeCount)).to.eventually.equal(expectedBadgeCount);
|
||||
} else if (channel === 'error') {
|
||||
done(message);
|
||||
} else if (channel === 'response') {
|
||||
expect(message).to.equal('SUCCESS clearing app badge');
|
||||
expect(waitForBadgeCount(expectedBadgeCount)).to.eventually.equal(expectedBadgeCount);
|
||||
session.fromPartition('sw-file-scheme-spec').clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => done());
|
||||
switch (channel) {
|
||||
case 'reload': {
|
||||
w.webContents.reload();
|
||||
break;
|
||||
}
|
||||
case 'setAppBadge': {
|
||||
expect(message).to.equal('SUCCESS setting app badge');
|
||||
expect(waitForBadgeCount(expectedBadgeCount)).to.eventually.equal(expectedBadgeCount);
|
||||
break;
|
||||
}
|
||||
case 'error': {
|
||||
done(message);
|
||||
break;
|
||||
}
|
||||
case 'response': {
|
||||
expect(message).to.equal('SUCCESS clearing app badge');
|
||||
expect(waitForBadgeCount(expectedBadgeCount)).to.eventually.equal(expectedBadgeCount);
|
||||
session.fromPartition('sw-file-scheme-spec').clearStorageData({
|
||||
storages: ['serviceworkers']
|
||||
}).then(() => done());
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
w.webContents.on('render-process-gone', () => done(new Error('WebContents crashed.')));
|
||||
|
||||
94
spec/fixtures/apps/crash/main.js
vendored
94
spec/fixtures/apps/crash/main.js
vendored
@@ -25,51 +25,65 @@ crashReporter.start({
|
||||
app.whenReady().then(() => {
|
||||
const crashType = app.commandLine.getSwitchValue('crash-type');
|
||||
|
||||
if (crashType === 'main') {
|
||||
process.crash();
|
||||
} else if (crashType === 'renderer') {
|
||||
const w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true, contextIsolation: false } });
|
||||
w.loadURL('about:blank');
|
||||
if (setExtraParameters) {
|
||||
w.webContents.executeJavaScript(`
|
||||
switch (crashType) {
|
||||
case 'main': {
|
||||
process.crash();
|
||||
break;
|
||||
}
|
||||
case 'renderer': {
|
||||
const w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true, contextIsolation: false } });
|
||||
w.loadURL('about:blank');
|
||||
if (setExtraParameters) {
|
||||
w.webContents.executeJavaScript(`
|
||||
require('electron').crashReporter.addExtraParameter('rendererSpecific', 'rs');
|
||||
require('electron').crashReporter.addExtraParameter('addedThenRemoved', 'to-be-removed');
|
||||
require('electron').crashReporter.removeExtraParameter('addedThenRemoved');
|
||||
`);
|
||||
}
|
||||
w.webContents.executeJavaScript('process.crash()');
|
||||
w.webContents.on('render-process-gone', () => process.exit(0));
|
||||
} else if (crashType === 'sandboxed-renderer') {
|
||||
const w = new BrowserWindow({
|
||||
show: false,
|
||||
webPreferences: {
|
||||
sandbox: true,
|
||||
preload: path.resolve(__dirname, 'sandbox-preload.js'),
|
||||
contextIsolation: false
|
||||
}
|
||||
});
|
||||
w.loadURL(`about:blank?set_extra=${setExtraParameters ? 1 : 0}`);
|
||||
w.webContents.on('render-process-gone', () => process.exit(0));
|
||||
} else if (crashType === 'node') {
|
||||
const crashPath = path.join(__dirname, 'node-crash.js');
|
||||
const child = childProcess.fork(crashPath, { silent: true });
|
||||
child.on('exit', () => process.exit(0));
|
||||
} else if (crashType === 'node-fork') {
|
||||
const scriptPath = path.join(__dirname, 'fork.js');
|
||||
const child = childProcess.fork(scriptPath, { silent: true });
|
||||
child.on('exit', () => process.exit(0));
|
||||
} else if (crashType === 'node-extra-args') {
|
||||
let exitcode = -1;
|
||||
const crashPath = path.join(__dirname, 'node-extra-args.js');
|
||||
const child = childProcess.fork(crashPath, ['--enable-logging'], { silent: true });
|
||||
child.send('message');
|
||||
child.on('message', (forkedArgs) => {
|
||||
if (JSON.stringify(forkedArgs) !== JSON.stringify(child.spawnargs)) { exitcode = 1; } else { exitcode = 0; }
|
||||
process.exit(exitcode);
|
||||
});
|
||||
} else {
|
||||
console.error(`Unrecognized crash type: '${crashType}'`);
|
||||
process.exit(1);
|
||||
w.webContents.executeJavaScript('process.crash()');
|
||||
w.webContents.on('render-process-gone', () => process.exit(0));
|
||||
break;
|
||||
}
|
||||
case 'sandboxed-renderer': {
|
||||
const w = new BrowserWindow({
|
||||
show: false,
|
||||
webPreferences: {
|
||||
sandbox: true,
|
||||
preload: path.resolve(__dirname, 'sandbox-preload.js'),
|
||||
contextIsolation: false
|
||||
}
|
||||
});
|
||||
w.loadURL(`about:blank?set_extra=${setExtraParameters ? 1 : 0}`);
|
||||
w.webContents.on('render-process-gone', () => process.exit(0));
|
||||
break;
|
||||
}
|
||||
case 'node': {
|
||||
const crashPath = path.join(__dirname, 'node-crash.js');
|
||||
const child = childProcess.fork(crashPath, { silent: true });
|
||||
child.on('exit', () => process.exit(0));
|
||||
break;
|
||||
}
|
||||
case 'node-fork': {
|
||||
const scriptPath = path.join(__dirname, 'fork.js');
|
||||
const child = childProcess.fork(scriptPath, { silent: true });
|
||||
child.on('exit', () => process.exit(0));
|
||||
break;
|
||||
}
|
||||
case 'node-extra-args': {
|
||||
let exitcode = -1;
|
||||
const crashPath = path.join(__dirname, 'node-extra-args.js');
|
||||
const child = childProcess.fork(crashPath, ['--enable-logging'], { silent: true });
|
||||
child.send('message');
|
||||
child.on('message', (forkedArgs) => {
|
||||
if (JSON.stringify(forkedArgs) !== JSON.stringify(child.spawnargs)) { exitcode = 1; } else { exitcode = 0; }
|
||||
process.exit(exitcode);
|
||||
});
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
console.error(`Unrecognized crash type: '${crashType}'`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user