From 5c3a1bafefb57d310e383e5a1d1f0ced21f50602 Mon Sep 17 00:00:00 2001 From: "chenghuai.dtc" Date: Wed, 29 Dec 2021 18:11:35 +0800 Subject: [PATCH 1/2] fix: fix this_val on global func call --- bridge/bindings/qjs/dom/event_target_test.cc | 6 ++++++ bridge/bindings/qjs/executing_context.h | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/bridge/bindings/qjs/dom/event_target_test.cc b/bridge/bindings/qjs/dom/event_target_test.cc index c57b0ec52a..ce92d2f584 100644 --- a/bridge/bindings/qjs/dom/event_target_test.cc +++ b/bridge/bindings/qjs/dom/event_target_test.cc @@ -184,3 +184,9 @@ TEST(EventTarget, wontLeakWithStringProperty) { "img.any = '1234'"; bridge->evaluateScript(code.c_str(), code.size(), "internal://", 0); } + +TEST(EventTarget, globalBindListener) { + auto bridge = TEST_init(); + std::string code = "addEventListener('click', () => {console.log('clicked'); })"; + bridge->evaluateScript(code.c_str(), code.size(), "internal://", 0); +} diff --git a/bridge/bindings/qjs/executing_context.h b/bridge/bindings/qjs/executing_context.h index 26c3d0cd15..f766883f7d 100644 --- a/bridge/bindings/qjs/executing_context.h +++ b/bridge/bindings/qjs/executing_context.h @@ -139,7 +139,14 @@ static JSValue handleCallThisOnProxy(JSContext* ctx, JSValueConst this_val, int if (JS_IsProxy(this_val)) { result = JS_Call(ctx, f, JS_GetProxyTarget(this_val), argc, argv); } else { - result = JS_Call(ctx, f, this_val, argc, argv); + // If this_val is undefined or null, this_val should set to globalThis. + if (JS_IsUndefined(this_val) || JS_IsNull(this_val)) { + this_val = JS_GetGlobalObject(ctx); + result = JS_Call(ctx, f, this_val, argc, argv); + JS_FreeValue(ctx, this_val); + } else { + result = JS_Call(ctx, f, this_val, argc, argv); + } } return result; } From 089d8e94bfed22b3bdf4348e3c54157888e3fc3c Mon Sep 17 00:00:00 2001 From: "chenghuai.dtc" Date: Wed, 29 Dec 2021 18:14:41 +0800 Subject: [PATCH 2/2] feat: add more test. --- bridge/bindings/qjs/dom/event_target_test.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bridge/bindings/qjs/dom/event_target_test.cc b/bridge/bindings/qjs/dom/event_target_test.cc index ce92d2f584..9599d5a648 100644 --- a/bridge/bindings/qjs/dom/event_target_test.cc +++ b/bridge/bindings/qjs/dom/event_target_test.cc @@ -186,7 +186,13 @@ TEST(EventTarget, wontLeakWithStringProperty) { } TEST(EventTarget, globalBindListener) { + bool static logCalled = false; + kraken::KrakenPage::consoleMessageHandler = [](void* ctx, const std::string& message, int logLevel) { + logCalled = true; + EXPECT_STREQ(message.c_str(), "clicked"); + }; auto bridge = TEST_init(); - std::string code = "addEventListener('click', () => {console.log('clicked'); })"; + std::string code = "addEventListener('click', () => {console.log('clicked'); }); dispatchEvent(new Event('click'))"; bridge->evaluateScript(code.c_str(), code.size(), "internal://", 0); + EXPECT_EQ(logCalled, true); }