diff --git a/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts b/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts index 2d9d2366981fdc3cf19ea2e0f95d403ba3d58ba0..543f9d5f0643cf286a702a362e24733c80ecb982 100644 --- a/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts +++ b/frameworks/bridge/declarative_frontend/ark_component/src/ArkClassDefine.ts @@ -1100,6 +1100,27 @@ class ArkNestedScrollOptions { } } +class ArkNestedScrollOptionsExt { + scrollUp: NestedScrollMode | undefined; + scrollDown: NestedScrollMode | undefined; + scrollLeft: NestedScrollMode | undefined; + scrollRight: NestedScrollMode | undefined; + constructor() { + this.scrollUp = undefined; + this.scrollDown = undefined; + this.scrollLeft = undefined; + this.scrollRight = undefined; + } + isEqual(another: ArkNestedScrollOptionsExt): boolean { + return ( + (this.scrollUp === another.scrollUp) && + (this.scrollDown === another.scrollDown) && + (this.scrollLeft === another.scrollLeft) && + (this.scrollRight === another.scrollRight) + ); + } +} + class ArkConstraintSizeOptions { minWidth?: Length | undefined; maxWidth?: Length | undefined; diff --git a/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts b/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts index 4b5e9f5ca922d5fa517eaf14bad9d7cdf18cd4bb..135ba959e528099cff8ec8c7e2e28fd06a6a1294 100644 --- a/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts +++ b/frameworks/bridge/declarative_frontend/ark_component/src/ArkWeb.ts @@ -1044,9 +1044,9 @@ class WebOnFullScreenEnterModifier extends ModifierWithKey<(event: { handler: Fu static identity: Symbol = Symbol('webOnFullScreenEnterModifier'); applyPeer(node: KNode, reset: boolean): void { if (reset) { - getUINativeModule().web.resetOnWindowNew(node); + getUINativeModule().web.resetOnFullScreenEnter(node); } else { - getUINativeModule().web.setOnWindowNew(node, this.value); + getUINativeModule().web.setOnFullScreenEnter(node, this.value); } } } @@ -1107,6 +1107,22 @@ class WebOnPromptModifier extends ModifierWithKey<(url: string, message: string, } } +class WebNestedScrollModifier extends ModifierWithKey< ArkNestedScrollOptionsExt> { + constructor(value: ArkNestedScrollOptionsExt) { + super(value); + } + static identity: Symbol = Symbol('webNestedScrollModifier'); + applyPeer(node: KNode, reset: boolean): void { + if (reset) { + getUINativeModule().web.resetNestedScroll(node); + } else { + getUINativeModule().web.setNestedScroll(node, this.value.scrollUp, this.value.scrollDown, + this.value.scrollLeft, this.value.scrollRight); + } + } + + } + class ArkWebComponent extends ArkComponent implements WebAttribute { constructor(nativePtr: KNode, classType?: ModifierType) { super(nativePtr, classType); @@ -1504,8 +1520,24 @@ class ArkWebComponent extends ArkComponent implements WebAttribute { } return this; } - nestedScroll(value: NestedScrollOptions): this { - throw new Error('Method not implemented.'); + nestedScroll(value: NestedScrollOptionsExt): this { + let options = new ArkNestedScrollOptionsExt(); + if (value) { + if (value.scrollUp) { + options.scrollUp = value.scrollUp; + } + if (value.scrollDown) { + options.scrollDown = value.scrollDown; + } + if (value.scrollLeft) { + options.scrollLeft = value.scrollLeft; + } + if (value.scrollRight) { + options.scrollRight = value.scrollRight; + } + modifierWithKey(this._modifiersWithKeys, WebNestedScrollModifier.identity, WebNestedScrollModifier, options); + } + return this; } onOverrideUrlLoading(callback: OnOverrideUrlLoadingCallback): this { throw new Error('Method not implemented.'); diff --git a/frameworks/bridge/declarative_frontend/engine/arkComponent.js b/frameworks/bridge/declarative_frontend/engine/arkComponent.js index e85a1108390feb10eb4f0817f6198444a8d360be..84f4d295aad98b59247bcbcf915d83d578830b4b 100755 --- a/frameworks/bridge/declarative_frontend/engine/arkComponent.js +++ b/frameworks/bridge/declarative_frontend/engine/arkComponent.js @@ -19179,6 +19179,22 @@ class ArkNestedScrollOptions { return ((this.scrollForward === another.scrollForward) && (this.scrollBackward === another.scrollBackward)); } } +class ArkNestedScrollOptionsExt { + constructor() { + this.scrollUp = undefined; + this.scrollDown = undefined; + this.scrollLeft = undefined; + this.scrollRight = undefined; + } + isEqual(another) { + return ( + (this.scrollUp === another.scrollUp) && + (this.scrollDown === another.scrollDown) && + (this.scrollLeft === another.scrollLeft) && + (this.scrollRight === another.scrollRight) + ); + } +} class ArkConstraintSizeOptions { constructor() { this.minWidth = undefined; @@ -30446,7 +30462,23 @@ class ArkWebComponent extends ArkComponent { return this; } nestedScroll(value) { - throw new Error('Method not implemented.'); + let options = new ArkNestedScrollOptionsExt(); + if (value) { + if (value.scrollUp) { + options.scrollUp = value.scrollUp; + } + if (value.scrollDown) { + options.scrollDown = value.scrollDown; + } + if (value.scrollLeft) { + options.scrollLeft = value.scrollLeft; + } + if (value.scrollRight) { + options.scrollRight = value.scrollRight; + } + modifierWithKey(this._modifiersWithKeys, WebNestedScrollModifier.identity, WebNestedScrollModifier, options); + } + return this; } onOverrideUrlLoading(callback) { throw new Error('Method not implemented.'); @@ -31625,6 +31657,21 @@ class WebOnPromptModifier extends ModifierWithKey { } WebOnPromptModifier.identity = Symbol('webOnPromptModifier'); +class WebNestedScrollModifier extends ModifierWithKey { + constructor(value) { + super(value); + } + applyPeer(node, reset) { + if (reset) { + getUINativeModule().web.resetNestedScroll(node); + } + else { + getUINativeModule().web.setNestedScroll(node, this.value.scrollUp, this.value.scrollDown, + this.value.scrollLeft, this.value.scrollRight); + } + } +} + // @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 740aa9b0d32c621e790afbf8640f06ab9b20c2e5..616163945f58bce48c85323ed6194ece0ba51f3b 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, "setNestedScroll"), + panda::FunctionRef::New(const_cast(vm), WebBridge::SetNestedScroll)); + web->Set(vm, panda::StringRef::NewFromUtf8(vm, "resetNestedScroll"), + panda::FunctionRef::New(const_cast(vm), WebBridge::ResetNestedScroll)); 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 632fe35ac6e1a4ac00a58ea9d4b840c4fc9d1e0b..80c3f73f385d6ae1388401a9c0e9be7617301de1 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 @@ -25,6 +25,8 @@ namespace OHOS::Ace::NG { constexpr int32_t CALL_ARG_0 = 0; constexpr int32_t CALL_ARG_1 = 1; constexpr int32_t CALL_ARG_2 = 2; +constexpr int32_t CALL_ARG_3 = 3; +constexpr int32_t CALL_ARG_4 = 4; constexpr char END_CHAR = '\0'; ArkUINativeModuleValue WebBridge::SetJavaScriptAccess(ArkUIRuntimeCallInfo* runtimeCallInfo) @@ -2809,4 +2811,54 @@ ArkUINativeModuleValue WebBridge::ResetOnPrompt(ArkUIRuntimeCallInfo* runtimeCal return panda::JSValueRef::Undefined(vm); } +ArkUINativeModuleValue WebBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo) +{ + EcmaVM* vm = runtimeCallInfo->GetVM(); + CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr)); + Local nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0); + Local scrollUpValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1); + Local scrollDownValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_2); + Local scrollLeftValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_3); + Local scrollRightValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_4); + CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm)); + auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value()); + int32_t up = static_cast(NestedScrollMode::SELF_ONLY); + int32_t down = static_cast(NestedScrollMode::SELF_ONLY); + int32_t left = static_cast(NestedScrollMode::SELF_ONLY); + int32_t right = static_cast(NestedScrollMode::SELF_ONLY); + ArkTSUtils::ParseJsInteger(vm, scrollUpValue, up); + if (up < static_cast(NestedScrollMode::SELF_ONLY) || + up > static_cast(NestedScrollMode::PARALLEL)) { + up = static_cast(NestedScrollMode::SELF_FIRST); + } + ArkTSUtils::ParseJsInteger(vm, scrollDownValue, down); + if (down < static_cast(NestedScrollMode::SELF_ONLY) || + down > static_cast(NestedScrollMode::PARALLEL)) { + down = static_cast(NestedScrollMode::SELF_FIRST); + } + ArkTSUtils::ParseJsInteger(vm, scrollLeftValue, left); + if (left < static_cast(NestedScrollMode::SELF_ONLY) || + left > static_cast(NestedScrollMode::PARALLEL)) { + left = static_cast(NestedScrollMode::SELF_FIRST); + } + ArkTSUtils::ParseJsInteger(vm, scrollRightValue, right); + if (right < static_cast(NestedScrollMode::SELF_ONLY) || + right > static_cast(NestedScrollMode::PARALLEL)) { + right = static_cast(NestedScrollMode::SELF_FIRST); + } + GetArkUINodeModifiers()->getWebModifier()->setWebNestedScrollExt(nativeNode, up, down, left, right); + return panda::JSValueRef::Undefined(vm); +} + +ArkUINativeModuleValue WebBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo) +{ + EcmaVM* vm = runtimeCallInfo->GetVM(); + CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr)); + Local nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0); + CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm)); + auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value()); + GetArkUINodeModifiers()->getWebModifier()->resetWebNestedScrollExt(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 aa4753695e2fe20ac1234e3cdf6d5f70363c7149..c4fb370a762c3f8ffb79353485d09fae2ceedf95 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 SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo); + static ArkUINativeModuleValue ResetNestedScroll(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 41c9155be148a05361fca4507d802bf48f64d0f3..8f7ae158119d0e1ee50dc4f9dbff46d4535f2e5d 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,12 @@ void WebModelNG::SetOnPrompt(FrameNode* frameNode, std::functionSetOnCommonDialogEvent(std::move(uiCallback), static_cast(dialogEventType)); } + +void WebModelNG::SetNestedScrollExt(FrameNode* frameNode, const NestedScrollOptionsExt& nestedOpt) +{ + CHECK_NULL_VOID(frameNode); + auto webPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); + CHECK_NULL_VOID(webPattern); + webPattern->SetNestedScrollExt(nestedOpt); +} } // 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 9eb7ce4ff5135a019168b5bc82277a375962421d..1b96eaaa7fd1c5be4232b84f5f12f84d3ddbb26f 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,7 @@ public: FrameNode* frameNode, std::function&& jsCallback, int dialogEventType); static void SetOnPrompt( FrameNode* frameNode, std::function&& jsCallback, int dialogEventType); + static void SetNestedScrollExt(FrameNode* frameNode, const NestedScrollOptionsExt& nestedOpt); }; } // 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 1c1a4787b055283e3818e20affb68b8a050da39f..1b25d4650ae2d344e8df891bf53484736837d68d 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -4695,6 +4695,9 @@ struct ArkUIWebModifier { void (*resetOnConfirmCallBack)(ArkUINodeHandle node); void (*setOnPromptCallBack)(ArkUINodeHandle node, void* callback); void (*resetOnPromptCallBack)(ArkUINodeHandle node); + void (*setWebNestedScrollExt)(ArkUINodeHandle node, ArkUI_Int32 scrollUp, ArkUI_Int32 scrollDown, + ArkUI_Int32 scrollLeft, ArkUI_Int32 scrollRight); + void (*resetWebNestedScrollExt)(ArkUINodeHandle node); }; struct ArkUIBlankModifier { diff --git a/frameworks/core/interfaces/cjui/cjui_api.h b/frameworks/core/interfaces/cjui/cjui_api.h index 7f2b75309d886a64867878adefce610e3992501b..c76eb6b4c6696dccf28a8e12f28121c33b679ab7 100644 --- a/frameworks/core/interfaces/cjui/cjui_api.h +++ b/frameworks/core/interfaces/cjui/cjui_api.h @@ -2065,6 +2065,9 @@ struct CJUIWebModifier { void (*resetOnConfirmCallBack)(ArkUINodeHandle node); void (*setOnPromptCallBack)(ArkUINodeHandle node, void* callback); void (*resetOnPromptCallBack)(ArkUINodeHandle node); + void (*setWebNestedScrollExt)(ArkUINodeHandle node, ArkUI_Int32 scrollUp, ArkUI_Int32 scrollDown, + ArkUI_Int32 scrollLeft, ArkUI_Int32 scrollRight); + void (*resetWebNestedScrollExt)(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 a6755dcba9315c6eae3d95910c5cf5abe47ce271..43eb36a8ba39d034e5365bde0b3fe70e0c5d155a 100644 --- a/frameworks/core/interfaces/native/node/web_modifier.cpp +++ b/frameworks/core/interfaces/native/node/web_modifier.cpp @@ -1605,6 +1605,40 @@ void ResetOnPromptCallBack(ArkUINodeHandle node) WebModelNG::SetOnPrompt(frameNode, nullptr, DialogEventType::DIALOG_EVENT_PROMPT); } +void SetWebNestedScrollExt( + ArkUINodeHandle node, ArkUI_Int32 scrollUp, ArkUI_Int32 scrollDown, ArkUI_Int32 scrollLeft, ArkUI_Int32 scrollRight) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + NestedScrollOptionsExt nestedOpt = { + .scrollUp = NestedScrollMode::SELF_FIRST, + .scrollDown = NestedScrollMode::SELF_FIRST, + .scrollLeft = NestedScrollMode::SELF_FIRST, + .scrollRight = NestedScrollMode::SELF_FIRST, + }; + TAG_LOGE(AceLogTag::ACE_WEB, "whz WebBridge::SetNestedScroll scrollUp: %{public}d", scrollUp); + TAG_LOGE(AceLogTag::ACE_WEB, "whz WebBridge::SetNestedScroll scrollDown: %{public}d", scrollDown); + TAG_LOGE(AceLogTag::ACE_WEB, "whz WebBridge::SetNestedScroll scrollLeft: %{public}d", scrollLeft); + TAG_LOGE(AceLogTag::ACE_WEB, "whz WebBridge::SetNestedScroll scrollRight: %{public}d", scrollRight); + nestedOpt.scrollUp = static_cast(scrollUp); + nestedOpt.scrollDown = static_cast(scrollDown); + nestedOpt.scrollLeft = static_cast(scrollLeft); + nestedOpt.scrollRight = static_cast(scrollRight); + WebModelNG::SetNestedScrollExt(frameNode, nestedOpt); +} + +void ResetWebNestedScrollExt(ArkUINodeHandle node) +{ + auto* frameNode = reinterpret_cast(node); + CHECK_NULL_VOID(frameNode); + const NestedScrollOptionsExt nestedOpt = { + .scrollUp = NestedScrollMode::SELF_FIRST, + .scrollDown = NestedScrollMode::SELF_FIRST, + .scrollLeft = NestedScrollMode::SELF_FIRST, + .scrollRight = NestedScrollMode::SELF_FIRST, + }; + WebModelNG::SetNestedScrollExt(frameNode, nestedOpt); +} namespace NodeModifier { const ArkUIWebModifier* GetWebModifier() { @@ -1770,6 +1804,8 @@ const ArkUIWebModifier* GetWebModifier() .resetOnConfirmCallBack = ResetOnConfirmCallBack, .setOnPromptCallBack = SetOnPromptCallBack, .resetOnPromptCallBack = ResetOnPromptCallBack, + .setWebNestedScrollExt = SetWebNestedScrollExt, + .resetWebNestedScrollExt = ResetWebNestedScrollExt, }; CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line return &modifier; @@ -1939,6 +1975,8 @@ const CJUIWebModifier* GetCJUIWebModifier() .resetOnConfirmCallBack = ResetOnConfirmCallBack, .setOnPromptCallBack = SetOnPromptCallBack, .resetOnPromptCallBack = ResetOnPromptCallBack, + .setWebNestedScrollExt = SetWebNestedScrollExt, + .resetWebNestedScrollExt = ResetWebNestedScrollExt, }; CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line return &modifier; diff --git a/test/unittest/core/pattern/web/web_model_test_ng.cpp b/test/unittest/core/pattern/web/web_model_test_ng.cpp index 71313cf3e28994c85aedf9858f91ad16f92156b0..d8683c2007b3f61b22fea55121dfc078eca2ab3a 100644 --- a/test/unittest/core/pattern/web/web_model_test_ng.cpp +++ b/test/unittest/core/pattern/web/web_model_test_ng.cpp @@ -3769,4 +3769,29 @@ HWTEST_F(WebModelTestNg, SetOverScrollMode007, TestSize.Level1) EXPECT_TRUE(callbackCalled); #endif } + + /** + * @tc.name: SetNestedScrollExt022 + * @tc.desc: Test web_model_ng.cpp + * @tc.type: FUNC + */ +HWTEST_F(WebModelTestNg, SetNestedScrollExt022, TestSize.Level1) +{ +#ifdef OHOS_STANDARD_SYSTEM + auto* stack = ViewStackProcessor::GetInstance(); + auto nodeId = stack->ClaimNodeId(); + auto frameNode = + FrameNode::GetOrCreateFrameNode(V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(frameNode, nullptr); + stack->Push(frameNode); + + WebModelNG webModelNG; + NestedScrollOptionsExt NestedScrollOptionsExt = {}; + NestedScrollOptionsExt.scrollUp = NestedScrollMode::SELF_FIRST; + webModelNG.SetNestedScrollExt(AccessibilityManager::RawPtr(frameNode), NestedScrollOptionsExt); + + auto webPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); + EXPECT_EQ(webPattern->nestedScroll_.scrollUp, NestedScrollMode::SELF_FIRST); +#endif +} } // namespace OHOS::Ace::NG