Browse Source

fix: check WebContents before emitting render-process-gone event (#27757)

Co-authored-by: Cheng Zhao <[email protected]>
trop[bot] 4 years ago
parent
commit
64d4e5969f
2 changed files with 17 additions and 0 deletions
  1. 6 0
      shell/browser/api/electron_api_web_contents.cc
  2. 11 0
      spec-main/api-web-contents-spec.ts

+ 6 - 0
shell/browser/api/electron_api_web_contents.cc

@@ -1122,7 +1122,13 @@ void WebContents::RenderViewDeleted(content::RenderViewHost* render_view_host) {
 }
 
 void WebContents::RenderProcessGone(base::TerminationStatus status) {
+  auto weak_this = GetWeakPtr();
   Emit("crashed", status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED);
+
+  // User might destroy WebContents in the crashed event.
+  if (!weak_this)
+    return;
+
   v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
   v8::HandleScope handle_scope(isolate);
   gin_helper::Dictionary details = gin_helper::Dictionary::CreateEmpty(isolate);

+ 11 - 0
spec-main/api-web-contents-spec.ts

@@ -1998,6 +1998,17 @@ describe('webContents module', () => {
     });
   });
 
+  describe('crashed event', () => {
+    it('does not crash main process when destroying WebContents in it', (done) => {
+      const contents = (webContents as any).create({ nodeIntegration: true });
+      contents.once('crashed', () => {
+        contents.destroy();
+        done();
+      });
+      contents.loadURL('about:blank').then(() => contents.forcefullyCrashRenderer());
+    });
+  });
+
   it('emits a cancelable event before creating a child webcontents', async () => {
     const w = new BrowserWindow({
       show: false,