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:
wujinli 2024-02-05 15:38:30 +08:00 committed by GitHub
parent 398ca2a019
commit fb888a6989
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 53 additions and 32 deletions

View file

@ -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', () => {