Skip to content

Commit

Permalink
fix: prevent crash on web-contents creation when error is thrown (#29106
Browse files Browse the repository at this point in the history
)

* fix: prevent crash when error occurs during event emitter CallMethod

* wip: emit error event within trycatch

* fix: handle uncaught exceptions within node on web_contents init

* fix: create gin_helper::CallMethodCatchException

* test: add web-contents create crash to test cases

* test: clean up test data for web-contents crash

Co-authored-by: Jeremy Rose <jeremya@chromium.org>

* fix: convert CatchException to WebContents static helper method

* fix: restore try_catch to callsite

Co-authored-by: VerteDinde <keeleymhammond@gmail.com>
Co-authored-by: VerteDinde <khammond@slack-corp.com>
Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>
Co-authored-by: Jeremy Rose <jeremya@chromium.org>
  • Loading branch information
5 people committed May 12, 2021
1 parent 9a4a049 commit caac2e8
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 0 deletions.
12 changes: 12 additions & 0 deletions shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -3712,7 +3712,11 @@ gin::Handle<WebContents> WebContents::New(
const gin_helper::Dictionary& options) {
gin::Handle<WebContents> handle =
gin::CreateHandle(isolate, new WebContents(isolate, options));
v8::TryCatch try_catch(isolate);
gin_helper::CallMethod(isolate, handle.get(), "_init");
if (try_catch.HasCaught()) {
node::errors::TriggerUncaughtException(isolate, try_catch);
}
return handle;
}

Expand All @@ -3723,7 +3727,11 @@ gin::Handle<WebContents> WebContents::CreateAndTake(
Type type) {
gin::Handle<WebContents> handle = gin::CreateHandle(
isolate, new WebContents(isolate, std::move(web_contents), type));
v8::TryCatch try_catch(isolate);
gin_helper::CallMethod(isolate, handle.get(), "_init");
if (try_catch.HasCaught()) {
node::errors::TriggerUncaughtException(isolate, try_catch);
}
return handle;
}

Expand All @@ -3743,7 +3751,11 @@ gin::Handle<WebContents> WebContents::FromOrCreate(
WebContents* api_web_contents = From(web_contents);
if (!api_web_contents) {
api_web_contents = new WebContents(isolate, web_contents);
v8::TryCatch try_catch(isolate);
gin_helper::CallMethod(isolate, api_web_contents, "_init");
if (try_catch.HasCaught()) {
node::errors::TriggerUncaughtException(isolate, try_catch);
}
}
return gin::CreateHandle(isolate, api_web_contents);
}
Expand Down
1 change: 1 addition & 0 deletions shell/common/node_includes.h
Expand Up @@ -64,6 +64,7 @@
#include "env.h"
#include "node.h"
#include "node_buffer.h"
#include "node_errors.h"
#include "node_internals.h"
#include "node_options-inl.h"
#include "node_options.h"
Expand Down
@@ -0,0 +1,14 @@
const { app, BrowserWindow } = require('electron');

app.whenReady().then(() => {
const mainWindow = new BrowserWindow({
show: false
});
mainWindow.loadFile('about:blank');

app.on('web-contents-created', () => {
throw new Error();
});

app.quit();
});

0 comments on commit caac2e8

Please sign in to comment.