fix: crash problem with message_port close event (#41201)
When worker_thread shutdown, it will destory context and close message_port. In this case, it should not dispatch close event. Because it forbid script running during NotifyContextDestroyed in ContextLifecycleNotifier. Now chromium has implemented close_event and will not crash, so we remove the patch with #22532 and add one test.
This commit is contained in:
parent
398ca2a019
commit
fb888a6989
3 changed files with 53 additions and 32 deletions
|
@ -345,6 +345,59 @@ describe('ipc module', () => {
|
|||
}})()`);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when context destroyed', () => {
|
||||
it('does not crash', async () => {
|
||||
let count = 0;
|
||||
const server = http.createServer((req, res) => {
|
||||
switch (req.url) {
|
||||
case '/index.html':
|
||||
res.setHeader('content-type', 'text/html');
|
||||
res.statusCode = 200;
|
||||
count = count + 1;
|
||||
res.end(`
|
||||
<title>Hello${count}</title>
|
||||
<script>
|
||||
var sharedWorker = new SharedWorker('worker.js');
|
||||
|
||||
sharedWorker.port.addEventListener('close', function(event) {
|
||||
console.log('close event', event.data);
|
||||
});
|
||||
</script>`);
|
||||
|
||||
break;
|
||||
case '/worker.js':
|
||||
res.setHeader('content-type', 'application/javascript; charset=UTF-8');
|
||||
res.statusCode = 200;
|
||||
res.end(`
|
||||
self.addEventListener('connect', function(event) {
|
||||
var port = event.ports[0];
|
||||
|
||||
port.addEventListener('message', function(event) {
|
||||
console.log('Message from main:', event.data);
|
||||
port.postMessage('Hello from SharedWorker!');
|
||||
});
|
||||
|
||||
});`);
|
||||
break;
|
||||
default:
|
||||
throw new Error(`unsupported endpoint: ${req.url}`);
|
||||
}
|
||||
});
|
||||
const { port } = await listen(server);
|
||||
defer(() => {
|
||||
server.close();
|
||||
});
|
||||
const w = new BrowserWindow({ show: false });
|
||||
await w.loadURL(`http://localhost:${port}/index.html`);
|
||||
expect(w.webContents.getTitle()).to.equal('Hello1');
|
||||
// Before the fix, it would crash if reloaded, but now it doesn't
|
||||
await w.loadURL(`http://localhost:${port}/index.html`);
|
||||
expect(w.webContents.getTitle()).to.equal('Hello2');
|
||||
// const crashEvent = emittedOnce(w.webContents, 'render-process-gone');
|
||||
// await crashEvent;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('MessageChannelMain', () => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue