From 123c275e11a57be56a8724bcb0cab3c1c56329d7 Mon Sep 17 00:00:00 2001 From: minjiaqi1 Date: Fri, 30 May 2025 10:39:54 +0800 Subject: [PATCH] add web modifier onInterceptKeyEvent Signed-off-by: minjiaqi1 --- .../ark_component/src/ArkWeb.ts | 17 ++- .../engine/arkComponent.js | 18 ++- .../arkts_native_api_impl_bridge.cpp | 4 + .../nativeModule/arkts_native_web_bridge.cpp | 135 ++++++++++++++++++ .../nativeModule/arkts_native_web_bridge.h | 2 + .../pattern/web/web_model_ng.cpp | 11 ++ .../components_ng/pattern/web/web_model_ng.h | 2 + .../core/interfaces/arkoala/arkoala_api.h | 2 + frameworks/core/interfaces/cjui/cjui_api.h | 2 + .../interfaces/native/node/web_modifier.cpp | 54 +++++++ 10 files changed, 245 insertions(+), 2 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts b/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts index 4b5e9f5ca92..0e23b031df9 100644 --- a/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts +++ b/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts @@ -1107,6 +1107,20 @@ class WebOnPromptModifier extends ModifierWithKey<(url: string, message: string, } } +class WebOnInterceptKeyEventModifier extends ModifierWithKey<(result: { event: KeyEvent }) => boolean> { + constructor (value: (handler: KeyEvent) => boolean) { + super(value); + } + static identity: Symbol = Symbol('webOnInterceptKeyEventModifier') + applyPeer (node: KNode, reset: boolean): void { + if (reset) { + getUINativeModule().web.resetOnInterceptKeyEvent(node); + } else { + getUINativeModule().web.setOnInterceptKeyEvent(node, this.value); + } + } +} + class ArkWebComponent extends ArkComponent implements WebAttribute { constructor(nativePtr: KNode, classType?: ModifierType) { super(nativePtr, classType); @@ -1351,7 +1365,8 @@ class ArkWebComponent extends ArkComponent implements WebAttribute { return this; } onInterceptKeyEvent(callback: (event: KeyEvent) => boolean): this { - throw new Error('Method not implemented.'); + modifierWithKey(this._modifiersWithKeys, WebOnInterceptKeyEventModifier.identity, WebOnInterceptKeyEventModifier, callback); + return this; } webStandardFont(family: string): this { modifierWithKey(this._modifiersWithKeys, WebStandardFontModifier.identity, WebStandardFontModifier, family); diff --git a/frameworks/bridge/declarative_frontend/engine/arkComponent.js b/frameworks/bridge/declarative_frontend/engine/arkComponent.js index e85a1108390..2f818fd07d8 100755 --- a/frameworks/bridge/declarative_frontend/engine/arkComponent.js +++ b/frameworks/bridge/declarative_frontend/engine/arkComponent.js @@ -30304,7 +30304,8 @@ class ArkWebComponent extends ArkComponent { return this; } onInterceptKeyEvent(callback) { - throw new Error('Method not implemented.'); + modifierWithKey(this._modifiersWithKeys, WebOnInterceptKeyEventModifier.identity, WebOnInterceptKeyEventModifier, callback); + return this; } webStandardFont(family) { modifierWithKey(this._modifiersWithKeys, WebStandardFontModifier.identity, WebStandardFontModifier, family); @@ -31625,6 +31626,21 @@ class WebOnPromptModifier extends ModifierWithKey { } WebOnPromptModifier.identity = Symbol('webOnPromptModifier'); +class WebOnInterceptKeyEventModifier extends ModifierWithKey { + constructor(value) { + super(value); + } + applyPeer(node, reset) { + if (reset) { + getUINativeModule().web.resetOnInterceptKeyEvent(node); + } + else { + getUINativeModule().web.setOnInterceptKeyEvent(node, this.value); + } + } +} +WebOnInterceptKeyEventModifier.identity = Symbol('webOnInterceptKeyEventModifier'); + // @ts-ignore if (globalThis.Web !== undefined) { globalThis.Web.attributeModifier = function (modifier) { diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp index 740aa9b0d32..a2eae6ded66 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp @@ -6738,6 +6738,10 @@ void ArkUINativeModule::RegisterWebAttributes(Local object, Ec panda::FunctionRef::New(const_cast(vm), WebBridge::SetOnPrompt)); web->Set(vm, panda::StringRef::NewFromUtf8(vm, "resetOnPrompt"), panda::FunctionRef::New(const_cast(vm), WebBridge::ResetOnPrompt)); + web->Set(vm, panda::StringRef::NewFromUtf8(vm, "setOnInterceptKeyEvent"), + panda::FunctionRef::New(const_cast(vm), WebBridge::SetOnInterceptKeyEvent)); + web->Set(vm, panda::StringRef::NewFromUtf8(vm, "resetOnInterceptKeyEvent"), + panda::FunctionRef::New(const_cast(vm), WebBridge::ResetOnInterceptKeyEvent)); object->Set(vm, panda::StringRef::NewFromUtf8(vm, "web"), web); } #endif diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.cpp index 632fe35ac6e..fabf54d20fc 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.cpp @@ -20,6 +20,8 @@ #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h" #include "bridge/declarative_frontend/jsview/js_web.h" #include "core/components_ng/pattern/web/web_model_ng.h" +#include "core/interfaces/native/node/node_drag_modifier.h" +#include "core/pipeline_ng/pipeline_context.h" namespace OHOS::Ace::NG { constexpr int32_t CALL_ARG_0 = 0; @@ -2809,4 +2811,137 @@ ArkUINativeModuleValue WebBridge::ResetOnPrompt(ArkUIRuntimeCallInfo* runtimeCal return panda::JSValueRef::Undefined(vm); } +ArkUINativeModuleValue WebBridge::SetOnInterceptKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo) +{ + // 参考 arkts_native_common_bridge.cpp中的SetOnKeyEvent + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent entry"); + // EcmaVM* vm = runtimeCallInfo->GetVM(); + // CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm)); + + // Local firstArg = runtimeCallInfo->GetCallArgRef(0); + // Local callbackArg = runtimeCallInfo->GetCallArgRef(1); + // CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm)); + // auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); + // if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) { + // GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptKeyEventCallBack(nativeNode); + // return panda::JSValueRef::Undefined(vm); + // } + // auto frameNode = reinterpret_cast(nativeNode); + // CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm)); + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent To panda"); + // panda::Local func = callbackArg->ToObject(vm); + // auto containerId = Container::CurrentId(); + // auto flag = FrameNodeBridge::IsCustomFrameNode(frameNode); + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEventCallBack entry flag=%{public}d", flag ? 1 : 0); + // auto onKeyEvent = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag), + // node = AceType::WeakClaim(frameNode), containerId](KeyEventInfo& info) -> bool { + // TAG_LOGE(AceLogTag::ACE_WEB, " Web WebBridge::SetOnInterceptKeyEvent onKeyEvent keycode=%{public}d, type=%{public}d", + // static_cast(info.GetKeyCode()), static_cast(info.GetKeyType())); + // panda::LocalScope pandaScope(vm); + // panda::TryCatch trycatch(vm); + // ContainerScope scope(containerId); + // auto function = func.Lock(); + // CHECK_NULL_RETURN(!function.IsEmpty(), false); + // CHECK_NULL_RETURN(function->IsFunction(vm), false); + // PipelineContext::SetCallBackNode(node); + // const char* keys[] = { "type", "keyCode", "keyText", "keySource", "deviceId", "metaKey", "unicode", "timestamp", + // "stopPropagation", "getModifierKeyState", "intentionCode", "isNumLockOn", "isCapsLockOn", + // "isScrollLockOn" }; + // Local values[] = { panda::NumberRef::New(vm, static_cast(info.GetKeyType())), + // panda::NumberRef::New(vm, static_cast(info.GetKeyCode())), + // panda::StringRef::NewFromUtf8(vm, info.GetKeyText()), + // panda::NumberRef::New(vm, static_cast(info.GetKeySource())), + // panda::NumberRef::New(vm, info.GetDeviceId()), panda::NumberRef::New(vm, info.GetMetaKey()), + // panda::NumberRef::New(vm, info.GetUnicode()), + // panda::NumberRef::New(vm, static_cast(info.GetTimeStamp().time_since_epoch().count())), + // panda::FunctionRef::New(vm, Framework::JsStopPropagation), + // panda::FunctionRef::New(vm, ArkTSUtils::JsGetModifierKeyState), + // panda::NumberRef::New(vm, static_cast(info.GetKeyIntention())), + // panda::BooleanRef::New(vm, info.GetNumLock()), panda::BooleanRef::New(vm, info.GetCapsLock()), + // panda::BooleanRef::New(vm, info.GetScrollLock()) }; + // auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values); + // obj->SetNativePointerFieldCount(vm, 1); + // obj->SetNativePointerField(vm, 0, static_cast(&info)); + // panda::Local params[1] = { obj }; + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent obj"); + // auto ret = function->Call(vm, function.ToLocal(), params, 1); + // if (ret->IsBoolean()) { + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent ret true"); + // return ret->ToBoolean(vm)->Value(); + // } + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent ret false"); + // return false; + // }; + // GetArkUINodeModifiers()->getWebModifier()->setOnInterceptKeyEventCallBack( + // nativeNode, reinterpret_cast(&onKeyEvent)); + // TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent end"); + // return panda::JSValueRef::Undefined(vm); + + + // 按照之前web的方式 + TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent entry"); + EcmaVM* vm = runtimeCallInfo->GetVM(); + CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm)); + + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + Local callbackArg = runtimeCallInfo->GetCallArgRef(1); + CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm)); + auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); + if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) { + GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptKeyEventCallBack(nativeNode); + return panda::JSValueRef::Undefined(vm); + } + auto frameNode = reinterpret_cast(nativeNode); + CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm)); + panda::Local func = callbackArg->ToObject(vm); + + auto onKeyEvent = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]( + KeyEventInfo& info) { + panda::LocalScope pandaScope(vm); + panda::TryCatch trycatch(vm); + PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode)); + const char* keys[] = { "type", "keyCode", "keyText", "keySource", "deviceId", "metaKey", "unicode", "timestamp", + "stopPropagation", "getModifierKeyState", "intentionCode", "isNumLockOn", "isCapsLockOn", + "isScrollLockOn" }; + Local values[] = { panda::NumberRef::New(vm, static_cast(info.GetKeyType())), + panda::NumberRef::New(vm, static_cast(info.GetKeyCode())), + panda::StringRef::NewFromUtf8(vm, info.GetKeyText()), + panda::NumberRef::New(vm, static_cast(info.GetKeySource())), + panda::NumberRef::New(vm, info.GetDeviceId()), panda::NumberRef::New(vm, info.GetMetaKey()), + panda::NumberRef::New(vm, info.GetUnicode()), + panda::NumberRef::New(vm, static_cast(info.GetTimeStamp().time_since_epoch().count())), + panda::FunctionRef::New(vm, Framework::JsStopPropagation), + panda::FunctionRef::New(vm, ArkTSUtils::JsGetModifierKeyState), + panda::NumberRef::New(vm, static_cast(info.GetKeyIntention())), + panda::BooleanRef::New(vm, info.GetNumLock()), panda::BooleanRef::New(vm, info.GetCapsLock()), + panda::BooleanRef::New(vm, info.GetScrollLock()) }; + auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values); + obj->SetNativePointerFieldCount(vm, 1); + obj->SetNativePointerField(vm, 0, static_cast(&info)); + panda::Local params[1] = { obj }; + TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent obj"); + auto ret = func->Call(vm, func.ToLocal(), params, 1); + if (ret->IsBoolean()) { + TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent ret true"); + return ret->ToBoolean(vm)->Value(); + } + TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent ret false"); + return false; + }; + GetArkUINodeModifiers()->getWebModifier()->setOnInterceptKeyEventCallBack( + nativeNode, reinterpret_cast(&onKeyEvent)); + TAG_LOGE(AceLogTag::ACE_WEB, " WebBridge::SetOnInterceptKeyEvent end"); + return panda::JSValueRef::Undefined(vm); +} + +ArkUINativeModuleValue WebBridge::ResetOnInterceptKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo) +{ + EcmaVM* vm = runtimeCallInfo->GetVM(); + CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr)); + Local firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0); + auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); + GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptKeyEventCallBack(nativeNode); + return panda::JSValueRef::Undefined(vm); +} + } // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.h b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.h index aa4753695e2..b6da9683078 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.h @@ -177,6 +177,8 @@ public: static ArkUINativeModuleValue ResetOnConfirm(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue SetOnPrompt(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue ResetOnPrompt(ArkUIRuntimeCallInfo* runtimeCallInfo); + static ArkUINativeModuleValue SetOnInterceptKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo); + static ArkUINativeModuleValue ResetOnInterceptKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo); }; } // namespace OHOS::Ace::NG #endif \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/web/web_model_ng.cpp b/frameworks/core/components_ng/pattern/web/web_model_ng.cpp index 41c9155be14..ebd41775ad7 100644 --- a/frameworks/core/components_ng/pattern/web/web_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/web/web_model_ng.cpp @@ -2128,4 +2128,15 @@ void WebModelNG::SetOnPrompt(FrameNode* frameNode, std::functionSetOnCommonDialogEvent(std::move(uiCallback), static_cast(dialogEventType)); } + +void WebModelNG::SetOnInterceptKeyEvent( + FrameNode* frameNode, std::function&& keyEventInfo) +{ + TAG_LOGE(AceLogTag::ACE_WEB, " WebModelNG::SetOnInterceptKeyEvent 5"); + auto webEventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub(); + CHECK_NULL_VOID(webEventHub); + + TAG_LOGE(AceLogTag::ACE_WEB, " WebModelNG::SetOnInterceptKeyEvent 6"); + webEventHub->SetOnPreKeyEvent(std::move(keyEventInfo)); +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/web/web_model_ng.h b/frameworks/core/components_ng/pattern/web/web_model_ng.h index 9eb7ce4ff51..c8f57f0d542 100644 --- a/frameworks/core/components_ng/pattern/web/web_model_ng.h +++ b/frameworks/core/components_ng/pattern/web/web_model_ng.h @@ -332,6 +332,8 @@ public: FrameNode* frameNode, std::function&& jsCallback, int dialogEventType); static void SetOnPrompt( FrameNode* frameNode, std::function&& jsCallback, int dialogEventType); + static void SetOnInterceptKeyEvent( + FrameNode* frameNode, std::function&& keyEventInfo); }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_WEB_WEB_MODEL_NG_H diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index 1c1a4787b05..5ceeed201ed 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -4695,6 +4695,8 @@ struct ArkUIWebModifier { void (*resetOnConfirmCallBack)(ArkUINodeHandle node); void (*setOnPromptCallBack)(ArkUINodeHandle node, void* callback); void (*resetOnPromptCallBack)(ArkUINodeHandle node); + void (*setOnInterceptKeyEventCallBack)(ArkUINodeHandle node, void* callback); + void (*resetOnInterceptKeyEventCallBack)(ArkUINodeHandle node); }; struct ArkUIBlankModifier { diff --git a/frameworks/core/interfaces/cjui/cjui_api.h b/frameworks/core/interfaces/cjui/cjui_api.h index 7f2b75309d8..77ca949c84d 100644 --- a/frameworks/core/interfaces/cjui/cjui_api.h +++ b/frameworks/core/interfaces/cjui/cjui_api.h @@ -2065,6 +2065,8 @@ struct CJUIWebModifier { void (*resetOnConfirmCallBack)(ArkUINodeHandle node); void (*setOnPromptCallBack)(ArkUINodeHandle node, void* callback); void (*resetOnPromptCallBack)(ArkUINodeHandle node); + void (*setOnInterceptKeyEventCallBack)(ArkUINodeHandle node, void* callback); + void (*resetOnInterceptKeyEventCallBack)(ArkUINodeHandle node); }; struct CJUIBlankModifier { diff --git a/frameworks/core/interfaces/native/node/web_modifier.cpp b/frameworks/core/interfaces/native/node/web_modifier.cpp index a6755dcba93..6d7e27b5800 100644 --- a/frameworks/core/interfaces/native/node/web_modifier.cpp +++ b/frameworks/core/interfaces/native/node/web_modifier.cpp @@ -1605,6 +1605,56 @@ void ResetOnPromptCallBack(ArkUINodeHandle node) WebModelNG::SetOnPrompt(frameNode, nullptr, DialogEventType::DIALOG_EVENT_PROMPT); } +void SetOnInterceptKeyEventCallBack(ArkUINodeHandle node, void* extraParam) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + int32_t nodeId = frameNode->GetId(); + TAG_LOGE(AceLogTag::ACE_WEB, " Web modifier SetOnInterceptKeyEventCallBack entry nodeid=%{public}d, extraParam=%{public}p", nodeId, extraParam); + auto onKeyEvent = [frameNode, nodeId, extraParam](KeyEventInfo& info) -> bool { + TAG_LOGE(AceLogTag::ACE_WEB, " Web modifier SetOnInterceptKeyEventCallBack onKeyEvent keycode=%{public}d, type=%{public}d", + static_cast(info.GetKeyCode()), static_cast(info.GetKeyType())); + ArkUINodeEvent event; + event.kind = ArkUIEventCategory::KEY_INPUT_EVENT; + event.nodeId = nodeId; + event.extraParam = reinterpret_cast(extraParam); + event.keyEvent.subKind = ArkUIEventSubKind::ON_KEY_EVENT; + event.keyEvent.type = static_cast(info.GetKeyType()); + event.keyEvent.keyCode = static_cast(info.GetKeyCode()); + event.keyEvent.keyText = info.GetKeyText(); + event.keyEvent.keySource = static_cast(info.GetKeySource()); + event.keyEvent.deviceId = info.GetDeviceId(); + event.keyEvent.unicode = info.GetUnicode(); + event.keyEvent.timestamp = static_cast(info.GetTimeStamp().time_since_epoch().count()); + // modifierkeystates + event.keyEvent.modifierKeyState = NodeModifier::CalculateModifierKeyState(info.GetPressedKeyCodes()); + + std::vector pressKeyCodeList; + auto pressedKeyCodes = info.GetPressedKeyCodes(); + event.keyEvent.keyCodesLength = static_cast(pressedKeyCodes.size()); + for (auto it = pressedKeyCodes.begin(); it != pressedKeyCodes.end(); it++) { + pressKeyCodeList.push_back(static_cast(*it)); + } + event.keyEvent.pressedKeyCodes = pressKeyCodeList.data(); + event.keyEvent.intentionCode = static_cast(info.GetKeyIntention()); + + PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode)); + SendArkUISyncEvent(&event); + info.SetStopPropagation(event.keyEvent.stopPropagation); + TAG_LOGE(AceLogTag::ACE_WEB, " Web modifier SetOnInterceptKeyEventCallBack onKeyEvent event.keyEvent.isConsumed=%{public}d", event.keyEvent.isConsumed); + return event.keyEvent.isConsumed; + }; + TAG_LOGE(AceLogTag::ACE_WEB, " Web modifier SetOnInterceptKeyEventCallBack onKeyEvent out"); + WebModelNG::SetOnInterceptKeyEvent(frameNode, onKeyEvent); +} + +void ResetOnInterceptKeyEventCallBack(ArkUINodeHandle node) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + WebModelNG::SetOnInterceptKeyEvent(frameNode, nullptr); +} + namespace NodeModifier { const ArkUIWebModifier* GetWebModifier() { @@ -1770,6 +1820,8 @@ const ArkUIWebModifier* GetWebModifier() .resetOnConfirmCallBack = ResetOnConfirmCallBack, .setOnPromptCallBack = SetOnPromptCallBack, .resetOnPromptCallBack = ResetOnPromptCallBack, + .setOnInterceptKeyEventCallBack = SetOnInterceptKeyEventCallBack, + .resetOnInterceptKeyEventCallBack = ResetOnInterceptKeyEventCallBack, }; CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line return &modifier; @@ -1939,6 +1991,8 @@ const CJUIWebModifier* GetCJUIWebModifier() .resetOnConfirmCallBack = ResetOnConfirmCallBack, .setOnPromptCallBack = SetOnPromptCallBack, .resetOnPromptCallBack = ResetOnPromptCallBack, + .setOnInterceptKeyEventCallBack = SetOnInterceptKeyEventCallBack, + .resetOnInterceptKeyEventCallBack = ResetOnInterceptKeyEventCallBack, }; CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line return &modifier; -- Gitee