зеркало из https://github.com/electron/electron.git
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:
Родитель
398ca2a019
Коммит
fb888a6989
|
@ -47,7 +47,6 @@ feat_add_support_for_overriding_the_base_spellchecker_download_url.patch
|
||||||
feat_enable_offscreen_rendering_with_viz_compositor.patch
|
feat_enable_offscreen_rendering_with_viz_compositor.patch
|
||||||
gpu_notify_when_dxdiag_request_fails.patch
|
gpu_notify_when_dxdiag_request_fails.patch
|
||||||
feat_allow_embedders_to_add_observers_on_created_hunspell.patch
|
feat_allow_embedders_to_add_observers_on_created_hunspell.patch
|
||||||
feat_add_onclose_to_messageport.patch
|
|
||||||
allow_in-process_windows_to_have_different_web_prefs.patch
|
allow_in-process_windows_to_have_different_web_prefs.patch
|
||||||
refactor_expose_cursor_changes_to_the_webcontentsobserver.patch
|
refactor_expose_cursor_changes_to_the_webcontentsobserver.patch
|
||||||
crash_allow_setting_more_options.patch
|
crash_allow_setting_more_options.patch
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jeremy Apthorp <nornagon@nornagon.net>
|
|
||||||
Date: Wed, 4 Mar 2020 11:18:03 -0800
|
|
||||||
Subject: feat: add onclose to MessagePort
|
|
||||||
|
|
||||||
This adds the 'onclose' event to MessagePort. Can be removed once
|
|
||||||
https://bugs.chromium.org/p/chromium/issues/detail?id=1495616 is fixed.
|
|
||||||
|
|
||||||
diff --git a/third_party/blink/renderer/core/messaging/message_port.cc b/third_party/blink/renderer/core/messaging/message_port.cc
|
|
||||||
index 2e0961fd8c0bc8f9a2a7c124693033eb234928bd..5c54705e3c1766553e9cba13142345485ca44578 100644
|
|
||||||
--- a/third_party/blink/renderer/core/messaging/message_port.cc
|
|
||||||
+++ b/third_party/blink/renderer/core/messaging/message_port.cc
|
|
||||||
@@ -195,6 +195,7 @@ void MessagePort::close() {
|
|
||||||
Entangle(pipe.TakePort0(), nullptr);
|
|
||||||
}
|
|
||||||
closed_ = true;
|
|
||||||
+ DispatchEvent(*Event::Create(event_type_names::kClose));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessagePort::OnConnectionError() {
|
|
||||||
diff --git a/third_party/blink/renderer/core/messaging/message_port.idl b/third_party/blink/renderer/core/messaging/message_port.idl
|
|
||||||
index 9df43655b569428a6abc54341b4b0023e159f99b..3f1f181d9b8a66997136f870f55c97c08294b6eb 100644
|
|
||||||
--- a/third_party/blink/renderer/core/messaging/message_port.idl
|
|
||||||
+++ b/third_party/blink/renderer/core/messaging/message_port.idl
|
|
||||||
@@ -40,5 +40,5 @@
|
|
||||||
// event handlers
|
|
||||||
attribute EventHandler onmessage;
|
|
||||||
attribute EventHandler onmessageerror;
|
|
||||||
- [RuntimeEnabled=MessagePortCloseEvent] attribute EventHandler onclose;
|
|
||||||
+ attribute EventHandler onclose;
|
|
||||||
};
|
|
|
@ -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', () => {
|
describe('MessageChannelMain', () => {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче