Skip to content

Commit

Permalink
Merge pull request #913 from openkraken/fix/invoke_module_crash
Browse files Browse the repository at this point in the history
fix: fix crash when reportError.
  • Loading branch information
answershuto committed Nov 30, 2021
2 parents 7f35882 + d85203a commit 8d75746
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
4 changes: 2 additions & 2 deletions bridge/bindings/qjs/js_context.cc
Expand Up @@ -65,7 +65,7 @@ JSContext::JSContext(int32_t contextId, const JSExceptionHandler& handler, void*
JS_DefinePropertyGetSet(m_ctx, globalObject, windowKey, windowGetter, JS_UNDEFINED, JS_PROP_HAS_GET | JS_PROP_ENUMERABLE);
JS_FreeAtom(m_ctx, windowKey);
JS_SetContextOpaque(m_ctx, this);
JS_SetHostPromiseRejectionTracker(m_runtime, promiseRejectTracker, this);
JS_SetHostPromiseRejectionTracker(m_runtime, promiseRejectTracker, nullptr);

runningContexts++;
}
Expand Down Expand Up @@ -327,7 +327,7 @@ void JSContext::dispatchGlobalPromiseRejectionEvent(JSValueConst promise, JSValu
}

void JSContext::promiseRejectTracker(QjsContext* ctx, JSValue promise, JSValue reason, int is_handled, void* opaque) {
auto* context = static_cast<JSContext*>(opaque);
auto* context = static_cast<JSContext*>(JS_GetContextOpaque(ctx));
context->reportError(reason);
context->dispatchGlobalPromiseRejectionEvent(promise, reason);
}
Expand Down
29 changes: 29 additions & 0 deletions bridge/bindings/qjs/js_context_test.cc
Expand Up @@ -51,6 +51,35 @@ TEST(Context, unrejectPromiseError) {
delete bridge;
}

TEST(Context, unrejectPromiseErrorWithMultipleContext) {
bool errorHandlerExecuted = false;
int32_t errorCalledCount = 0;
auto errorHandler = [&errorHandlerExecuted, &errorCalledCount](int32_t contextId, const char* errmsg) {
errorHandlerExecuted = true;
errorCalledCount++;
EXPECT_STREQ(errmsg,
"TypeError: cannot read property 'forceNullError' of null\n"
" at <anonymous> (file://:4)\n"
" at Promise (native)\n"
" at <eval> (file://:6)\n");
};
auto bridge2 = new kraken::JSBridge(0, errorHandler);
auto bridge = new kraken::JSBridge(0, errorHandler);
const char* code =
" var p = new Promise(function (resolve, reject) {\n"
" var nullObject = null;\n"
" // Raise a TypeError: Cannot read property 'forceNullError' of null\n"
" var x = nullObject.forceNullError();\n"
" resolve();\n"
" });\n"
"\n";
bridge->evaluateScript(code, strlen(code), "file://", 0);
bridge2->evaluateScript(code, strlen(code), "file://", 0);
EXPECT_EQ(errorHandlerExecuted, true);
EXPECT_EQ(errorCalledCount, 2);
delete bridge;
}

TEST(Context, window) {
bool errorHandlerExecuted = false;
static bool logCalled = false;
Expand Down

0 comments on commit 8d75746

Please sign in to comment.