From 5aa3a2824a26f0145ce23e9214c3cdc40d8a549f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wies=C5=82aw=20=C5=A0olt=C3=A9s?= Date: Fri, 18 Sep 2026 20:09:43 +0200 Subject: [PATCH] Expose trusted native input events --- .../native/webscene_v8_runtime_browser_apis.inc | 1 + .../native/webscene_v8_runtime_dom_core.inc | 10 +++++++--- .../native/webscene_v8_runtime_tasks.inc | 7 ++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_browser_apis.inc b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_browser_apis.inc index 3de0fbbc..d926b877 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_browser_apis.inc +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_browser_apis.inc @@ -849,6 +849,7 @@ event->Set(local_context, js_string(isolate, "bubbles"), v8::False(isolate)).Check(); event->Set(local_context, js_string(isolate, "cancelable"), v8::False(isolate)).Check(); event->Set(local_context, js_string(isolate, "composed"), v8::False(isolate)).Check(); + event->Set(local_context, js_string(isolate, "isTrusted"), v8::False(isolate)).Check(); event->Set( local_context, js_string(isolate, "__webSceneComposedPath"), diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc index bc5edd6b..04d64802 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_dom_core.inc @@ -4754,7 +4754,9 @@ synthetic, "click", *node, - &default_prevented)) { + &default_prevented, + nullptr, + false)) { if (checkable_activation.active) { if (default_prevented) { self->restore_checkable_click_activation(checkable_activation); @@ -4764,8 +4766,10 @@ } if (!default_prevented) self->queue_external_navigation(*node); if (form_control_changed && self->is_connected(*node)) { - self->dispatch_input_event_type(synthetic, "input", *node); - self->dispatch_input_event_type(synthetic, "change", *node); + self->dispatch_input_event_type( + synthetic, "input", *node, nullptr, nullptr, false); + self->dispatch_input_event_type( + synthetic, "change", *node, nullptr, nullptr, false); } } } diff --git a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_tasks.inc b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_tasks.inc index 28680327..a8d69fb0 100644 --- a/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_tasks.inc +++ b/experiments/WebScene.NativeEngine.Probe/native/webscene_v8_runtime_tasks.inc @@ -1766,7 +1766,8 @@ const char* type, dom_node& target, bool* default_prevented = nullptr, - dom_node* submitter = nullptr) + dom_node* submitter = nullptr, + std::optional trusted = std::nullopt) { webscene_frame_trace::scope trace(frame_trace, "event-start", "event-end", input.sequence); const auto previous_context = isolate->GetCurrentContext(); @@ -1826,6 +1827,10 @@ event->Set(local_context, js_string(isolate, "bubbles"), v8::Boolean::New(isolate, bubbles)).Check(); event->Set(local_context, js_string(isolate, "cancelable"), v8::Boolean::New(isolate, cancelable)).Check(); event->Set(local_context, js_string(isolate, "defaultPrevented"), v8::False(isolate)).Check(); + event->Set( + local_context, + js_string(isolate, "isTrusted"), + v8::Boolean::New(isolate, trusted.value_or(dispatching_user_input))).Check(); if (type_view == "beforetoggle") { event->Set(local_context, js_string(isolate, "oldState"), js_string(isolate, "closed")).Check(); event->Set(local_context, js_string(isolate, "newState"), js_string(isolate, "open")).Check();